Probleme en c++

Bonjour,
j'ai un probleme en c++...j'etais entraine de faire un jeu de sudoku de [9][9] cases et apres que j'ai finis la 1ere partie du code j'ai voulu le compiler pour le tester mais j'ai eu 1 seul erreur qui est un"fatal error: unexpected end of file while looking for precompiled header directive Error executing cl.exe.end of file" je ne sais pas comment enlever cette erreur quelqu'un peut m'aider.??
mercii.
Configuration: Windows XP
Firefox 3.0.10

20 réponses

Résumé de la discussion

Un jeu de Sudoku en C++ sur une grille 9x9 rencontre une erreur fatale lors de la compilation: 'unexpected end of file' liée au préchargement des en-têtes. Des erreurs fréquentes incluent void main et le retrait éventuel de stdafx.h, qui génèrent des messages de précompilation et des fautes du type 'no such file or directory'. Pour une grille Sudoku 9x9, il faut accéder via tab[i][j], préférer int plutôt que bool, et utiliser == pour les comparaisons afin d’éviter les erreurs d’assignation dans les conditions. Enfin, évitez les redéfinitions de tab et veillez à la cohérence des accolades et de l’organisation des boucles, ce qui limite les confusions entre initialisation et traitement.

Bobot (l’IA à votre service)
  1. a quoi ca sert cette ligne dans le code :
    cout<<i<<"| ";
    merci.
    0
    1. Modérateur
      ça affiche la valeur de i puis une barre verticale "|"

      exemple :
      for (int i=0; i<5; i++)
          cout << i << "| ";
      
      0| 1| 2| 3| 4|
      0
  2. j'ai ecrit dans le code :
    int tab[9][9];
    int i ;
    int j ; //mais je crois que c insuffisant pour declarer le tableau.
    0
    1. Modérateur
      int tab[9][9]; suffit à créer un tableau de 81 cases (initialisées avec des 0)
      Tu accèdes au données en faisant tab[i][j] avec i et j entre 0 et 8

      Remarque : Il y a d'autres méthodes d'accès liées aux pointeurs, mais il vaut mieux que tu n'utilises que celle avec [i][j]
      0
  3. salut,
    je voudrais savoir quel sont les etapes que je dois ecrire en c++ pour faire un tableau [9][9]
    merci d'avance
    0
    1. de toute facon il m'a pas donner qq chose
      0
      1. Modérateur
        Peut-être qu'avec un system("PAUSE"); avant le return 0; ça ira mieux...
        #include<iostream>
        using namespace std;
        
        int main()
        {
            int tab [9][9]={ ... };
        
            for(int i=0; i<9; i++) // ième colonne
            for(int j=0; j<9; j++) // jème ligne
            {
                if (tab[i][j]==i && tab[i][j]==j)
                     cout << "erreur ! try again " << endl;
                else cout << "reponse correcte ! " << endl;
            }
            
        system("PAUSE");
        return 0 ;
        }
        Ici ça n'affiche que des "réponses correctes" même si le test n'a aucun sens pour moi...
        0
    2. 0 erreur :D:D
      main je ne sais pas quoi faire maintenant pour l'executer ??
      0
      1. Modérateur
        Ça dépend ce que tu veux faire, pour l'instant tu as ta grille de Sudoku
            int tab [9][9]={ 5, 3, 0,  0, 7, 0,  0, 0, 0,
                             6, 0, 0,  1, 9, 5,  0, 0, 0,
                             0, 9, 8,  0, 0, 0,  0, 6, 0,
                             
                             8, 0, 0,  0, 6, 0,  0, 0, 3,
                             4, 0, 0,  8, 0, 3,  0, 0, 1,
                             7, 0, 0,  0, 2, 0,  0, 0, 6, 
                             
                             0, 6, 0,  0, 0, 0,  2, 8, 0,
                             0, 0, 0,  4, 1, 9,  0, 0, 5,
                             0, 0, 0,  0, 8, 0,  0, 7, 9
                           };
        Mais à vrai dire je n'ai pas compris l'intérêt de ta "vérification" try again...

        De toute façon, avec le code tel quel, tu n'iras pas bien loin... Tu as encore du boulot !
        0
    3. si j'ecris == eu erreur convienne qui est ('==' : no conversion from 'int' to 'int *')??

      voici cette partie est ce vous pouvez me faire les chagements necessaire stp ??

      for(i=0;i<=8;i++)
      {
      for(j=0;j<=8;j++)
      {
      if (tab[i]==i && tab[j]==j)

      cout<<"erreur!try again"<<endl;

      else

      cout<<"reponse correcte!"<<endl;
      }
      }
      0
      1. Modérateur
        Parce qu'il faut corriger toutes erreurs en même temps ;)

        tab[i] est un tableau ! (en fait c'est un pointeur) son type c'est int*
        On ne peux pas comparer un entier avec un tableau, c'est absurde !

        Il faut TOUJOURS que tu fasses tab[i][j]== et non pas juste tab[i]==
        0
    4. 1-('=' : left operand must be l-value
      Il faut que tu utilises == et non pas = ) ce que j'ai compris que == pour faire une comparaison et = pour exprimer l'egalite...et dans mon cas c une egalite en plus si je met == le nb. d'erreurs augmentent ?? je veux dire au rpog s'il trouve 2 nombres repetee il fait apparaitre un message "erreur"

      2-'=' : cannot convert from 'bool' to 'int [9]'
      Tu utilises tab[i] comme un int alors qu'il est de type int[9]
      >>je ne comprends pas cette partei qu;est ce que je dois faire ??
      0
      1. Modérateur
        tab est une matrice 9x9 (un tableau de tableau)
        tab[i] est une ligne du tableau (un tableau d'entier)
        tab[i][j] est un entier

        Si tu fais tab[i]=i, ça veut dire que tu donnes la valeur i à la ligne i !!!
        Mais une ligne ce n'est pas un entier... D'où l'erreur l-value

        Et puisque tu fais "&&" après il considère que tab[i]=i est un bool,
        Or une fois l'affectation "=i" effectuée le programme considère que c'est tab[i] qui est un bool !!!
        Or c'est toujours le même problème, tab[i] est un tableau...
        D'où l'erreur convert from 'bool'

        Il faut que tu utilises UNIQUEMENT des entiers sous la forme tab[i][j]
        Si tu écris tab, ou tab[i] ça ne suffit pas !

        De plus pour que tu obtienne un bool (pour faire ton if)
        IL FAUT que tu fasses une comparaison avec "=="
        Si tu fais juste "=" ça modifie la valeur à gauche mais ça ne compare RIEN !

        Exemple :
        int i=3;
        if (i=0) cout << "i vaut 0";
        else cout << "i différent 0";
        En fait ici, à la deuxième ligne on modifie i en 0, on ne le compare pas
        Du coup la comparaison est effectuée avec la valeur de i (donc 0, c'est à dire false)
        Donc le programme affichera tout le temps "i vaut 0" alors que i valait 3 :(
        Mais il n'y a plus le problème si tu remplaces =, par ==
        0
    5. les 3 erreurs sont si j'enleve le stdafx.h >>
      1-'tab' : redefinition
      2-'int' : forcing value to bool 'true' or 'false' (performance warning)
      3-'=' : left operand must be l-value
      4-'=' : cannot convert from 'bool' to 'int [9]'

      j'ai demande au M des TD il ma dit d'enlever stdafx.h parce que ca sert a rien mais quand je l'enleve il me parait ces 4 erreurs je ne sais pas quoi faire ??
      en plus il ya une partie que je comprends pas :void insertionSort(int*, int); ??
      0
      1. Modérateur
        Je ne sais pas à quoi sert stdafx, mieux vaut ne pas t'en servir pour l'instant...

        1-'tab' : redefinition
        Tu écris deux fois int tab [9][9];
        Enlèves-en un des deux

        2-'int' : forcing value to bool 'true' or 'false' (performance warning)
        3-'=' : left operand must be l-value

        Il faut que tu utilises == et non pas =

        4-'=' : cannot convert from 'bool' to 'int [9]'
        Tu utilises tab[i] comme un int alors qu'il est de type int[9]
        0
    6. j'ai mis void main() est ce que ca differe de int main ()
      quand j'enleve le "stdafx.h" je recois 3 erreurs et quand je le met c 1 erreur.....qui est l'errur de "no such file or directory"
      0
      1. j'ai eu un erreur a la fin qui est fatal error unexpected end of file....apres ca j'ai verifier tous les accolades....et j'ai ajoute apres #include <iostream>
        #include<stdafx.h>
        et j'ai eu un autre erreur qui est :"Cannot open include file: 'stdafx.h': No such file or directory"
        comment puis-je l'enlever ?? ou il y a qq chose qui peut le remplacer ??
        merci d'avance
        0
        1. Modérateur
          essaye avec ce début de code
          #include <iostream>
          #include "stdafx.h"
          Et comme le disais boisdulait il faut faire un int main()
          0
      2. De plus,

        En C, void ne retourne pas de valeur; or ton main lui en retourne
        4-'main' : 'void' function returning a value.

        plutot un

        int main()
        {
        bla bla bla;
        }

        et heu j'connais pas le C++, mais il n'y a pas moyen de factoriser tes tab ?
        pcq les
        tab [x][y]=z
        etc
        etc
        etc

        C'est un poil lourd et rébarbatif
        0
        1. Modérateur
          La factorisation des tab se fait comme je l'ai expliqué plus haut, dès l'initialisation
              int tab[9][9]={5, 3, 0, 0, 7, 0, 0, 0, 0,
                             6, 0, 0, 1, 9, 5, 0, 0, 0,
                             0, 9, 8, 0, 0, 0, 0, 6, 8,
                             ...
                            };
          En plus c'est plus clair car on "voit" la grille de Sudoku
          0
      3. oui ca ne sert a rien vraiment
        0
        1. Modérateur
          En fait on peut ouvrir des accolades comme ça, pour déclarer des variables à portée réduites...

          Exemple :
          {
              int i;
              for (i=0; i<10; i++)
              {
          
              }
          } // i est détruit par la fermeture de l'accolade
          Même si dans ce cas précis on préférerait cette écriture :
              for (int i=0; i<10; i++)
              {
          
              } // i est détruit par la fermeture de l'accolade
          0
      4. Salut,

        Je ne fais pas de C++ mais :

        void main()
        {
        int tab [9][9];
        int i;
        int j; //i is for les colonnes et j for les lignes.

        {
        for(i=0;i<=8;i++)
        {
        for(j=0;j<=8;j++)
        {
        }
        }
        }

        Il y a un bleme dans tes accolades non ?

        int j; //i is for les colonnes et j for les lignes.

        { <== rien ne justifie l'ouverture de celle-à

        0
        1. je ne comprends pas cette partie ..cela veut dire que ma methode est fausse ?
          //Quand tu fais tab[9][9]; toutes les cases sont initialisées à 0 puis tu les modifies une à une
          Quand tu fais tab[9][9]={ ... } les cases sont initialisées avec les valeurs précisées dans les accolades, éventuellement avec des 0 pour compléter...

          code avec 4 erreurs....am sorry i am asking too many questions....
          #include<iostream>
          using namespace std;

          void main()
          {
          int tab [9][9];
          int i;
          int j; //i is for les colonnes et j for les lignes.

          {
          for(i=0;i<=8;i++)
          {
          for(j=0;j<=8;j++)
          {
          }
          }
          }

          int tab [9][9];
          tab[0][0]=5; //ou,5, 3, 0, 0, 7, 0, 0, 0, 0, [0] //6, 0, 0, 1, 9, 5, 0, 0, 0, [1]
          tab[0][1]=3; //0, 9, 8, 0, 0, 0, 0, 6, 0, [2] //8, 0, 0, 0. 6. 0. 0. 0. 3, [3]
          tab[0][2]=0;
          tab[0][3]=0;
          tab[0][4]=7;
          tab[0][5]=0;
          tab[0][6]=0;
          tab[0][7]=0;
          tab[0][8]=0;
          tab[1][0]=6;
          tab[1][1]=0;
          tab[1][2]=0;
          tab[1][3]=1;
          tab[1][4]=9;
          tab[1][5]=5;
          tab[1][6]=0;
          tab[1][7]=0;
          tab[1][8]=0;
          tab[2][0]=0;
          tab[2][1]=9;
          tab[2][2]=8;
          tab[2][3]=0;
          tab[2][4]=0;
          tab[2][5]=0;
          tab[2][6]=0;
          tab[2][7]=6;
          tab[2][8]=0;
          tab[3][0]=8;
          tab[3][1]=0;
          tab[3][2]=0;
          tab[3][3]=0;
          tab[3][4]=6;
          tab[3][5]=0;
          tab[3][6]=0;
          tab[3][7]=0;
          tab[3][8]=3;
          tab[4][0]=4; //4,0,0,8,0,3,0,0,1 [4]
          tab[4][1]=0;
          tab[4][2]=0;
          tab[4][3]=8;
          tab[4][4]=0;
          tab[4][5]=3;
          tab[4][6]=0;
          tab[4][7]=0;
          tab[4][8]=1;
          tab[5][0]=7; //7,0,0,0,2,0,0,0,6 [5]
          tab[5][1]=0;
          tab[5][2]=0;
          tab[5][3]=0;
          tab[5][4]=2;
          tab[5][5]=0;
          tab[5][6]=0;
          tab[5][7]=0;
          tab[5][8]=6;
          tab[6][0]=0; //0,6,0,0,0,0,2,8,0 [6]
          tab[6][1]=6;
          tab[6][2]=0;
          tab[6][3]=0;
          tab[6][4]=0;
          tab[6][5]=0;
          tab[6][6]=2;
          tab[6][7]=8;
          tab[6][8]=0;
          tab[7][0]=0; //0,0,0,4,1,9,0,0,5 [7]
          tab[7][1]=0;
          tab[7][2]=0;
          tab[7][3]=4;
          tab[7][4]=1;
          tab[7][5]=9;
          tab[7][6]=0;
          tab[7][7]=0;
          tab[7][8]=5;
          tab[8][0]=0; //0,0,0,0,8,0,0,7,9 [8]
          tab[8][1]=0;
          tab[8][2]=0;
          tab[8][3]=0;
          tab[8][4]=8;
          tab[8][5]=0;
          tab[8][6]=0;
          tab[8][7]=7;
          tab[8][8]=9;

          for(i=0;i<=8;i++)
          {
          for(j=0;j<=8;j++)
          {
          if (tab[i]=i && tab[j]=j)

          cout<<"erreur!try again"<<endl;

          else

          cout<<"reponse correcte!"<<endl;
          }
          }
          return 0;
          }
          0
          1. mais quand j'ecris == les erreurs augmentent
            0
            1. Modérateur
              C'est parce qu'à mon avis tu n'écris pas ce que tu veux obtenir !!!
              Je pense que tu veux faire ce genre de code :
              for (int k=0; k<9; k++)
              for (int i1=0; i1<9; i1++)
              for (int i2=i1+1; i2<9; i2++)
              {
                  if (tab[i1][k]==tab[i2][k])
                       std::cout << "erreur ! try again" << endl;
                  else std::cout << "reponse correcte !" << endl;
              }
              Sinon il va falloir que tu expliques (en français) ce que tu veux pour qu'on puisse t'aider !
              0
          2. Modérateur
            Soit tu fais
            int tab [9][9]; // Attention pas de = ici
            tab[0][0]=5;
            tab[0][1]=3;
            tab[0][2]=0;
            tab[0][3]=0;
            tab[0][4]=7;
            Soi tu fais
            int tab [9][9]={ 5, 3, 0, 0, 7, 0, 0, 0, 0,
                             6, 0, 0, 1, 9, 5, 0, 0, 0,
                             0, 9, 8, 0, 0, 0, 0, 6, 8,
            
                             ...
            
                           }; // ne pas oublier le ;
            Les deux méthodes (bien utilisées) donnent le même résultat
            Quand tu fais tab[9][9]; toutes les cases sont initialisées à 0 puis tu les modifies une à une
            Quand tu fais tab[9][9]={ ... } les cases sont initialisées avec les valeurs précisées dans les accolades, éventuellement avec des 0 pour compléter...

            Avec ton code, toujours pareil : if (tab[i]=i && tab[j]=j) ne donne pas ce que tu veux
            Pour comparer deux valeurs on utilise ==, l'opérateur = c'est pour l'affectation
            De plus i est un entier et tab[i] est un tableau, utilise tab[i][j]==i par exemple...
            0
            1. merciii
              tu veux dire que cette maniere int tab[9][9]={5, 3, 0, 0, 7, 0, 0, 0, 0,
              6, 0, 0, 1, 9, 5, 0, 0, 0,
              0, 9, 8, 0, 0, 0, 0, 6, 8, .... est la meme que la maniere que j'ai ecrit: tab[0][0]=5;
              tab[0][1]=3;
              tab[0][2]=0;
              tab[0][3]=0;
              tab[0][4]=7;
              tab[0][5]=0 ???

              voici le code mais avec 5 erreurs seulement :)

              #include<iostream>
              using namespace std;

              void main()
              {
              int tab [9][9];
              int i;
              int j; //i is for les colonnes et j for les lignes.

              {
              for(i=0;i<=8;i++)
              {
              for(j=0;j<=8;j++)
              {
              }
              }
              }

              int tab [9][9]=
              tab[0][0]=5;
              tab[0][1]=3;
              tab[0][2]=0;
              tab[0][3]=0;
              tab[0][4]=7;
              tab[0][5]=0;
              tab[0][6]=0;
              tab[0][7]=0;
              tab[0][8]=0;
              tab[1][0]=6;
              tab[1][1]=0;
              tab[1][2]=0;
              tab[1][3]=1;
              tab[1][4]=9;
              tab[1][5]=5;
              tab[1][6]=0;
              tab[1][7]=0;
              tab[1][8]=0;
              tab[2][0]=0;
              tab[2][1]=9;
              tab[2][2]=8;
              tab[2][3]=0;
              tab[2][4]=0;
              tab[2][5]=0;
              tab[2][6]=0;
              tab[2][7]=6;
              tab[2][8]=0;
              tab[3][0]=8;
              tab[3][1]=0;
              tab[3][2]=0;
              tab[3][3]=0;
              tab[3][4]=6;
              tab[3][5]=0;
              tab[3][6]=0;
              tab[3][7]=0;
              tab[3][8]=3;
              tab[4][0]=4;
              tab[4][1]=0;
              tab[4][2]=0;
              tab[4][3]=8;
              tab[4][4]=0;
              tab[4][5]=3;
              tab[4][6]=0;
              tab[4][7]=0;
              tab[4][8]=1;
              tab[5][0]=7;
              tab[5][1]=0;
              tab[5][2]=0;
              tab[5][3]=0;
              tab[5][4]=2;
              tab[5][5]=0;
              tab[5][6]=0;
              tab[5][7]=0;
              tab[5][8]=6;
              tab[6][0]=0;
              tab[6][1]=6;
              tab[6][2]=0;
              tab[6][3]=0;
              tab[6][4]=0;
              tab[6][5]=0;
              tab[6][6]=2;
              tab[6][7]=8;
              tab[6][8]=0;
              tab[7][0]=0;
              tab[7][1]=0;
              tab[7][2]=0;
              tab[7][3]=4;
              tab[7][4]=1;
              tab[7][5]=9;
              tab[7][6]=0;
              tab[7][7]=0;
              tab[7][8]=5;
              tab[8][0]=0;
              tab[8][1]=0;
              tab[8][2]=0;
              tab[8][3]=0;
              tab[8][4]=8;
              tab[8][5]=0;
              tab[8][6]=0;
              tab[8][7]=7;
              tab[8][8]=9;

              for(i=0;i<=8;i++)
              {
              for(j=0;j<=8;j++)
              {
              if (tab[i]=i && tab[j]=j)

              cout<<"erreur!try again"<<endl;

              else

              cout<<"reponse correcte!"<<endl;
              }
              }
              return 0;
              }

              les erreurs sont :1-'tab' : redefinition
              2-'initializing' : cannot convert from 'int' to 'int [9][9]'
              There are no conversions to array types, although there are conversions to references or pointers to arrays //je ne comprends pas qu'est ce qu'il veut
              3-'=' : cannot convert from 'bool' to 'int [9]'
              4-'main' : 'void' function returning a value.
              5- see declaration of 'main'

              est ce que ce code est valide pour executer un sudoku ou je dois ajouter qq chose ???
              merci d'avance
              0
              1. Modérateur
                Déjà, je pense que tu aurais intérêt à utiliser ce genre de déclaration pour tab[9][9] :
                    int tab[9][9]={5, 3, 0, 0, 7, 0, 0, 0, 0,
                                   6, 0, 0, 1, 9, 5, 0, 0, 0,
                                   0, 9, 8, 0, 0, 0, 0, 6, 8,
                                   ...
                                  };
                Pour la suite du code, voici une GROSSE erreur !!! et sa correction :
                tab[i]=i & tab[j]=j // en C, ça ne fera pas du tout ce que tu veux !
                tab[i]==i && tab[j]==j // ça c'est bien mieux !

                0
                1. en faite voici mon code main avec 7 erreurs:
                  l'idee que j'ai eu durant l'ecriture de mon code est d'inserer les nombres fixes du jeu et laisser les cases vides pour que l'utilisateur met ses reponses dedans NB lesa cases vide je les ai mis a zero je ne sais pas si c juste ou faux. :

                  #include<iostream>
                  using namespace std;

                  void main()
                  {
                  int tab [9][9];
                  int [9][9];
                  int i;
                  int j; //i is for les colonnes et j for les lignes.

                  {
                  for(i=0;i<=9;i++)
                  {
                  for(j=0;j<=9;j++)
                  {
                  }
                  }
                  }

                  int [9][9]=
                  {tab[0][0]=5;
                  tab[0][1]=3;
                  tab[0][2]=0;
                  tab[0][3]=0;
                  tab[0][4]=7;
                  tab[0][5]=0;
                  tab[0][6]=0;
                  tab[0][7]=0;
                  tab[0][8]=0;
                  tab[1][0]=6;
                  tab[1][1]=0;
                  tab[1][2]=0;
                  tab[1][3]=1;
                  tab[1][4]=9;
                  tab[1][5]=5;
                  tab[1][6]=0;
                  tab[1][7]=0;
                  tab[1][8]=0;
                  tab[2][0]=0;
                  tab[2][1]=9;
                  tab[2][2]=8;
                  tab[2][3]=0;
                  tab[2][4]=0;
                  tab[2][5]=0;
                  tab[2][6]=0;
                  tab[2][7]=6;
                  tab[2][8]=0;
                  tab[3][0]=8;
                  tab[3][1]=0;
                  tab[3][2]=0;
                  tab[3][3]=0;
                  tab[3][4]=6;
                  tab[3][5]=0;
                  tab[3][6]=0;
                  tab[3][7]=0;
                  tab[3][8]=3;
                  tab[4][0]=4;
                  tab[4][1]=0;
                  tab[4][2]=0;
                  tab[4][3]=8;
                  tab[4][4]=0;
                  tab[4][5]=3;
                  tab[4][6]=0;
                  tab[4][7]=0;
                  tab[4][8]=1;
                  tab[5][0]=7;
                  tab[5][1]=0;
                  tab[5][2]=0;
                  tab[5][3]=0;
                  tab[5][4]=2;
                  tab[5][5]=0;
                  tab[5][6]=0;
                  tab[5][7]=0;
                  tab[5][8]=6;
                  tab[6][0]=0;
                  tab[6][1]=6;
                  tab[6][2]=0;
                  tab[6][3]=0;
                  tab[6][4]=0;
                  tab[6][5]=0;
                  tab[6][6]=2;
                  tab[6][7]=8;
                  tab[6][8]=0;
                  tab[7][0]=0;
                  tab[7][1]=0;
                  tab[7][2]=0;
                  tab[7][3]=4;
                  tab[7][4]=1;
                  tab[7][5]=9;
                  tab[7][6]=0;
                  tab[7][7]=0;
                  tab[7][8]=5;
                  tab[8][0]=0;
                  tab[8][1]=0;
                  tab[8][2]=0;
                  tab[8][3]=0;
                  tab[8][4]=8;
                  tab[8][5]=0;
                  tab[8][6]=0;
                  tab[8][7]=7;
                  tab[8][8]=9;}

                  for(i=0;i<=8;i++)
                  {
                  for(j=0;j<=8;j++)
                  {
                  if (tab[i]=i & tab[j]=j)
                  {
                  cout<<"erreur!try again"<<endl;
                  }
                  else cout<<"reponse correcte!"<<endl;
                  }
                  }

                  return 0 ;
                  }
                  0
                  1. Modérateur
                    Apparement ton fichier se termine trop tôt, as-tu fermer toutes tes accolades ?
                    Si tu utilises une ou plusieurs classes, as-tu penser au ";" à la fin de chaque classe ?
                    0