Bonjour,
Aujourd'hui j'ai eu un programme a faire sur le mouvement brownien.
L'ors de la compilation tout se passe bien, je lance le programme et la:
Segmentation fault
et je sais pas pourquoi.
Voici mon programme
/* Marche aleatoire */
main()
{
//ouverture dun fichier ou on va ecriee les resultats
FILE *file;
//ouverture second fichier ou ily a les valeurs moyennes
FILE *file2;
/*n= nb de pas, i=1,..,n x,y coords spatailes*/
int i,n,j,m; //j numereau de marche
double a,b,x,y,rmcarre[m],rcarre; // a,b=nbs aleatoires rmcarre[m] rcarre
// graine de generateur aleatoire
srand48 (time(NULL));
//initialisation du porbleme
n=1000;
m=1000;
x=0.0;
y=0.0;
// 1er boucle initialisation rcarre
for (i=0; i<n; i++)
{
rmcarre[i]=0.0;
}
//debut seonde boucle avec j tes grose boucle
for (j=1; j<m; j++)
{
x=0.0;
y=0.0;
//debut seconde boucle
for (i=0; i<=n; i++)
{
a=drand48();
b=drand48();
//pour x
if (a>0.0 && a<0.25) {x=x-1;}
if (a>0.25 && a<0.5) {x=x+1;}
if (0.5<a && a<=1) {x=x;}
//pour y
if (0<b && b<=0.25) {y=y+1;}
if (0.25<b && b<=0.5) {y=y+1;}
if (0.5<b && b>=1) {y=y;}
rcarre=x*x + y*y;
rmcarre[i] = rmcarre[i] + rcarre;
} //fin second for i
}// fin premier forj
file2=fopen("rcarre1.dat","w");
for (i=1;i<n;i++) {
fprintf(file2,"%d %lf \n",i,rmcarre[i]/m);
}
//fclose(file);
//fclose(file2);
}
Merci d'avance
Et si tu utilisais un débogueur pour savoir où ça segfaulte ?
Si tu nous donnes plus de détails sur ton environnement de travail, on pourra t'aider dans le débogage.
mmh ça m'étonne meme que ça compile, je croyais qu'on ne pouvais pas déclarer de tableau de taille inconnue a priori avec des instructions du genre :
rmcarre[m]; // m etant indeterminé a ce moment là
commence par regarder de ce coté là.
Sinon qq conseils pour la suite:
- colle ton code sur un site comme ça la prochaine fois
http://pastebin.com/
C'est quand emem plus simple a lire http://pastebin.com/jQXB8sVs
- utilise gdb pour trouver d'ou vienne tes segfault (option -g lors de la compilation) ça te donne meme la ligne de code fautive
merci de faut reponse je connaissais pas le site pour voir le code thx.
pour compiler je fait gcc nomfcihier -g ??
guyver2 : si, on peut faire ça dans la dernière norme du C. Après, il faut avoir confiance en son compilateur. ![]()
alizrock : oui, et ensuite tu lances
gdb ./ton_programme
puis
run
et une fois que ça a segfaulté
bt full
histoire de bien voir où ça coince.
alors apres ta petit manip Chris jai
http://pastebin.com/E1m25Rw5
sinon jai une correction de prog mais je vois pas pourquoi le mien marche pas
http://pastebin.com/ceM60wKu
Je résumerai en "in main () at rwm2d.c:31".
Et si tu allais voir la ligne 31 de ton fichier ? ![]()
Relis un peu tes commentaires aussi, certains n'ont aucun sens ou sont tout simplement illisibles ![]()
(cela dit, j'y vois rien à la ligne 31)
En revanche, je t'invite à regarder dans le blanc des yeux les lignes 26, 36, et 64. J'aime pas beaucoup le coup du parcours de tableau de 3 façons différentes. ![]()
a oui je dois vous expliquer, je vais de la simulation pour la physique et les profs sont des physiciens donc le c vu par eux c'est pas tres propre.
cela dis je vois pas ce qui va pas sur les lignes 26,36,64
ps: je debute en c j'ai vu que le scheme en langage
@Chris :
"si, on peut faire ça dans la dernière norme du C. Après, il faut avoir confiance en son compilateur"
de toute évidence je peux pas faire confiance au mien (gcc), ça me fout un foutoir monstre dans les variables. Apres inspection de la valeurs des variables apres leur initialisation (avant la première boucle for), j'ai n prend une valeur plus ou moins arbitraire a chaque instance du programme ; lieu de 1000 comme déclaré ligne 18.
bref tout rentre dans l'ordre en mettant
double a,b,x,y,rmcarre[1000],rcarre;
et en dé-commentant
fclose(file2);
Dernier conseil si t'es pas super a l'aise en C, compile toujours avec l'option -Wall ça te mettra en avant tous les abus de langage que tu fais ![]()
merci beaucoup vous etez geniaux
option -Wall drole de nom allons droit dans le mur
finalement ca ne regle partiellement le probleme dans la seconde colonne du tableau je nai plus que des
nan autant dire que pour faire un plot c'est mort
N'oublie pas qu'en C, un index de tableau commence a 0...
oui je sais si on lui dit 100 il commence a 0 et finit a 99 hormis sur les compilateurs mac je crois .
O_O Non pas du tout.
En fait faut se dire qu'un tableau est une succession de variable alloues en memoire quand tu le declares, et qu'en fait, l'index d'un tableau est le decallage par rapport a la premiere case, donc tu es a la case 1 + index d'ou l'index a zero pour la premiere case.
Malheureusement, quand tu depasses ne serait-ce que de une case, tu risques de Segfault, et je vois dans ton code des index superieurs a la taille des tableaux.
guyver2 : gcc sans option et non patché ne compile pas en accord avec la dernière norme du C (en tout cas, pas à ma connaissance).
alizrock: je dirais même "-Wall -Wextra" histoire d'avoir la totale.
Sinon, je faisais référence au "for(i=0; i<N; i++" VS "for(i=1; i<=N; i++)" VS "for(i=1; i<N; i++)" que j'ai croisé dans ton code. Seul le premier m'a paru correct.
Au passage, le segfault quand on dépasse un tableau c'est pas un risque mais une bénédiction (ça se débogue en 2 minutes). Le vrai risque, c'est que tu écrases d'autres valeurs utilisées par ton programme. Cela dit, il y a l'outil valgrind pour détecter ces choses là. ![]()
Pour les cas ou valgrind ne marche pas bien, on peut aussi utiliser la libduma qui s'intercalle entre le programe et malloc pour provoquer un crash explicit a chaque access memoire illegal:
http://duma.sourceforge.net/
Attention, c'est gourmand en memoire virtuelle.