[C++] je débute

je débute [C++] - Programmation

Marsh Posté le 09-02-2002 à 20:11:45    

Bonjour
 
J'aimerai créer un programme en C++ pour jouer au morpion (sous dos bien sur). J'ai commencé mais deja 7 erreurs lors de la compilation !
j'ai essayé plein de trucs mais a chaque fois c'est pire. Quelqu'un pourrait me dire ce qui ne va pas ?
 
Le programme :

Citation :

#include<iostream.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
 
 
 
void affiche (int tableau[3][3])
{
 int i,j;
 for(i=0;i<3;i++)
 {
  for(j=0;j<3;j++)
  {
   cout<<" ";
   switch (tableau[i][j]);
   {
    case NULL:
     cout<<" ";
     break;
    case 0:
     cout<<" ";
     break;
    case 1:
     cout<<"X";
     break;
    case 2:
     cout<<"O";
     break;
    default:
     break;
   }
  }
  cout<<"\n\n";
 }
 
}
 
 
int main()  
{
 int tableau [3][3];
 affiche(tableau[3][3]);
 
}


 
les erreurs :

Citation :


Compiling...
morpion.cpp
E:\programmation\morpion.cpp(16) : error C2065: 'swich' : undeclared identifier
E:\programmation\morpion.cpp(18) : error C2046: illegal case
E:\programmation\morpion.cpp(21) : error C2046: illegal case
E:\programmation\morpion.cpp(24) : error C2046: illegal case
E:\programmation\morpion.cpp(27) : error C2046: illegal case
E:\programmation\morpion.cpp(30) : error C2047: illegal default
E:\programmation\morpion.cpp(43) : error C2664: 'affiche' : cannot convert parameter 1 from 'int' to 'int [][3]'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
E:\programmation\morpion.cpp(45) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.
 
morpion.obj - 7 error(s), 1 warning(s)


 
merci d'avance :)

 

[jfdsdjhfuetppo]--Message édité par Library--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 09-02-2002 à 20:11:45   

Reply

Marsh Posté le 09-02-2002 à 20:15:17    

:hello: lib
 
désolé moi déjà php ça va un peu mal mais alors la C...

Reply

Marsh Posté le 09-02-2002 à 20:16:20    

1ere erreur: t'as tapé swich pour switch  :sarcastic:

Reply

Marsh Posté le 09-02-2002 à 20:16:51    

Citation :

E:\programmation\morpion.cpp(16) : error C2065: 'swich' : undeclared identifier


c pas clair ?

Reply

Marsh Posté le 09-02-2002 à 20:19:45    

ben ce sont mes premieres lignes en C++...
 
j'ai corrigé le swich en switch, mais voila les erreurs maintenant :
 

Citation :

Compiling...
morpion.cpp
E:\programmation\morpion.cpp(16) : warning C4060: switch statement contains no 'case' or 'default' labels
E:\programmation\morpion.cpp(18) : error C2046: illegal case
E:\programmation\morpion.cpp(21) : error C2046: illegal case
E:\programmation\morpion.cpp(24) : error C2046: illegal case
E:\programmation\morpion.cpp(27) : error C2046: illegal case
E:\programmation\morpion.cpp(30) : error C2047: illegal default
E:\programmation\morpion.cpp(43) : error C2664: 'affiche' : cannot convert parameter 1 from 'int' to 'int [][3]'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
E:\programmation\morpion.cpp(45) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.
 
morpion.obj - 6 error(s), 2 warning(s)


 
merci de ton aide en tous cas

Reply

Marsh Posté le 09-02-2002 à 20:25:19    

je comprends pas un truc, tes "cases" doivent prendre d'après ton prog NULL, 0, 1 ou 2 or tu fais switch(tableau(i,j)) et je ne vois pas comment tableau(i,j) pourrait prendre une de ces valeurs... :/
 
PS : Je raconte peut-être des conneries aussi, chuis super débutant en C ;)


---------------
Le tout c'est d'y croire! DaBZHWDT site : www.setibzh.com
Reply

Marsh Posté le 09-02-2002 à 20:28:15    

pour l'instant j'ai voulu faire que le sous programme qui "affiche" les cases du morpion, plus tard (des que les joueurs auront commencé a jouer, je mettrai des 1 ou des 2 dans la matrice "tableau", ce qui devrait afficher des croix et des ronds)
c pas comme ca qu'il faut faire ?

Reply

Marsh Posté le 09-02-2002 à 20:32:57    

chais pa trop méga débutant aussi (6h de cours, et pas à faire des morpions :D )
 
Par contre pour le deuxième warning, tu devrais remplacer "int main" par "void main", ça devrait passer je pense.


---------------
Le tout c'est d'y croire! DaBZHWDT site : www.setibzh.com
Reply

Marsh Posté le 09-02-2002 à 20:33:56    

Tu a mis un ; à la fin de ton switch et avant ton bloc {} c'est pas bon, retire le.
 
De plus, enleve completement la section case NULL: parceque ca ne sert à rien. En général il n'y a que les pointeurs qui contiennent NULL et ici c'est des entiers.
 
En fait je ne vois pas a quoi pouvait servir cette partie avec case NULL: :)

Reply

Marsh Posté le 09-02-2002 à 20:35:00    

rasta: :non:: le void poiur main, c mal  :non:

Reply

Marsh Posté le 09-02-2002 à 20:35:00   

Reply

Marsh Posté le 09-02-2002 à 20:36:02    

Piksou> Pourquoi, étant donné qu'apparement son prog ne renvoie rien en sortie? :??:


---------------
Le tout c'est d'y croire! DaBZHWDT site : www.setibzh.com
Reply

Marsh Posté le 09-02-2002 à 20:36:09    

A j'oubliais la plus grosse erreur : le passage de tableau en paramètre.
 
     affiche(tableau[3][3]);
 
Il faut faire ca :
 
      affiche(tableau);

Reply

Marsh Posté le 09-02-2002 à 20:36:40    

bah c considéré comme pas propre
il me semble que gcc envoie un warning
qu'il renvoie plutot zéro

Reply

Marsh Posté le 09-02-2002 à 20:37:48    

ben là le compilo à l'air de pas apprécier le "int main", c pkoi je comprends pas :/


---------------
Le tout c'est d'y croire! DaBZHWDT site : www.setibzh.com
Reply

Marsh Posté le 09-02-2002 à 20:38:48    

il rale paske ça renvoie rien
il faut juste ajouter un return
j'avais raison pour gcc
 

Citation :

test.c: In function `main':
test.c:7: warning: return type of `main' is not `int'


---------------
« Le verbe "aimer" est le plus compliqué de la langue. Son passé n'est jamais simple, son présent n'est qu'imparfait et son futur toujours conditionnel. » Jean Cocteau
Reply

Marsh Posté le 09-02-2002 à 20:38:54    

yes, merci a tous, j'ai remplacé le tableau[3][3] par tableau, viré le ; apres le switch et viré le case NULL et maintenant ca marche tres bien. Merci a tous !

Reply

Marsh Posté le 09-02-2002 à 21:07:17    

faudra que tu me le passes  :)

Reply

Marsh Posté le 09-02-2002 à 22:00:36    

au fait! ce n est pas de la programmation C++ que tu fais la... mais du C (l utilisation de cout<< et cin>> n est qu une facilite pour remplacer le printf et le scanf).
 
Quand tu feras des classes, la tu programmeras en C++.

Reply

Marsh Posté le 09-02-2002 à 22:47:05    

oui enfin le C++ c'est un langage multiparadigme
(dixit son auteur)
Tu n'es pas oblige de faire de l'objet pour
programmer en C++.
La plupart des regles C->C++ sont optionnelles
mais facilitent la tache du programmeur
quand elles sont utilisees donc tu aurais
tort de ne pas les utiliser sauf quand
tu sais que ca te penalise au niveau performance.
(mais pour un morpion les performances ca devrait
aller :P).
 
Sinon le int main c'est pas optionnel
c'est la norme parce que main est une fonction
qui est appelee par l'init du programme
et que cette init attend une valeur de retour.
 
A+
LEGREG

Reply

Marsh Posté le 09-02-2002 à 23:40:57    

j'ai continué un peu le programme, au moment ou j'en suis il n'y a pas d'erreur quand je compile et que je crée le .exe mais pourtant lorsque j'execute le .exe ca bug (histoire de mémoire)
 
la source actuelle est :
 

Citation :

#include<iostream.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
 
 
 
void affiche (int *tableau[3][3])
{
 int i,j;
 for(i=0;i<3;i++)
 {
  for(j=0;j<3;j++)
  {
   cout<<" ";
   switch (*tableau[i][j]) /* l'erreur est sur cette ligne */
   {
    case 0:
     cout<<" ";
     break;
    case 1:
     cout<<"X";
     break;
    case 2:
     cout<<"O";
     break;
    default:
     break;
   }
  }
  cout<<"\n\n";
 }
 
}
 
int gagne (int *tableau[3][3])
{
 int i,j,temp,gagne;
 /* verifie possibilité par possibilité */
 for (i=0;i<3;i++)  
 {
  temp=*tableau[i][0];
  gagne=1;
  if (temp==0) {continue;}
  for (j=1;j<3;j++)
  {
   if (*tableau[i][j] != temp) {continue; gagne=0;}
  }
  if (gagne==1) {return(temp);}
 }
 
 for (i=0;i<3;i++)  
 {
  temp=*tableau[0][i];
  gagne=1;
  if (temp==0) {continue;}
  for (j=1;j<3;j++)
  {
   if (*tableau[j][i] != temp) {continue; gagne=0;}
  }
  if (gagne==1) {return(temp);}
 }
 
 if (*tableau[0][0]==*tableau[1][1] && *tableau[0][0]==*tableau[2][2]) {return(*tableau[1][1]);}
 if (*tableau[0][2]==*tableau[1][1] && *tableau[1][1]==*tableau[2][0]) {return(*tableau[1][1]);}
 
 return(0);
 
}
 
void init (int *tableau[3][3])
{
}
 
