Mon premier programme c++... deja une erreur bisarre

Mon premier programme c++... deja une erreur bisarre - C++ - Programmation

Marsh Posté le 28-08-2006 à 17:18:28    

Bonjour j ai souvent programmé en php et en maple (pour ceux qui connaissent)...  
Je tente la de créer un programme qui permettra de resoudre un sudoku.
le code de celui ci est le suivant:

Code :
  1. // sudoku.cpp : fichier projet principal.
  2. #include "stdafx.h"
  3. #include <iostream>
  4. using namespace std;
  5. int verifier(int mat[9][9])
  6. {int temp1[10],temp2[10],temp3[10],l,c,ok=1,i,h=0,v=0;
  7. for (l=0;l<9;l++)
  8. {
  9.  for (c=0;c<9;c++)
  10.  {
  11.   if (temp1[mat[l][c]]==1) ok=0;
  12.   if (temp1[mat[l][c]]!=1 && mat[l][c]!=0)temp1[mat[l][c]]=1;
  13.   if (temp2[mat[c][l]]==1) ok=0;
  14.   if (temp2[mat[c][l]]!=1 && mat[c][l]!=0)temp2[mat[c][l]]=1;
  15.  }
  16.  for (i=0;i<10;i++)
  17.  {
  18.   temp1[i]=0;
  19.   temp2[i]=0;
  20.  }
  21. }
  22. for (h=0;h<7;h=h+3)
  23. {for (v=0;v<7;v=v+3)
  24. {
  25.  for (l=0;l<3;l++)
  26. {
  27.  for (c=0;c<3;c++)
  28.  {
  29.   if (temp3[mat[l+v][c+h]]==1) ok=0;
  30.   if (temp3[mat[l+v][c+h]]!=1 && mat[l+v][c+h]!=0)temp3[mat[l+v][c+h]]=1;
  31.  }
  32. }
  33. for (i=0;i<10;i++)
  34.  temp3[i]=0;
  35. }}
  36. return ok;
  37. }
  38. void afficher(int mat[9][9])
  39. {
  40. int ligne,colonne;
  41. for (ligne=0;ligne<9;ligne++)
  42. {
  43. for (colonne=0;colonne<9;colonne++)
  44. cout<<mat[ligne][colonne];
  45. cout<<endl;
  46. }
  47. }
  48. int main()
  49. {
  50. int mat[9][9],free[9][9],ligne=0,colonne=0;
  51. for (ligne=0;ligne<9;ligne++)
  52. {
  53. for (colonne=0;colonne<9;colonne++)
  54.  mat[ligne][colonne]=0;
  55. }
  56. for (ligne=0;ligne<9;ligne++)
  57. {
  58. for (colonne=0;colonne<9;colonne++)
  59. {
  60.  if (mat[ligne][colonne]==0)free[ligne][colonne]=1;
  61.  if (free[ligne][colonne]==1)
  62.  {
  63.   mat[ligne][colonne]=mat[ligne][colonne]++;
  64.   if(verifier(mat)==0 && mat[ligne][colonne]<9)colonne=colonne-1;
  65.   else if(verifier(mat)==0 && mat[ligne][colonne]==9)
  66.   {
  67.    mat[ligne][colonne]=0;
  68.    colonne=colonne-2;
  69.    if(colonne==-2 && ligne!=0)
  70.     {
  71.     colonne=7;ligne=ligne-1;
  72.     }
  73.    while (free[ligne][colonne+1]!=1)
  74.    {
  75.     colonne=colonne-1;
  76.     if(colonne==-2 && ligne!=0)
  77.     {
  78.     colonne=7;ligne=ligne-1;
  79.     }
  80.    }
  81.   }
  82.   system("cls" );
  83.   afficher(mat);
  84.  }
  85. }
  86. }
  87. system("PAUSE" );
  88. }


 
Lorsque je le lance j obtient une erreur/L'Assistant Débogage managé 'FatalExecutionEngineError' a détecté un problème dans 'f:\Mes documents\Visual Studio 2005\Projects\sudoku\debug\sudoku.exe'.
Informations supplémentaires : Le runtime a rencontré une erreur irrécupérable. L'adresse de l'erreur était 0x79e75f3e sur le thread 0xc34. Le code d'erreur est 0xc0000005.
 
