Se connecter avec
S'enregistrer | Connectez-vous

C++ erreur de calcul apparemment

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte

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 ^^

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.
Lassé par la pub ? Créez un compte
Tom's guide dans le monde