Violation d'accès (erreur de segmentation)
saphira5
-
oupsman Messages postés 319 Statut Membre -
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?
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?
Configuration: Windows XP Internet Explorer 7.0
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. -
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...
-
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.- 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???
-
-
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
-
-
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;
} -
-
-
-