void main()  
{
 int *tableau[3][3],i,p;
 init(tableau);
 p=0;
 i=0;
 do  
 {
 affiche(tableau);
 cout<<p;
 p=(p+1)%2;
 i++;
 } while (gagne(tableau)==0 || i>100);
 cout<<gagne(tableau);
 
 
}


 
j'ai mis la ligne ou il me donne l'erreur lorsqu'il passe en mode débuggage.
Ca doit etre un probleme avec les pointeurs, mais j'y comprend pas grand chose a ces machins...

Reply

Marsh Posté le 10-02-2002 à 00:01:25    

Bah, il va falloir apprendre :)
 
En fait, dans ton tableau "int tableau[3][3];", tableau est un pointeur deguisé. Donc quand tu dit "void affiche (int tableau[3][3])", affiche prend déja un pointeur en paramètre sans que tu ne le sache. Ensuite, pour utiliser ce tableau, tout ce que tu a à faire c'est :
 
   void affiche(int tableau[3][3])
...
   tableau[i][j];
 
et non :
   void affiche(int *tableau[3][3])
...
   *tableau[i][j];
 
Et pour appeler affiche, c'est comme tu as fais.
 
En fait, ( mais je ne suis pas sur ), int * tableau[3][3]; n'est pas un tableau d'entiers mais un tableau de pointeurs vers des entiers :)

Reply

Marsh Posté le 10-02-2002 à 10:47:15    

j'ai enlevé les deux * comme tu m'as dit, mais maintenant ca me met des erreurs lors de l'appel de la fonction :(
 

Citation :

#include<iostream.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
 
 
 
void affiche (int tableau[3][3])
{
 int i,j;
 for(i=0;i<3;i++)
 {
  for(j=0;j<3;j++)
  {
   cout<<" ";
   switch (tableau[i][j])
   {
    case 0:
     cout<<" ";
     break;
    case 1:
     cout<<"X";
     break;
    case 2:
     cout<<"O";
     break;
    default:
     break;
   }
  }
  cout<<"\n\n";
 }
 
}
 
int gagne (int *tableau[3][3])
{
 int i,j,temp,gagne;
 /* verifie possibilité par possibilité */
 for (i=0;i<3;i++)  
 {
  temp=*tableau[i][0];
  gagne=1;
  if (temp==0) {continue;}
  for (j=1;j<3;j++)
  {
   if (*tableau[i][j] != temp) {continue; gagne=0;}
  }
  if (gagne==1) {return(temp);}
 }
 
 for (i=0;i<3;i++)  
 {
  temp=*tableau[0][i];
  gagne=1;
  if (temp==0) {continue;}
  for (j=1;j<3;j++)
  {
   if (*tableau[j][i] != temp) {continue; gagne=0;}
  }
  if (gagne==1) {return(temp);}
 }
 
 if (*tableau[0][0]==*tableau[1][1] && *tableau[0][0]==*tableau[2][2]) {return(*tableau[1][1]);}
 if (*tableau[0][2]==*tableau[1][1] && *tableau[1][1]==*tableau[2][0]) {return(*tableau[1][1]);}
 
 return(0);
 
}
 
void init (int *tableau[3][3])
{
}
 
void main()  
{
 int *tableau[3][3],i,p;
 init(tableau);
 p=0;
 i=0;
 do  
 {
 affiche(tableau);
 cout<<p;
 p=(p+1)%2;
 i++;
 } while (gagne(tableau)==0 || i>100);
 cout<<gagne(tableau);
 
 
}


 
 
les erreurs :

Citation :

Compiling...
morpion.cpp
E:\programmation\morpion.cpp(83) : error C2664: 'affiche' : cannot convert parameter 1 from 'int *[3]' to 'int [][3]'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
 
morpion.obj - 1 error(s), 0 warning(s)

Reply

Marsh Posté le 10-02-2002 à 14:36:21    

:bounce: svp j'ai vraiment besoin de vous !

Reply

Marsh Posté le 10-02-2002 à 14:59:01    

en fait, il faut enlever TOUTE les * devant tableau dans tout ton programme, même dans le main : int tableau[3][3]; à la place de int * tableau[3][3];
 
Tu n'as pas besoin de pointeurs ici.

Reply

Marsh Posté le 10-02-2002 à 15:26:58    

ben j'en ai besoin pour retourner un tableau dans une fonction. C'est possible ? (par une fonction int fonction (tableau) ?)

Reply

Marsh Posté le 10-02-2002 à 15:32:27    

En fait, la tu manipule des tableaux de pointeurs vers des int :)
 
Si tu fais :
 
int tableau[3][3];
affiche(tableau);
 
Tu passes déjà un pointeur en paramètre car tableau est équivalent à un pointeur :). Dans ce cas prècis tu n'as pas à t'en faire, ça passe tout seul. La où il y aurait des problèmes se serait si ton tableau n'avait pas une taille fixée à l'avance et alors il faudrait vraiment travailler avec des pointeurs.

Reply

Marsh Posté le 10-02-2002 à 15:41:41    

d'accord, je vais virer tous les pointeurs, t'as surement raison, je dois pas en avoir besoin encore (j'en aurai besoin pour une autre partie de mon programme, mais bcp bcp plus tard)
 
merci a toi :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed