Se connecter / S'enregistrer
Votre question

C++ erreur de calcul apparemment

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
6 Juillet 2006 03:26:17

bonsoir,

je suis entrain de créer un générateur de serials pour mes programmes, en fait il génère 25 nombres, et l'addition des chiffres de 5 en 5 fais toujours 10 (par exemple 80011 puis 90100 puis 43111 etc...). ça fonctionne a peu près bien, mais j'ai ajouté une petite fonctionalité qui permet de créer des serials en chaine (on donne le nombre qu'on veut, et il nous génère ce nombre de serials), seulement il arrive fréquemment que avant qu'il ait fini la génération, le programme se fige, ça doit être a cause d'une erreur de calcul dans le code mais je ne vois absolument pas laquelle, et le programme ne se fige pas au mm endroit (1er essais : 39 serials générés sur 100; 2ième essais : 96 serials générés sur 100; 3ième essais : 6 serials générés sur 100). de là, pas besoin d'être savant pour comprendre que c'est en fonction des nombres générés que ça plante ^^.
voici le code :

  1. #include <iostream>
  2. #include <conio.h>
  3. #include <fstream>
  4. #include <sstream>
  5. using namespace std;
  6.  
  7. string cvrtIntToStr(int value)
  8. {
  9. stringstream convertissable;
  10. convertissable<<value;
  11. return convertissable.str();
  12. }
  13.  
  14. int main()
  15. {
  16. bool alreadyExist;
  17. srand((int)time(NULL));
  18. int nbOfKeysToGenerate;
  19. cout<<"Entrer the number of keys to generate : ";
  20. cin>>nbOfKeysToGenerate;
  21. int i = 0;
  22. while(i<nbOfKeysToGenerate)
  23. {
  24. if(alreadyExist==false)
  25. {
  26. i++;
  27. }
  28. alreadyExist = false;
  29. string testLine = "";
  30. string szOutputCode;
  31. ofstream file_w("generated.keys",ios_base::app);
  32. ifstream file_r("generated.keys");
  33. int nCode[5] = {0,0,0,0,0};
  34. for(int nP=0;nP<5;nP++)
  35. {
  36. int nKeyCode[5];
  37. int nMaxNumbers = 0;
  38. for(int n=0;n<5;n++)
  39. {
  40. nKeyCode[n] = rand()%(9 - nMaxNumbers);
  41. nMaxNumbers += nKeyCode[n];
  42. }
  43. for(int n=0;n<10-nMaxNumbers;n++)
  44. {
  45. nKeyCode[n]++;
  46. if(n==5)
  47. {
  48. n = 0;
  49. }
  50. }
  51. for(int n=0;n<5;n++)
  52. {
  53. cout<<nKeyCode[n];
  54. szOutputCode += cvrtIntToStr(nKeyCode[n]);
  55. }
  56. }
  57. cout<<'\n';
  58. while(!file_r.eof())
  59. {
  60. file_r>>testLine;
  61. if(testLine == szOutputCode)
  62. {
  63. cout<<"Key already using"<<'\n';
  64. alreadyExist = true;
  65. }
  66. }
  67. if(alreadyExist == false)
  68. {
  69. file_w<<szOutputCode;
  70. file_w<<'\n';
  71. }
  72. }
  73. }


voilà j'espère que quelqu'un pourra m'aider, merci !

Autres pages sur : erreur calcul apparemment

6 Juillet 2006 15:17:35

Honnêtement il faudrait que tu nous donne ton algorithme pour nous aider. Dur à comprendre comme ça. Vais essayer de trouver l'erreur quand même
6 Juillet 2006 16:23:15

c'est bon j'ai trouvé!! en fait c'était une erreur toute bête, et par la même occasion j'en ai trouvé une deuxième :

  1. for(int n=0;n<10-nMaxNumbers;n++)
  2. {
  3. nKeyCode[n]++;
  4. if(n==5)
  5. {
  6. n = 0;
  7. }
  8. }


ici, quand le total des 5 nombres généré est plus petit que 10, je stocke la valeur totale à ajouter dans n, je l'utilise pour le nombre de fois que la boucle doit s'exécuter, et je l'utilise aussi comme indice du tableau auquel on doit faire une incrémentation, mais si n devient = à 5 je le remet à 0 sinon l'indice du tableau ne serait pas valide, ce que je n'avais pas pensé c'est que la boucle allait revenir à zéro et donc se réexécuter sans arrêt. il suffit juste que je stocke l'indice du tableau dans une autre variable qui n'est pas utilisée pour le nombre de boucles à exécuter.

la deuxième erreur est moins grave, mais quand même présente, elle ne vérifie pas si le nombre de la case actuelle du tableau est plus petit que 9, car si elle est égale à 9, il va me générer 10 donc 6 chiffres au lieu de 5.

voilà merci quand même ^^
Contenus similaires
Pas de réponse à votre question ? Demandez !
6 Juillet 2006 20:36:46

Par contre il y a deux trois petits erreurs de programmation pas méchante ici. Comme tu ouvre tous le temps ton fichier (le open est dans la boucle), alors que tu ferai mieux de l'ouvrir une foi pour toute AVANT la boucle (d'ailleur tu peux l'ouvrir en lecture/écriture pour éviter deux objets) et surtour ne pas oublier de le fermer.
7 Juillet 2006 00:56:43

oui tu as raison, par contre il me semble avec ifstream et ofstream il n'est pas nécéssaire de fermer le fichier (du moins je ne l'ai jamais vu dans un code source)
a b L Programmation
7 Juillet 2006 13:13:43

Je pense qu'il faut mettre le close() à la fin, car ça force l'écriture dans le fichier (comme le fflush() en C).
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS