Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

Permettre un nombre d'itération infini sous Dev-C++



  1. #1
    LicenceXP

    Permettre un nombre d'itération infini sous Dev-C++


    ------

    Bonsoir !

    J'ai un soucis sous Dev-C++, en effet je fais tourner sous celui-ci un script qui ne prend fin qu'après obtention d'un résultat hautement hypothétique (comprenez : il est possible qu'il n'y ai pas de solution au problème proposé). Mon ennui : la boucle qui constitue le script est rejouée un nombre de fois limité et les calculs s'arretent ! J'aimerai pouvoir laisser mon ordinateur plusieurs jours sur le problème, comment faire ? On dirait que Dev-C++ réalise après un nombre x d'itérations qu'il n'y a peut-être pas de solution au programme et qu'il le bloque pour éviter de tourner indéfiniment ! Comment empêcher ça !?

    -----

  2. Publicité
  3. #2
    PHENIXian

    Re : Permettre un nombre d'itération infini sous Dev-C++

    MMM pour autant que je me rappelle mon C++ (vive fortran.... ou pas mais pas le choix), en C le garbage collector est pas automatique... traduction est tu sur de bien desallouer tes objets proprement, car sinon la memoire peut saturer et ca peut te faire finir ton pg.

    Pour le voir tres simple ouvres le gestionnaire de taches (CTRL ALT SUPPR) va dans processus, lances ton programme et trouves le. Si la memoire augmente sans s'arreter tu as un pb
    "All your base are belong to us"
    OLFQJTLM

  4. #3
    Pole

    Re : Permettre un nombre d'itération infini sous Dev-C++

    On peut faire des boucles infinies.
    Et dans ton programme précédent il le fait.
    Il met le curseur qui clignote et il calcule.
    Mais comme il ne trouve pas de résultat, il n'affiche rien.
    Essaye de lui demander d'afficher plus souvent et tu verras que tn programme tourne même s'il semble planté.

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  5. #4
    fderwelt

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Bonjour,

    Il n'y a pas de raison pour qu'on ne puisse pas faire de boucle infinie, exemple:
    Code:
    while (true) puts ("Hello, world!") ;
    Comme dit PHENIXian c'est sûrement un problème de débordement de pile (en principe c'est détecté par le système et ça lance une exception, peut-être pas avec Dev-C++) ou de heap (là ça dépend un peu beaucoup de microsoft...)

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  6. A voir en vidéo sur Futura
  7. #5
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    J'ai numéroté chaque itération et je demande au programme d'afficher le numéro de l'itération après chaque boucle => s'il tournait de manière continue, il devrait m'afficher des numéro à l'infini. Or ce qui se passe c'est qu'il affiche les numéro de 1 à 30 ou de 1 à 45 (c'est variable, mais pourquoi ??) et puis un curseur qui clignote effectivement...

  8. #6
    fderwelt

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Si tu l'exécutes dans une fenêtre console, c'est peut-être le driver qui bloque l'affichage quand la fenêtre est pleine, pour qu'on puisse lire. Alors ça dépend de la taille des caractères, de la fenêtre...

    Mais je n'y crois pas trop.

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  9. Publicité
  10. #7
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Il n'y a pas de réponse unique à un plantage...
    Phenixian t'a indiquer comment il fallait faire pour voir si il n'y avait pas de problème d'allocation mal faites, si la mémoire occupée par ton programme n'augementait pas de façon déraisonnable.
    Mais il y a plein d'autres raison possibles pour un blocage... en fait il y en a presque autant que de blocage.

    Si le code que tu fais tourner est celui auquel je pense (http://forums.futura-sciences.com/po...50.html#795350) alors retravaille pour le rendre lisible...
    8 boucles les unes dans les autres ce n'est pas lisible.
    8 espaces à chaque indentation ce n'est pas non plus très raisonnable.
    La combinaison des 2 devient catastrophique.
    Utilise des fonction même si tu as l'impression que c'est complètement superflu. Donnes des noms qui sont parlant à tes fonctions (même si cela prend beaucoupe de caractères) de façon à ce que tu puisses toujours savoir qu'est-ce qui est sensé faire quoi sans que tu es besoin de te creuser le crane.
    Vérifie indépendemment chacune des fonctions que tu auras définies pour vérifier qu'elle font ce que tu veux qu'elles fassent. Fait des impressions de tes variables pour t'assurer que le déroulement du programme correspond bien à ce à quoi tu t'attends.

    Une fois que tu auras fait cela, il est vraissemblable qu'il n'y aura plus vraiment de bug dans ton programme.

    Si le trouble persiste, reposte le source code de ton programme et je suis sur que quelqu'un pourra le regarder à tête reposée et te dire ce qui ne va pas.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  11. #8
    Pole

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Essaye ceci. J'ai juste enlevé des int en trop.Ca a l'air de marcher.
    Code:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int end=1;
        int compteur=1;
        int max=500;
        int a,b,c,d,e,g,ligne1,colonne1;
        while (end==1) {
              a=1+rand()%max;
              b=1+rand()%max;
              while (b==a)
                    b=1+rand()%max;  
              c=1+rand()%max;
              while (c==a || c==b)
                    c=1+rand()%max;
              ligne1=a*a+b*b+c*c;
              d=1+rand()%max;
              while (d==a || d==b || d==c)d=1+rand()%max;
              g=1+rand()%max;
              while (g==a || g==b || g==c || g==d)
                    g=1+rand()%max;
              colonne1=a*a+d*d+g*g;
              if (colonne1==ligne1) {
                                    e=1+rand()%max;
                                    while (e==a || e==b || e==c || e==d || e==g)
                                          e=1+rand()%max;
                                    int diagonale1=g*g+e*e+c*c;
                                    if (diagonale1==ligne1) {
                                                            int i=1+rand()%max;
                                                            while (i==a || i==b || i==c || i==d || i==g || i==e)
                                                                  i=1+rand()%max;
                                                            int diagonale2=a*a+e*e+i*i;
                                                            if (diagonale2==ligne1) {
                                                                                    int boucle=1;
                                                                                    while (boucle<=max) {
                                                                                        if (boucle!=a && boucle!=b && boucle!=c && boucle!=d && boucle!=e && boucle!=g && boucle!=i) {
                                                                                                      int f=boucle;
                                                                                                      int ligne2=d*d+e*e+f*f;
                                                                                                      if (ligne2==ligne1) {
                                                                                                                          int colonne3=c*c+f*f+i*i;
                                                                                                                          if (colonne3==ligne1) {
                                                                                                                                                int boucle_seconde=1;
                                                                                                                                                while (boucle_seconde<=max) {
                                                                                                                                                      if (boucle_seconde!=a && boucle_seconde!=b && boucle_seconde!=c && boucle_seconde!=d && boucle_seconde!=e && boucle_seconde!=f && boucle_seconde!=g && boucle_seconde!=i) {
                                                                                                                                                            int h=boucle_seconde;
                                                                                                                                                            int ligne3=g*g+h*h+i*i;
                                                                                                                                                            if (ligne3==ligne1) {
                                                                                                                                                                                int colonne2=b*b+e*e+h*h;
                                                                                                                                                                                if (colonne2==ligne1) {
                                                                                                                                                                                                      boucle_seconde+=max;
                                                                                                                                                                                                      boucle+=max;
                                                                                                                                                                                                      end=0;
                                                                                                                                                                                                      cout<<a*a<<" "<<b*b<<" "<<c*c<<endl;
                                                                                                                                                                                                      cout<<d*d<<" "<<e*e<<" "<<f*f<<endl;
                                                                                                                                                                                                      cout<<g*g<<" "<<h*h<<" "<<i*i<<endl;
                                                                                                                                                                                }
                                                                                                                                                                                else
                                                                                                                                                                                    boucle_seconde++;
                                                                                                                                                            }
                                                                                                                                                            else
                                                                                                                                                                boucle_seconde++;
                                                                                                                                                      }
                                                                                                                                                      else
                                                                                                                                                          boucle_seconde++;
                                                                                                                                                }
                                                                                                                                                cout<<compteur<<" ";
                                                                                                                                                compteur++;
                                                                                                                          }
                                                                                                                          else
                                                                                                                              boucle++;
                                                                                                      }
                                                                                                      else
                                                                                                          boucle++;
                                                                                        }
                                                                                        else
                                                                                            boucle++;
                                                                                    }
                                                            }
                                                            else {
                                                                 cout<<compteur<<" ";
                                                                 compteur++;
                                                            }
                                    }
                                    else {
                                         cout<<compteur<<" ";
                                         compteur++;
                                    }
              }
              else {
                   cout<<compteur<<" ";
                   compteur++;
              }
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Déclare tes variables au tout début et c'est bon. Je suis allé à plus de 50000 et ca continuait.

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  12. #9
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Le programme que j'utilise mnt n'est plus celui-là (j'ai trouvé plus simple ), néanmoins je pense avoir une idée de pourquoi il bloque aussi : je cherche à savoir si un nombre est un entier :

    est_ce_entier_float=sqrt(g*g+c *c-b*b);
    est_ce_entier_int=est_ce_entie r_float;
    soustraction=est_ce_entier_flo at-est_ce_entier_int;

    Reste à savoir si soustraction vaut 0.0 ou autre chose. Seulement stocker un float dans un entier pour le convertir n'est pas très... Dev-C++ me l'accepte mais me fait remarquer que c'est pas très correct. je pense que le problème veint de là.

  13. #10
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Si tu veux savoir si g*g+c*c_b*b est le carré d'un nombre entier (je suppose que g,c et b sont des enties) alors effectivement ce nest pas la bonne façon de procéder. Tester une égalitée de nombre flottant n'est jamais une bonne idée.


    Une meilleur façon de procéder c'est plutot quelquechose comme cela ;

    long nombre = g*g+c*c-b*b;
    long racine = (long)sqrt(nombre);
    if (racine*racine == nombre) {
    printf("nombre est un carré");
    }
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  14. #11
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Ca n'a pas marché, j'ai tjs un arrêt des calculs et apparition d'un curseur clignotant J'ai essayé alors une simple boucle infinie du type :

    while(end==1) cout<<1+1<<endl;


    Et ça ne pose pas de problème, l'ordinateur m'affiche 2222222222222 durant des heures.

    Voici un code simplifié pour lequel il n'y a priori pas d'erreur et qui refuse de tourner à l'infini.

    Code:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int end=1, compteur=1, max=5000, g, e, c;
        float condition_basse, condition_haute;  
        srand(time(NULL));
        while (end==1) {
              g=1+rand()%max;
              e=1+rand()%max;
              while (e==g) e=1+rand()%max;
              c=1+rand()%max;
              while(c>=e || c>=g) c=1+rand()%max;
              if (g>e) condition_basse=sqrt(g*g-c*c);
              else condition_basse=sqrt(e*e-c*c);
              if (((c*c)/(g*g))<1) condition_haute=sqrt(g*g+c*c);
              else condition_haute=sqrt(2)*g;
              cout<<compteur<<endl;
              compteur++;
        }
        
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    J'ai de plus en plus l'impression que c'est lié à la fonction rand(), en effet le nombre d'itérations est fixe quand je ne tape pas srand(time(NULL)); et vaut 480. Si je tape par contre cette commande, le nombre d'itérations est variable !

  15. #12
    Philder

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Salut je ne sais pas exactement ce que tu cherches a faire mais ton programme bloque parceque a un moment G ou E est egal a 1, et donc tu ne peux pas trouver de C inferieur, donc tu bloques sur ton
    while (c...)

  16. Publicité
  17. #13
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Cest cettte boucle qui pose problème :
    Code:
    while(c>=e || c>=g) c=1+rand()%max;
    Lorsque g ou e valent 1 alors tu ne peux pas trouver de la valeur de c qui satisfasse la condition.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  18. #14
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Je suis un imbécile

    Merci bcp ! Je vais voir si ça marche mnt.

  19. #15
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Effectivement, ça marche !

  20. #16
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Citation Envoyé par LicenceXP Voir le message
    Je suis un imbécile t.
    Mais non !!!
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  21. #17
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    C'est mignon

    Question : est-ce une opération autorisée que de comparer un float et un int ?

  22. #18
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    oui, c'est autorisé...
    Le int est aors converti en float avant de faire la comparaison.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  23. Publicité
  24. #19
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Merci Mon script final fonctionne enfin comme je le souhaite. Mais il m'a déjà trouvé des solutions en quelques minutes ! J'ai été très surpris avant de réaliser que les solutions offertes marchent jusqu'à la 5ème virgule... Autrement dit les calculs faits manquent de précision -_-.

    Sans vouloir abuser, y a-t-il moyen d'arranger ça ?

  25. #20
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Ben, je dois bien avouer que je n'ai pas vraiment cherché à comprendre ce que tu trafiquais mais il me semble que tout ce que tu fais se contenterais dun travail avec de entiers. L'avantage de travailler uniquement avec des entiers c'est qu'il n'y a pas d'erreur de calcul ou d'arrondi.

    Je pense que tu peux enlever tout ce qui est racine carré et le remplacer par une comparaison sur les carrés.

    par exemple pour savoir si un point x,y est à l'intérieur d'un cercle de rayon R, dans la mesure où x,y et R sont des entiers, tu as interêt à faire
    if (x*x +y*y <R*R ) { ...
    au lieu de
    if (sqrt(x*x+y*y) <R) {...
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  26. #21
    Pole

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Utilise des double ou des long double de précision de 15 et 20 chiffres.
    Et si utilise que des entiers, c'est bien mieux de les utiliser (plus rapide et comme le dit zoup1, pas d'erreur d'arrondi)

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  27. #22
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Le fait est que je dois pouvoir vérifier si la racine d'un entier est toujours un entier. C'est là que ça semble coincer. Je ne connais pas les double et long double, de quoi s'agit-il ?

  28. #23
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    D'après ce que j'ai trouvé sur Internet un long double serait la même chose qu'un float mais avec bcp plus de chiffre après la virgule => c'est ce qu'il me faut ^^

    Car au stade ou j'en étais 9998,9998=9999...

  29. #24
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Citation Envoyé par LicenceXP Voir le message
    Le fait est que je dois pouvoir vérifier si la racine d'un entier est toujours un entier. C'est là que ça semble coincer.
    C'est pourtant dans mon message #10.
    En fait ce que tu veux c'est savoir si un nombre entier (X) donné donné est le carré d'un autre nombre (qui lui n'est pas fixé)...
    Code:
      int r = round(sqrt(X);;
      if (r*r ==X) {
        // Alors X est le carré de r
     }
    Voilà qui devrait faire l'affaire
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  30. Publicité
  31. #25
    LicenceXP

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Effectivement c'est plus simple que ce j'ai pondu de mon coté

    Je peux voler ?

  32. #26
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Le code est sous licence GPL
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  33. #27
    zoup1

    Re : Permettre un nombre d'itération infini sous Dev-C++

    PS : De même qu'il existe des float, double et long double
    il existe différentes talle d'entiers, char, short, int, long et long long
    http://en.wikipedia.org/wiki/Integer_(computer_science)

    Je ne sais pas quelle est la taille des entiers que tu utilises mais avec les carré il faut se méfier on fait facilement des dépassement de capacité.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  34. #28
    PHENIXian

    Re : Permettre un nombre d'itération infini sous Dev-C++

    Et effectivement, ne JAMAIS comparer des int avec des float, car dependant du compilateur comment c'est interprete.
    En FORTRAN de toute facon ca plante a la compile c'est plus safe
    "All your base are belong to us"
    OLFQJTLM

  35. #29
    snakemetalgear

    e/s sur les fichiers

    salut a tous j'ai un probleme avec les entrés sorties sur les fichiers .
    je veu ecrire sur un fichier avec fputc() mais le probleme c'est que cette fonction ecrase un octect et ecris dessus le caractere que je veu ecrire par contre moi je veu ecrire un caractere en conservant le suivant(en sachant que c'est ecris dedans le fichier).
    par exemple si c ecris sur le fichier "mon texte"
    et je fé fputc('s',file) sa va ecrire son texte.
    pendant que moi je veu ecrire "smon texte".
    merci d'avance.

  36. #30
    zoup1

    Re : e/s sur les fichiers

    Tu devrais ouvrir une nouvelle discussion pour discuter de cela.
    Mais il n'existe pas à ma connaissance de fonction qui permettent de rajouter un élément au début d'un fichier. Toutes les fonctions ne font que remplacer ou ajouter à la fin d'un fichier.

    Si tu veux ajouter au début ou insérer au milieu, tu n'as d'autres solutions que de recopier la suite du fichier à la suite de ce que tu veux insérer.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

Discussions similaires

  1. image par une application d'un ensemble infini est infini ?
    Par Snakeater dans le forum Mathématiques du supérieur
    Réponses: 7
    Dernier message: 30/10/2007, 22h12
  2. probléme avec Dev c++ sous vista
    Par H0bb3s dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 05/07/2007, 20h11
  3. nombre d'itération
    Par duaner dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 13/10/2006, 21h39
  4. Un nombre d'itération infinie qui ne se fait que... 46 fois ?
    Par LicenceXP dans le forum Logiciel - Software - Open Source
    Réponses: 13
    Dernier message: 12/10/2006, 22h10
  5. Nombre de combinaison sous Matlab
    Par azizespagne dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 03/01/2006, 15h54
Découvrez nos comparatifs produits sur l'informatique et les technologies.