CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Segmentation fault ?

alizrock
alizrock
Niveau 10
12 septembre 2011 à 18:46:05

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 */

  1. include <stdio.h>
  2. include <math.h>
  3. include <time.h>
  4. include <stdlib.h>

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

chris_27
chris_27
Niveau 10
12 septembre 2011 à 18:52:08

Et si tu utilisais un débogueur pour savoir où ça segfaulte ? :hap:

Si tu nous donnes plus de détails sur ton environnement de travail, on pourra t'aider dans le débogage.

guyver2
guyver2
Niveau 10
12 septembre 2011 à 18:53:57

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

alizrock
alizrock
Niveau 10
12 septembre 2011 à 18:58:53

merci de faut reponse je connaissais pas le site pour voir le code thx.
pour compiler je fait gcc nomfcihier -g ??

chris_27
chris_27
Niveau 10
12 septembre 2011 à 18:59:30

guyver2 : si, on peut faire ça dans la dernière norme du C. Après, il faut avoir confiance en son compilateur. :-)

chris_27
chris_27
Niveau 10
12 septembre 2011 à 19:00:57

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.

alizrock
alizrock
Niveau 10
12 septembre 2011 à 19:06:12

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

chris_27
chris_27
Niveau 10
12 septembre 2011 à 19:11:46

Je résumerai en "in main () at rwm2d.c:31".

Et si tu allais voir la ligne 31 de ton fichier ? :hap:

tbop2
tbop2
Niveau 10
12 septembre 2011 à 19:15:21

Relis un peu tes commentaires aussi, certains n'ont aucun sens ou sont tout simplement illisibles :ok:

chris_27
chris_27
Niveau 10
12 septembre 2011 à 19:16:16

(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. :-)

alizrock
alizrock
Niveau 10
12 septembre 2011 à 19:21:01

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

guyver2
guyver2
Niveau 10
12 septembre 2011 à 19:40:50

@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 :)

alizrock
alizrock
Niveau 10
12 septembre 2011 à 19:53:27

merci beaucoup vous etez geniaux
option -Wall drole de nom allons droit dans le mur

alizrock
alizrock
Niveau 10
12 septembre 2011 à 20:01:56

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

Nightmarez
Nightmarez
Niveau 9
13 septembre 2011 à 09:30:56

N'oublie pas qu'en C, un index de tableau commence a 0...

alizrock
alizrock
Niveau 10
13 septembre 2011 à 09:49:49

oui je sais si on lui dit 100 il commence a 0 et finit a 99 hormis sur les compilateurs mac je crois .

Nightmarez
Nightmarez
Niveau 9
13 septembre 2011 à 11:12:56

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.

chris_27
chris_27
Niveau 10
13 septembre 2011 à 13:10:14

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à. :-)

godrik
godrik
Niveau 30
13 septembre 2011 à 15:29:02

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.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment