Téléchargement
illégal
Posez votre question Signaler

Violation d'accès (erreur de segmentation)

saphira5 - Dernière réponse le 9 oct. 2008 à 16:55
Bonjour,
Mon programme C n'a pas d'erreur de compilation mais lors de l'exécution, un warning apparaît "Une violation d'accès (erreur de segmentation) est apparue dans votre programme". J'utilise Dev-c. Mon programme doit effectuer plusieurs boucles et j'ai défini les boucles par des fonctions. Le problème peut-il venir d'ici?
Lire la suite 

Violation d'accès (erreur de segmentation) »

21 réponses
Réponse
+0
moins plus
ben ouais surement que ca vient d'un problème d'indice dans un tableau.
Debug ton truc pas à pas si tu parviens pas à voir l'erreur.
saphira5 - 9 oct. 2008 à 14:13
Mon programme stocke des valeurs dans un tableau à 2 dimensions mais au bout d'un moment, il ne stocke pas la valeur mais doit la voir plutôt comme une adresse. Ma boucle principale fonctionne une à 2 foiset au passage d'après ca merde.
Ajouter un commentaire
Réponse
+0
moins plus
donc tu sais d'où vient le problème, c'est tout bon. On peut pas le résoudre sans avoir le code sous les yeux...
saphira5 - 9 oct. 2008 à 14:22
Le programme est un peu long, il permet de reconstituer un puzzle de 9 pièces carrées.

#include <stdio.h>

/*déclaration des variables*/
int a,b,c,d,i,n,w,x,y,z,I,K,X,Y;

/*déclaration des tableaux*/
int A[10],B[10],C[10],D[10],E[10],R[10];
int P[3][3];

/*Déclaration des fonctions*/
void PuzzleFini(void);
void RestePiece(void);
void PieceLibre(void);
void TestPiece(void);
void MemoPiece(void);
void EmplSuiv(void);
void EmplPreced(void);
void PiecSuiv(void);
void Affichage(void);
void pieceactive(void);
void testprincipale(void);
void etatrotation(void);


void PuzzleFini(void)
{
if (Y!=3)
{
RestePiece();
}
else
{
printf ("puzzle fini!\n");
Affichage();
printf("Le calvaire est fini.");
}
}

void RestePiece(void)
{
if (((X==0)||(X==2))&&((Y==0)||(Y==2))&&(I>3))
{
EmplPreced();
}
if ((((X==0)||(X==2))&&(Y>0)&&(Y<2)&&(I>7))||((X>0)&&(X<2)&&((Y==0)||(Y==2))&&(I>7)))
{
EmplPreced();
}
if ((X>0)&&(X<2)&&(Y>0)&&(Y<2)&&(I>9))
{
EmplPreced();
}
else
{
PieceLibre();
}
}

void PieceLibre(void)
{
if(E[I]==0)
{
TestPiece();
}
else
{
PiecSuiv();
}

}

void TestPiece(void)
{
if (X==0)
{w=1;}
else
{
i=P[X-1][Y];
n=R[i];
if (n==0)
{w=C[i];}
if (n==1)
{w=D[i];}
if (n==2)
{w=A[i];}
if (n==3)
{w=B[i];}
}

if(Y==0)
{x=1;}
else
{
i=P[X][Y-1];
n=R[i];
if (n==0)
{x=D[i];}
if (n==1)
{x=A[i];}
if (n==2)
{x=B[i];}
if (n==3)
{x=C[i];}
}

if (X==2)
{y=1;}

if (Y==2)
{z=1;}

pieceactive();
}

void pieceactive(void)
{
n=R[I];
if (n==0)
{a=A[I];b=B[I];c=C[I];d=D[I];}
if (n==1)
{a=B[I];b=C[I];c=D[I];d=A[I];}
if (n==2)
{a=C[I];b=D[I];c=A[I];d=B[I];}
if (n==3)
{a=D[I];b=A[I];c=B[I];d=C[I];}
testprincipale();
}

void testprincipale(void)
{
if ((a!=w)||(b!=x))
{
etatrotation();
}
else
{
if(Y==2)
{
if(c!=y)
{etatrotation();}
}
if(X==2)
{
if(d!=z)
{etatrotation();}
}
else
{MemoPiece();}
}
}

void etatrotation(void)
{
R[I]=R[I]+1;
if (R[I]==4)
{
R[I]=0;
PiecSuiv();
}
else
{
pieceactive();
}
}

void MemoPiece(void)
{
if ((X==0)&&(Y==0))
{P[0][0]=I+1;}
if ((X==1)&&(Y==0))
{P[1][0]=I+1;}
if ((X==2)&&(Y==0))
{P[2][0]=I+1;}
if ((X==0)&&(Y==1))
{P[0][1]=I+1;}
if ((X==1)&&(Y==1))
{P[1][1]=I+1;}
if ((X==2)&&(Y==1))
{P[2][1]=I+1;}
if ((X==0)&&(Y==2))
{P[0][2]=I+1;}
if ((X==1)&&(Y==2))
{P[1][2]=I+1;}
if ((X==2)&&(Y==2))
{P[2][2]=I+1;}
E[I]=1;
EmplSuiv();
}

void EmplSuiv(void)
{
X=X+1;
if (X>2)
{
X=0;
Y=Y+1;
}
if (((X==0)||(X==2))&&((Y==0)||(Y==2)))
{I=0;}
if ((((X==0)||(X==2))&&(Y>0)&&(Y<2))||((X>0)&&(X<2)&&((Y==0)||(Y==2))))
{I=4;}
if ((X>0)&&(X<2)&&(Y>0)&&(Y<2))
{I=8;}
PuzzleFini();
}

void EmplPreced(void)
{
X=X-1;
if (X==0)
{
X=2;
Y=Y-1;
}
I=P[X][Y]-1;
E[I]=0;
R[I]=R[I]+1;
RestePiece();
}

void PiecSuiv(void)
{
I=I+1;
RestePiece();
}

void Affichage(void)
{
printf("Tableau pieces:\n");
X=0;
Y=0;
do
{
K=P[X][Y];
printf("%d ",K);
X=X+1;
if (X>2)
{
printf("\n");
X=0;
Y=Y+1;
}
}
while(Y<3);

printf("Tableau rotation:\n");
X=0;
Y=0;
do
{
i=P[X][Y];
K=R[i];
printf("%d ",K);
X=X+1;
if (X>2)
{
printf("\n");
X=0;
Y=Y+1;
}
}
while(Y<3);
}

main()
{
X=0;
Y=0;
K=0;
I=0;
while(K<10)
{
R[K]=0;
E[K]=0;
K++;
}
while(Y<3)
{
while(X<3)
{
P[X][Y]=0;
X++;
}
if(X==3)
{
Y=Y+1;
X=0;
}
}

A[0]=1; B[0]=2; C[0]=14; D[0]=1;
A[1]=1; B[1]=1; C[1]=2; D[1]=14;
A[2]=1; B[2]=1; C[2]=3; D[2]=4;
A[3]=1; B[3]=1; C[3]=4; D[3]=3;
A[4]=1; B[4]=3; C[4]=13; D[4]=2;
A[5]=1; B[5]=4; C[5]=5; D[5]=3;
A[6]=1; B[6]=4; C[6]=13; D[6]=4;
A[7]=1; B[7]=14; C[7]=7; D[7]=2;
A[8]=5; B[8]=7; C[8]=13; D[8]=17;
A[9]=5; B[9]=7; C[9]=13; D[9]=13;

Y=0;
K=0;
PuzzleFini();
getchar();
}

Si tu as des questions sur le principe de fonctionnement, hésite pas. Encore merci.
;) - 9 oct. 2008 à 14:30
oula, perso j'ai rien pour test le prog là et à lire c'est plutôt relou (en plus pas fait de C depuis 1an au moins).
Donc debug toi même ca t'apportera plus qu'une réponse toute faite ;)

tu sais debugger? Essai d'avoir ce reflexe dès maintenant si c'est pas le cas.
saphira5 - 9 oct. 2008 à 14:38
En debuggant, il perd la destination de l'assignation et je vois bien que l'assignation ne se fait pas pourtant les valeurs de mes variables sont bonnes ce qui devrait permettre l'assignation. L'assignation s'effectue correctement sur les 2 premiers passages dans la boucle mais au troisième passage???
Ajouter un commentaire
Réponse
+0
moins plus
salut, "erreur de segmentation" veut dire qu'ily a un pointeur qui pointe là où il ne doit pas. Vérifies bien si t'aurais pas oublié d'initialiser un pointeur quelque part ou peut-ête que ton pointeur déborde un tableau .... comme ce qui est dit dans le post 1, faut voir pas à pas tes fonctions
oupsman- 9 oct. 2008 à 16:41
dis moi ce que fait la fonction PuzzleFini(); et la fonction RestePiece();

mais si j'ai bien compris, ce que tu dois faire c'est :


int main(){
....
.......
while(Y!=3) RestePiece();
PuzzleFini();
getchar();
return 0;
}


Attention, je suppose que RestePiece() fait bien bouger Y et qu'au bout d'un moment Y sera égal à 3 parce que sinon ce sera une boucle infinie !!!!
saphira5 - 9 oct. 2008 à 16:43
Merci beaucoup. Je vais essayer mais je crois que l'erreur était là. Je te redis ca. Merci
oupsman- 9 oct. 2008 à 16:55
pas de quoi, juste 2 conseils :

1/Ton programme est presque illisible, si tu as plusieurs successions de if sans else, c'est mieux d'utiliser case.

2/Au lieu de trimbaler tout le tralala de ton hypertableau, je te suggère d'utiliser un seul tableau à 2 dimensions, par exemple int T[9][9]; et si besoin de modification, tu le prend en parametre dans tes fonctions, par exemple PuzzleFini(int T[9][ ]); .... etc

Tiens nous au courant ;-)
Ajouter un commentaire
Ce document intitulé « violation d'accès (erreur de segmentation) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?