Problème d'éxécution du programme

Fermé
-bubu- - 23 déc. 2007 à 22:37
 le père - 23 déc. 2007 à 23:42
Bonjour,
Je dois mettre au point un programme des 8 reines, pour ceux qui ne connaissent pas c'est construire une programme qui sortira les 92 solutions de placer 8 reines sur un échiquier 8x8 sans qu'elles se détruisent.

Alors j'ai d'abord réfléchi à la résolution sur papier puis je l'ai traduite en C++.
Bilan :
-logique => ok (enfin je pense^^)
-error 0 => ok
-Warning 0 => ok

MAIS, parce qu'i y a un mais, le progamme ne s'éxécute pas !

=> une fenêtre s'ouvre :
-8Reines.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.

Voici mon programme


#include <iostream.h>

int placement(int*n, int*i,bool echec[8][8],int*reine_avant,int*nbr_reine,int*sol){

int a=*n,c=*n,b=*i,d=*i;
bool echec_temp[8][8];
char rep='x';

for(int j=0;j<8;j++){
for(int k=0;k<8;k++)
echec_temp[j][k]=echec[j][k];
}

if(echec[*n][*i]!=0){
do{
a++;
b++;
echec[a][b]=0; //zero sur diagonale
echec[a][*i]=0; //zero sur verticale
echec[*n][b]=0; //zero sur horizontale
}
while(a<8 && b<8);

do{
c--;
d--;
echec[c][d]=0; //zero sur diagonale
echec[a][*i]=0; //zero sur verticale
echec[*n][b]=0; //zero sur horizontale
}
while(c>0 && d>0);
echec[*n][*i]=1; //on place la reine
*reine_avant=*n; //garde en mémoire la ligne ou se trouve la reine
*nbr_reine++;
return placement(0,i+1,echec,reine_avant,nbr_reine,sol); //colonne suivante ET première ligne
}

if(echec[*n][*i]==0)
return placement(n+1,i,echec,reine_avant,nbr_reine,sol); //ligne suivante

if(*n==8){ //càd une colonne de zéro
echec_temp[*reine_avant][*i-1]=0; //on retire la dernière reine placée
for(int J=0;J<8;J++){
for(int K=0;K<8;K++)
echec[J][K]=echec_temp[J][K]; //on reprend l'échiquier avant d'avoir placé la dernière reine
}
*nbr_reine--; //compteur de reine -1
return placement(reine_avant+1,i-1,echec,reine_avant,nbr_reine,sol); //colonne PRECEDENTE ET ligne suivante
}

if(*nbr_reine==8){ //affichage de la solution
*sol++;
cout<<"Solution numero : "<<*sol<<endl;
for(int r=0;r<8;r++){
for(int s=0;s<8;s++)
cout<<echec[r][s];
cout<<" "<<endl;
}
if(*sol=92){
cout<<"il n'y a plus de solution"<<endl;
return 0;
}
do{
cout<<"voulez vous une autre solution ? o/n"<<endl;
cin>>rep;
}while(rep!='o' || rep!='n');

if(rep=='o'){
echec_temp[*reine_avant][*i-1]=0; //on retire la dernière reine placée
for(int L=0;L<8;L++){
for(int M=0;M<8;M++)
echec[L][M]=echec_temp[L][M]; //on reprend l'échiquier avant d'avoir placé la dernière reine
}
*nbr_reine--;

return placement(reine_avant+1,i-1,echec,reine_avant,nbr_reine,sol);

}else{
cout<<"fin du programe"<<endl;
return 0;
}

}
}

void main(){

bool echec[8][8];
int n=0,i=0,sol=0,reine_avant,nbre_reine,variable;
placement(&n,&i,echec,&reine_avant,&nbre_reine,&sol);
variable=placement(&n,&i,echec,&reine_avant,&nbre_reine,&sol);
}



Serai-ce un problème de mémoire ? Je ne sais pas !

J'espère que vous sourez m'éclairer sur ce sujet

Merci d'avance et bonnes fêtes de fin d'année !


ps : pour info j'utilise Microsoft visual C++ comme compilateur

1 réponse

Bonjour

Je n'ai pas cherché à analyser la logique du programme. Trop compliqué pour un diamnche soir ;o)
Tu as plusieurs appels du style
placement(0,i+1,echec,reine_avant...


Mais le 1er paramètre de placement est un pointeur ! or, je suppose que le '0' et le 'i+1' que tu passes ici désignent la 1ère ligne (ou colonne) et la colonne (ou ligne) qui suit celle pointée par i


Au début de ta fonction, quand tu fais a=*n, comme tu as passé 0 pout n, tu essayes donc de donner à a la valeur pointée par NUL, ce qui ne veut rien dire et est formellement interdit.

Il faudrait faire quelque chose du genre (à toi de voir quoi exactement selon ton algorithme)

int nouveaun=0;
int iplus1 = i+1
placement(&nouveaun, &iplus1,...
0