Violation d'accès (erreur de segmentation)

saphira5 -  
oupsman Messages postés 319 Statut Membre -
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?

3 réponses

;)
 
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.
0
saphira5
 
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.
0
;)
 
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...
0
saphira5
 
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.
0
;) > saphira5
 
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.
0
saphira5 > ;)
 
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???
0
oupsman Messages postés 319 Statut Membre 10
 
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
0
saphira5
 
Je n'utilise pas de pointeur. J'assigne un entier à un emplacement d'un tableau d'entiers(par coordonnées). C'est pour ca que je ne comprends pas.
0
oupsman Messages postés 319 Statut Membre 10 > saphira5
 
Essaies ce programme, il marche chez moi, dis-nous s'il y a un problème :

#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);
}

/**************************************************************************/
/**************************************************************************/
int 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();
return 0;
}
0
saphira5 > oupsman Messages postés 319 Statut Membre
 
Je n'ai rien d'afficher. et toi?
0
oupsman Messages postés 319 Statut Membre 10 > saphira5
 
normal, dans ton programme il n'es tnul part indiqué qu'il faut afficher quoi que ce soit MDR ;-D
0
saphira5 > oupsman Messages postés 319 Statut Membre
 
Dans la partie PuzzleFini, si la condition n'est pas remplie, un affichage s'effectue.
0