Pb ds une fonction en c++

Fermé
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 - 31 déc. 2006 à 11:43
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 - 3 janv. 2007 à 11:46
bonjour...
Je fais un programme dont la compilation se passe bien mais qui plante dès que je saisie quelque chose
Il semblerait que ce soit dans cette procédure qu'il y a une erreur :

void saisie(char car1,char car2)
{
//ona un tableau dont les colonnes vont de A à I et les lignes de J à R, car 1 et car2 désigne les coordonnées (exemple : aj, AJ, ck...)

bool position;
position=false;

do
{
cin>>car1;
cin>>car2;

if((car1>='A' && car1<='I') || (car1>='a' && car1<='i'))
{
if ((car2>='J' && car2<='R') || (car2>='j' && car2<='r'))
{
position=true;
}
}
if ((car2>='A' && car2<='I') || (car2>='a' && car2<='i'))
{
if ((car1>='J' && car1<='R') || (car1>='j' && car1<='r'))
{
position=true;
}
}
if (position=false)
{
cout<<"Les coordonnées saisi ne sont pas corretes, veuillez les ressaisir : "<<endl<<"Emplacement : ";
}
}
while (position=false);
}


Est ce que quelqu'un trouve une incohérence ...?
merci.
.....
To1n00

13 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 déc. 2006 à 12:01
Salut,

Pour le test if (position=false) il faut utiliser ==
= c'est pour affectation
== test d'égalité

Prends l'habitude d'indenter ton code, pour le rendre plus lisible :-))

#include<iostream>
using namespace std;

void saisie(char car1,char car2);

int main()
{
	char c1,c2;
	saisie(c1,c2);
	return 0;
}


void saisie(char car1,char car2)
{
//ona un tableau dont les colonnes vont de A à I et les lignes de J à R, car 1 et car2 désigne les coordonnées (exemple : aj, AJ, ck...)

bool position;
position=false;

  do{
    cin>>car1;
    cin>>car2;

    if((car1>='A' && car1<='I') || (car1>='a' && car1<='i'))
    {
      if ((car2>='J' && car2<='R') || (car2>='j' && car2<='r'))
      {
        position=true;
      }
    }
    if ((car2>='A' && car2<='I') || (car2>='a' && car2<='i'))
    {
      if ((car1>='J' && car1<='R') || (car1>='j' && car1<='r'))
      {
        position=true;
      }
    }
    if (position == false)
    {
      cout<<"Les coordonnées saisi ne sont pas corretes, veuillez les ressaisir : "<<endl<<"Emplacement : ";
    }
  } while (position == false);
} 

Tu peux écrire plus court (pas besoin d'accolades si'il y a une seule instruction
#include<iostream>
using namespace std;

void saisie(char car1,char car2);

int main()
{
	char c1,c2;
	saisie(c1,c2);
	return 0;
}


void saisie(char car1,char car2)
{
//ona un tableau dont les colonnes vont de A à I et les lignes de J à R
//car 1 et car2 désigne les coordonnées (exemple : aj, AJ, ck...)

bool position;
position=false;

  do{
    cin>>car1;
    cin>>car2;

    if((car1>='A' && car1<='I') || (car1>='a' && car1<='i'))
      if ((car2>='J' && car2<='R') || (car2>='j' && car2<='r'))
        position=true;
  
    if ((car2>='A' && car2<='I') || (car2>='a' && car2<='i'))
      if ((car1>='J' && car1<='R') || (car1>='j' && car1<='r'))
        position=true;
    
    if (position == false)
      cout<<"Les coordonnées saisi ne sont pas corretes, veuillez les ressaisir :"
      <<endl<<"Emplacement : ";
  } while (position == false);
} 
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
31 déc. 2006 à 12:15
ok, j'ai pris note, je savais pour les doubles égale mais c'était un oubli. Par contre notre prof nous dit de mettre des double = dans les if uniquement.
Et j'ai toujours un probleme de plantage... Je ne sais pas d'ou ça vient...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 déc. 2006 à 12:24
Affiche ton code pour voir.
Aussi les erreur de compilation.

Je ne sais pas ce que ton prof t'a dit mais l'opérateur == c'est un opérateur de comparaison (égalité) que tu dois l'utiliser n'importe où tu fait un test

while(position == false)


veut dire : Tant que position égal false

while(postion = false)

veut dire: Tant que tu affectes à la position la valeur false

De point de vue boolean, ça retourne toujours vrai donc elle retourne 1
Tu dois continuer la boucle si position égal avec false et pas si tu affectes à position la valeur false

En bref tu veux exécuter le boucle tante que la valeur et false, mais vu que position=false (donc affectation) et toujours vrai, la boucle s'arrête.
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
31 déc. 2006 à 12:27
#include<iostream>
#include<time.h>
#include<process.h>
using namespace std;

void initialisation(int tab[9][9], int nb_a_jouer[5])
{
	int ligne;
    int colone;
    
	for(ligne=0;ligne<=8;ligne++)
	{
		for(colone=0;colone<=8;colone++)
		{
		tab[ligne][colone]=rand()%10;
		if(ligne==0 || ligne==8 || colone==0 || colone==8)
			tab[ligne][colone]=-1;
		}
	}
	for(ligne=0;ligne<=4;ligne++)
		nb_a_jouer[ligne]=rand()%10;
}

void affichage(int tab[9][9], int nb_a_jouer[5])
{
	int ligne;
    int colone;

	cout<<endl<<"   AddEmUp"<<endl<<" ABCDEFGHI"<<endl;


    cout<<'J';
    for(colone=0;colone<=8;colone++)
		{
		if(tab[0][colone]==-1)
			cout<<'.';
        else
			cout<<tab[0][colone];
        }
    cout<<"   "<<'>'<<nb_a_jouer[0]<<'<'<<endl;

        
	for(ligne=1;ligne<=4;ligne++)
	{
		cout<<(char)('J'+ligne);
		for(colone=0;colone<=8;colone++)
		{
		if(tab[ligne][colone]==-1)
			cout<<'.';
        else
			cout<<tab[ligne][colone];
         }
         cout<<"    "<<nb_a_jouer[ligne];
         cout<<endl;
	}
	
	
	for(ligne=5;ligne<=8;ligne++)
	{
		cout<<(char)('J'+ligne);
		for(colone=0;colone<=8;colone++)
		{
		if(tab[ligne][colone]==-1)
			cout<<'.';
        else
			cout<<tab[ligne][colone];
        }
        cout<<endl;
	}
	
	cout<<endl;
	cout<<"Emplacement : ";
	
}

void saisie(char car1,char car2)
{
//ona un tableau dont les colonnes vont de A à I et les lignes de J à R, 
//car 1 et car2 désigne les coordonnées (exemple : aj, AJ, ck...)

bool position;
position=false;

  do{
    cin>>car1;
    cin>>car2;

    if((car1>='A' && car1<='I') || (car1>='a' && car1<='i'))
      if ((car2>='J' && car2<='R') || (car2>='j' && car2<='r'))
        position=true;
  
    if ((car2>='A' && car2<='I') || (car2>='a' && car2<='i'))
      if ((car1>='J' && car1<='R') || (car1>='j' && car1<='r'))
        position=true;
    
    if (position==false)
      cout<<"Les coordonnées saisi ne sont pas corretes, veuillez les ressaisir :"
      <<endl<<"Emplacement : ";
  } while (position==false);
} 

void conversion( char car1, char car2,int tab[9][9],int ligne_jouee, int colone_jouee, int nb_a_jouer[5])
{

	if(car1>='A' && car1<='I' && car2>='J' && car2<='R')
	{
	colone_jouee=car1-'A';
    ligne_jouee=car2-'J';
	}
	else
	{
	colone_jouee=car2-'A';
    ligne_jouee=car1-'J';
	}
	
	if(car1>='a' && car1<='i' && car2>='j' && car2<='r')
	{
	colone_jouee=car1-'a';
    ligne_jouee=car2-'j';
	}
	else
	{
	colone_jouee=car2-'a';
    ligne_jouee=car1-'j';
	}
	
	if(tab[ligne_jouee][colone_jouee]==-1)
	tab[ligne_jouee][colone_jouee]=nb_a_jouer[0];
}

void addition(int tab[9][9], int somme, int ligne_jouee, int colone_jouee)
{
	int i,j;

	somme=0;
	for(i=ligne_jouee-1;i<=ligne_jouee+1;i++)
		{
		for(j=colone_jouee-1;j<=colone_jouee+1;j++)
			{
			if(i<=8 && i>=0 && j<=8 && j>=0 && tab[i][j]>-1)
			    somme=tab[i][j]+somme;	
			}
		}
	somme=somme-tab[ligne_jouee][colone_jouee];
}

void comparaison(int tab[9][9],int somme,int ligne_jouee,int colone_jouee)
{
	int i,j;

	if(somme%10==tab[ligne_jouee][colone_jouee])
	{
		for(i=ligne_jouee-1;i<=ligne_jouee+1;i++)
			{
				for(j=colone_jouee-1;j<=colone_jouee+1;j++)
				{
                if(i<=8 && i>=0 && j<=8 && j>=0 && tab[i][j]>-1)
					tab[i][j]=-1;
                }
			}
     }
}

int somme_du_tableau (int tab[9][9])
{
    int somme_totale;
    int i;
    int j;
    for(i=0;i<=8;i++)
    {
        for(j=0;j<=8;j++)
        somme_totale=somme_totale+tab[i][j];
    } 
    return somme_totale;
}

 int main()
 {
		int tab[9][9];
        int nb_a_jouer[5];
        int ligne_jouee;
        int colone_jouee;
        int somme;
		char car1,car2;

	srand(time(NULL));
	initialisation(tab,nb_a_jouer);
	
    do
	{
	system("cls");
	affichage(tab,nb_a_jouer);  
    saisie(car1,car2);
	conversion(car1,car2,tab,ligne_jouee,colone_jouee,nb_a_jouer);
	addition(tab,somme,ligne_jouee,colone_jouee);
	comparaison(tab,somme,ligne_jouee,colone_jouee);
	
    nb_a_jouer[0]=nb_a_jouer[1];
    nb_a_jouer[1]=nb_a_jouer[2];
    nb_a_jouer[2]=nb_a_jouer[3];
    nb_a_jouer[3]=nb_a_jouer[4];
    nb_a_jouer[4]=rand()%10;
	}
	while (somme_du_tableau(tab)!=(-81));
		 
 }



Voici le code.
Merci pour ton aide.
Et sinon, je n'ai pas d'erreur de compilation, c'ets lors de l'execution que ça plante
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 déc. 2006 à 12:53
Salut,

j'ai compilé et exécuter ton code et je n'ai pas du plantage.
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
31 déc. 2006 à 13:04
tu as entré les premières coordonnées?

Moi c'ets après avoir entré les coordonées et appuyé sur entrée...
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 déc. 2006 à 13:18
D'accord mais que comprends par plantage?

En fait c'est un plantage ou tout simplement le code ne fait pas ce que tu veux?

Il faut commenter un peu ton code, aussi spécifier le but (il me semble que c'est un jeu, je n'ai pas parcouru attentivement ton code :-))
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
31 déc. 2006 à 13:26
oui, c'est un jeu, c'est un exercice qu'un prof nous a demandé. Je n'ai pas encore eu le temps de le commenter. Si tu veux voir en quoi consiste le jeun, il y a une démo ici : http://zerogames.com/game/puzzles/addemup.html
bien sur les graphismes ne sont pas les même...

En fait après avoir saisis les premières coordonnées, il m'affiche le message addemup3.exe a rencontré un problème est doit fermer. nous vous prions de nous excuser pour le désagrement encouru....
Débogage/envoyer le rapport d'erreurs/Ne pas envoyer
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
31 déc. 2006 à 13:30
excuse moi, j'aurais du t'expliquer au moins le principe... On place dans le tableau les nombres qui sont proposé a droite. Ensuite on fait la somme de ses voisins et si le chiffre des unités et égale au nombre placé, on les enlève du tableau. et cela jusqu'a ce qu'il n'y ait plus rien dans le tableau.
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
1 janv. 2007 à 19:24
*up*
Quelqu'un voit il ce qui ne va pas dans mon programme?
Merci
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
2 janv. 2007 à 10:50
Salut

Cela ne risque pas de fonctionner si tes procédures ne transmettent pas correctement les arguments. Par exemple ta fonction saisie ne renvoie pas car1 et car2 (fait un "cout" juste après et tu verras qu'il n'y a pas ce que tu attends dans car1 et car2). Faut passer par des pointeurs.
0
To1n00 Messages postés 137 Date d'inscription samedi 30 décembre 2006 Statut Membre Dernière intervention 12 octobre 2016 6
2 janv. 2007 à 17:15
bonne année !

je n'ai pas encore vu les pointeurs... Et je ne voit pas ce qui ne vas pas dans ma procédure saisie... Elle demande deux caractère et vérifie que les coordonnée rentré soit cohérentes... les valeur saisies sont bien affectée à car1 et car2...

j'y ai un peu retravaillé depuis, mais maintenant lorsque je rentre des coordonnées, il n'affecte pas la valeur à la case (ou il ne l'affiche pas correctement)...
Voici mon code actuel :
#include<iostream>
#include<time.h>
#include<process.h>
using namespace std;

void initialisation(int tab[9][9], int nb_a_jouer[5])
{
//la procédure entre des nbs au hazard ds le tableau et laisse vide tt le pourtour
	int ligne;
    int colone;
    
	for(ligne=0;ligne<=8;ligne++)
	{
		for(colone=0;colone<=8;colone++)
		{
		tab[ligne][colone]=rand()%10;
		if(ligne==0 || ligne==8 || colone==0 || colone==8)
			tab[ligne][colone]=-1;
		}
	}
	for(ligne=0;ligne<=4;ligne++)
		nb_a_jouer[ligne]=rand()%10;
}

void affichage(int tab[9][9], int nb_a_jouer[5])
{
	int ligne;
    int colone;

	cout<<endl<<"    AddEmUp"<<endl<<endl<<"   ABCDEFGHI"<<endl;


    cout<<"  "<<'J';
    for(colone=0;colone<=8;colone++)
		{
		if(tab[0][colone]==-1)
			cout<<'.';
        else
			cout<<tab[0][colone];
        }
    cout<<"   "<<'>'<<nb_a_jouer[0]<<'<'<<endl;

        
	for(ligne=1;ligne<=4;ligne++)
	{
		cout<<"  "<<(char)('J'+ligne);
		for(colone=0;colone<=8;colone++)
		{
		if(tab[ligne][colone]==-1)
			cout<<'.';
        else
			cout<<tab[ligne][colone];
         }
         cout<<"    "<<nb_a_jouer[ligne];
         cout<<endl;
	}
	
	
	for(ligne=5;ligne<=8;ligne++)
	{
		cout<<"  "<<(char)('J'+ligne);
		for(colone=0;colone<=8;colone++)
		{
		if(tab[ligne][colone]==-1)
			cout<<'.';
        else
			cout<<tab[ligne][colone];
        }
        cout<<endl;
	}
	
	cout<<endl;
	cout<<"Emplacement : ";
	
}

void saisie(char car1,char car2)
{
//ona un tableau dont les colonnes vont de A à I et les lignes de J à R,
	//car 1 et car2 désigne les coordonnées (exemple : aj, AJ, ck...)

bool position;
position=false;

  do{
    cin>>car1;
    cin>>car2;

    if((car1>='A' && car1<='I') || (car1>='a' && car1<='i'))
      if ((car2>='J' && car2<='R') || (car2>='j' && car2<='r'))
        position=true;
  
    if ((car2>='A' && car2<='I') || (car2>='a' && car2<='i'))
      if ((car1>='J' && car1<='R') || (car1>='j' && car1<='r'))
        position=true;
	
    if (position==false)
      cout<<"Les coordonnées saisies ne sont pas corretes, veuillez les ressaisir..."
      <<endl<<"Emplacement : ";
  } while (position==false);
} 

void conversion( char car1, char car2,int tab[9][9],int ligne_jouee, int colone_jouee, int nb_a_jouer[5])
{

	if(car1>='A' && car1<='I' && car2>='J' && car2<='R')
	{
	colone_jouee=car1-'A';
    ligne_jouee=car2-'J';
	}
	else
	{
	colone_jouee=car2-'A';
    ligne_jouee=car1-'J';
	}
	
	if(car1>='a' && car1<='i' && car2>='j' && car2<='r')
	{
	colone_jouee=car1-'a';
    ligne_jouee=car2-'j';
	}
	else
	{
	colone_jouee=car2-'a';
    ligne_jouee=car1-'j';
	}
	 if(tab[ligne_jouee][colone_jouee]==-1)
	{
		tab[ligne_jouee][colone_jouee]=nb_a_jouer[0];
	}
}

void addition(int tab[9][9], int somme, int ligne_jouee, int colone_jouee)
{
	int i,j;

	somme=0;
	for(i=ligne_jouee-1;i<=ligne_jouee+1;i++)
		{
		for(j=colone_jouee-1;j<=colone_jouee+1;j++)
			{
			if(i<=8 && i>=0 && j<=8 && j>=0 && tab[i][j]>-1)
			    somme=tab[i][j]+somme;	
			}
		}
	somme=somme-tab[ligne_jouee][colone_jouee];
}

void comparaison(int tab[9][9],int somme,int ligne_jouee,int colone_jouee)
{
	int i,j;

	if(somme%10==tab[ligne_jouee][colone_jouee])
	{
		for(i=ligne_jouee-1;i<=ligne_jouee+1;i++)
			{
				for(j=colone_jouee-1;j<=colone_jouee+1;j++)
				{
                if(i<=8 && i>=0 && j<=8 && j>=0 && tab[i][j]>-1)
					tab[i][j]=-1;
                }
			}
     }
}

int somme_du_tableau (int tab[9][9])
{
    int somme_totale;
    int i;
    int j;
    for(i=0;i<=8;i++)

		somme_totale=0;
    {
        for(j=0;j<=8;j++)
        somme_totale=somme_totale+tab[i][j];
    } 
    return somme_totale;
}

 int main()
 {
		int tab[9][9];
        int nb_a_jouer[5];
        int ligne_jouee;
        int colone_jouee;
        int somme;
		char car1;
		char car2;

	srand(time(NULL));
	initialisation(tab,nb_a_jouer);
	
	
    do
	{
	system("cls");
	affichage(tab,nb_a_jouer);  
	saisie(car1,car2);
	conversion(car1,car2,tab,ligne_jouee,colone_jouee,nb_a_jouer);
	addition(tab,somme,ligne_jouee,colone_jouee);
	comparaison(tab,somme,ligne_jouee,colone_jouee);
	
    nb_a_jouer[0]=nb_a_jouer[1];
    nb_a_jouer[1]=nb_a_jouer[2];
    nb_a_jouer[2]=nb_a_jouer[3];
    nb_a_jouer[3]=nb_a_jouer[4];
    nb_a_jouer[4]=rand()%10;
	}
	while (somme_du_tableau(tab)!=(-81));

 }
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
3 janv. 2007 à 11:46
Salut et bonne année !

Rajoutes la ligne suivante après l'appel de ta procédure saisie :
cout << car1 << " " << car2 << endl; cin >> car1;

le cin ne sert qu'à stopper l'affichage. Tu verras qu'il ne t'affiche pas ce que tu as saisi. Pourquoi ? Simplement parce que si tu veux qu'une procédure te renvoie une valeur, il faut passer les arguments par adresse et non pas par valeur. Testes d'abord sur un petit exemple :
void saisie_test(char *car1)
{
  cout << "Taper un caractère : ";
  cin >> *car1;
}

int main()
{
  char car1;
  saisie_test(&car1);
  cout << "Vous avez tapé le caractère : " << car1 << endl;
}


Mieux, non !
0