| 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 Répondre à oupsman | 6 saphira5, le 9 oct 2008 à 14:25:47Je 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. Répondre à 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;
} Répondre à oupsman | 10 saphira5, le 9 oct 2008 à 15:52:26Je n'ai rien d'afficher. et toi? Répondre à saphira5 | Normal, dans ton programme il n'es tnul part indiqué qu'il faut afficher quoi que ce soit MDR ;-D Répondre à oupsman | 12 saphira5, le 9 oct 2008 à 15:57:22Dans la partie PuzzleFini, si la condition n'est pas remplie, un affichage s'effectue. Répondre à saphira5 | Essaies ça et tu vas rigoler ;-)
#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){
printf("\nIci Y vaut %d, et %d est bien different de 3, donc il est normal qu'il ne passe pas par else lol\n",Y,Y);
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;
} Répondre à oupsman | 14 saphira5, le 9 oct 2008 à 16:08:12Pourtant au fur et à mesure du programme Y est incrémenté donc il doit bien passer par else au bout d'un moment. Répondre à saphira5 | Bah non, puisqu'avant la fin de ton programme, tu as écris :
int main(){
...
...
...
Y=0; /*ICI TU AS INITIALISÉ Y à 0*/
K=0;
PuzzleFini();
getchar();
return 0;
} Répondre à oupsman | 16 saphira5, le 9 oct 2008 à 16:16:19Y=0 alors on va à RestePiéce() et quand Y sera = à 3 alors on fera Affichage(). Répondre à saphira5 | Je sais pas car je ne comprend rien de rien dans ton programme, j'ai juste débbugué. Pour la conception et erreur de raisonnement, c'est à toi de gérer.
Dans ton programme j'explique ce que tu lui demande de faire :
int main(){
.....
.........
ici je fais pleins de trucs;
ensuite j'initialise Y=0; et K=0;
ensuite je fais appel à PuzzleFini();
et je sors du programme;
}
si tu veux que Y bouge, il faut faire :
int main(){
.....
.........
ici je fais pleins de trucs;
je fais bouger Y;
ensuite je fais appel à PuzzleFini();
et je sors du programme;
}
ou sinon :
int main(){
.....
.........
ici je fais pleins de trucs;
ensuite j'initialise Y=0; et K=0;
ensuite je fais appel à PuzzleFini(); /*mais dans cette fonction tu fais bouger Y avant le teste*/
et je sors du programme;
} Répondre à oupsman |
| 18 saphira5, le 9 oct 2008 à 16:29:46Je pensais qu'à chaque fois que je rentrais dans puzzlefini,
je repartais vers restepiece sauf si Y=3. Et là l'affichage se faisait. Répondre à saphira5 |
| 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 !!!! Répondre à oupsman |
| 20 saphira5, le 9 oct 2008 à 16:43:15Merci beaucoup. Je vais essayer mais je crois que l'erreur était là. Je te redis ca. Merci Répondre à saphira5 |
| 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 ;-) Répondre à oupsman |
|
|
|
|
|
|
|
|
|
|