Je ne sais pas d ou peut provenir cette erreur. dans la fenetre du programme on obtient
123456789
456129000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
 
Si vous arrivez a demeller tout ca, merci de votre aide

Reply

Marsh Posté le 28-08-2006 à 17:18:28   

Reply

Marsh Posté le 28-08-2006 à 17:43:12    

Il y a peut etre un soucis dans la mémoire car lorsque je met une pause entre chaque boucle pour verifier ce qui se passe, j obtiens pas le meme resultat

Reply

Marsh Posté le 28-08-2006 à 17:59:29    

Code :
  1. free[9][9]


 
free n'est-il pas un mot réservé ?


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-08-2006 à 18:29:15    

free non... j ai trouvé mon soucis: il arrivait que sur un retour arriere, un nombre passe au dessus de 9 et donc sortait du tableau temp1 ou temp2..
 
je crois que c est ce qu on apelle un dépassement de pile.

Reply

Marsh Posté le 28-08-2006 à 23:25:25    

Pour éviter ce genre de désagréments, je te conseille d'utiliser un std::vector<std::vector<int> >

Reply

Marsh Posté le 28-08-2006 à 23:26:52    

haazheel a écrit :

Pour éviter ce genre de désagréments, je te conseille d'utiliser un std::vector<std::vector<int> >


déjà des constantes, et des commentaires...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-08-2006 à 23:27:55    

jagstang a écrit :

Code :
  1. free[9][9]


 
free n'est-il pas un mot réservé ?


 
"free" non, mais "delete"oui, en c++.


---------------
Töp of the plöp
Reply

Marsh Posté le 28-08-2006 à 23:29:17    

_darkalt3_ a écrit :

"free" non, mais "delete"oui, en c++.


je m'en étais rendu compte nerci


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 29-08-2006 à 00:34:07    

smam a écrit :

Il y a peut etre un soucis dans la mémoire car lorsque je met une pause entre chaque boucle pour verifier ce qui se passe, j obtiens pas le meme resultat


Faut dire que tu fais du "sans filet", là. Du C++ de débutant pour sûr.
Au minimum, vire tous les chiffres et travaille avec des constantes.
Juste un truc, ça ne sert à rien de passer la taille des tableaux dans les définitions de fonctions, comme #
int verifier(int mat[9][9]), ce que tu passes, ce sont des pointeurs, donc le compilo ne connait pas la taille des tableaux. Au mieux la 2e taille.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 29-08-2006 à 01:35:41    

donc je garde juste verifier(int mat)?

Reply

Marsh Posté le 29-08-2006 à 01:35:41   

Reply

Marsh Posté le 30-08-2006 à 23:26:56    

Non, au contraire, il faut passer les 2 dimensions.
Enfin, ton truc, ça marche uniquement avec les tableaux statiques, mais c'est tout (et encore, j'en suis pas sûr).
En fait, je crains que ton programme ne soit entièrement faux...
 

Code :
  1. void print (int m, int n, float *t)
  2. {
  3. for (int i = 0; i < m; ++i) {
  4.  cout << "[ ";
  5.  for (int j = 0; j < n; ++j) {
  6.   cout << t[i*n+j] << '\t';
  7.  }
  8.  cout << " ]" << endl;
  9. }
  10. }
  11. #define L = 2
  12. #define C = 3
  13. float[L][C] f = {{1,2,3},{4,5,6}}; // ou l'inverse, me souviens jamais
  14. print(L, C, &f[0][0]);


 
et lis bien cette page, qui t'explique (entre autres) étape par étape comment coder avec des tableaux 2D.
http://www.parashift.com/c++-faq-l [...] -mgmt.html


Message édité par el muchacho le 30-08-2006 à 23:32:28

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 10-09-2006 à 14:05:44    

Au pire tu peux ajouter des assertions au code pour détecter des sorties d'indice.
 
Mais bon, ça fait longtemps que j'essaie d'éviter les tableaux. Trop risqué sans un système de contrôle.


Message édité par slash33 le 10-09-2006 à 14:08:36
Reply

Sujets relatifs:

Leave a Replay

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