Forum Solarus-Games francophone

Jeux amateurs => Programmation => Discussion démarrée par: Gold-Link le 28 Janvier 2012 à 15:56

Titre: Limite Integrers en C...
Posté par: Gold-Link le 28 Janvier 2012 à 15:56
Hello!  :)

Non cette fois-ci je ne viens pas pour demander une aide sur mon jeu. En fait j'aurai besoin de quelques conseils pour du C.
Alors voila, je suis en première et dans le cadre des Travaux Personnels Encadrés (TPE) avec mon groupe j'ai décidé de faire une expérience pour créer un logiciel, un logiciel codé en C. Bon j'ai pas mal de bases en C/C++ (plus en C) et le moteur du logiciel ne repose que sur des calculs assez simples, donc pas de grosses connaissances a avoir.
Or comme je viens de l'expliquer le logiciel effectue un calcul assez complexe afin de faire ressortir un nombre qui sera traité plus tard . Tout fonctionne très bien sauf que on va être amené a faire des calculs avec des chiffres grands...et c'est que ca coince car avec les Integrers (INT) on peut aller jusqu'a 2147483647 , après l'ordi me balance des chiffres au hazard quoi...et ca serait bien de contourner cette limite...

Je demandais donc si il y avait une ruse, ou une astuce à l'aide de tableaux  ou autres afin de traiter les variables longues en C.

Merci  :)
Titre: Re : Limite Integrers en C...
Posté par: Supersigo le 28 Janvier 2012 à 16:17
J'ai une connaissance très basique de la programmation, mais il me semble qu'il existe effectivement des types de données qui permettent d'utiliser des variables plus longues en C/C++. Malheureusement, j'ignore lesquels.x)

Par contre, après une rapide recherche sur Google, j'ai trouvé ceci (http://www.commentcamarche.net/contents/cpp/cpptype.php3), peut-être que ça pourra t'aider. Sinon tu peux toujours chercher par toi-même, ça ne doit pas être si difficile que ça à trouver.^^

Bonne chance dans tes recherches et excuse-moi pour mon manque de connaissances en programmation, d'autres répondront sûrement mieux que moi. :)
Titre: Re : Limite Integrers en C...
Posté par: Gold-Link le 28 Janvier 2012 à 17:04
J'avais effectivement trouvé un tableau récapitulatif dans le genre mais merci quand meme ^^
Sinon oui j'avais tenté de mettre des variables de type DOUBLE (qui son censés aller jusqu'a x10^308 mais le compilateur m'indique une erreur de type 'error C2177: constante trop grande' dans le débogueur alors que la variable ne fait que '100000000000000000000' [a titre de test] ce qui est inférieur a 10^308...  -_-
J'ai beau chercher sur google , aucun résultat qui me convient...
Titre: Re : Limite Integrers en C...
Posté par: BenObiWan le 28 Janvier 2012 à 17:18
C'est ton '100000000000000000000' qui est trop grand, pas parce qu'il ne tient pas dans ta variable double, mais parce que le compilateur le traduit en entier avant de l'affecter.
Rajoute un .0 à la fin pour lui faire comprendre que ce n'est pas un entier. (enfin si mes souvenirs sont exacts)

En utilisant un double ou un float, tu risques de perdre en précision. Si la différence entre 100000000000000000000 et 100000000000000000001 est très importante pour ton programme n'utilise pas les nombres flottants. Si un long long ne te suffis pas, utilise une bibliothèque adaptée au traitement des grands nombre tel que http://gmplib.org/
Titre: Re : Limite Integrers en C...
Posté par: Calimero75 le 28 Janvier 2012 à 17:49
Je confirme ce que dit BenObiWan, les types flottants (float et double) ne sont pas adaptés au stockage de nombres entiers (tu pourrais avoir des surprises avec des tests d'égalité qui ne donnent pas le résultat attendu par exemple).

Sans aller jusqu'à gmp, tu dois sûrement pouvoir utiliser des entiers de 64 bits sur ta machine et ton compilateur, cela pourrait peut-être te suffire (c'est déjà bien gros) :) Tu peux éventuellement te fier au tableau suivant sur wikipedia (en) : http://en.wikipedia.org/wiki/Integer_(computer_science)
Titre: Re : Limite Integrers en C...
Posté par: Morwenn le 28 Janvier 2012 à 20:08
Déjà, si tu veux être sûr de la taille des entiers que tu utilises, tu peux utiliser un int32_t ou un int64_t si ton ordinateur les supporte. Ce sont des entiers à taille fixe (respectivement 32 et 64 bits) qui se trouvent dans le header stdint.h dont tu pourras trouver une petite description (en anglais) en suivant ce lien (http://pubs.opengroup.org/onlinepubs/009604599/basedefs/stdint.h.html). Ceci dit, ce header n'est standard qu'à partir de la norme C99. Donc, tu ne pourras être sûr de l'avoir qu'en compilant avec la norme C99 (Avec gcc, il faut ajouter l'option -std=c99 au compilateur). Il me semble qu'il ait été adapté en C++, mais je ne suis pas sûr qu'il soit standard.

Certains compilateurs fournissent des entiers de 128 ou 256 bits avec typiquement les types __int128 et __int256, mais il faut bien garder en tête que ce n'est pas portable. Il me semble cependant qu'ils existent avec certaines versions de GCC.

Sinon, si tu veux travailler avec des entiers infiniment grands, il existe des bibliothèques particulières comme GMP ou OpenSSL qui te fournissent ce genre de nombres.
Titre: Re : Limite Integrers en C...
Posté par: Gold-Link le 29 Janvier 2012 à 14:24
Merci de vos réponses. J'ai installé GMP a patir d'un tuto (http://www.siteduzero.com/tutoriel-3-2164-gmp-arithmetic-without-limitation.html) du site du zéro. Je pense toucher au but mais cette fois ci je rencontre une erreur de compilateur :

Citation
[Linker error] undefined reference to `std::ctype<char>::_M_widen_init() const'

A savoir que je suis sous Dev-Cpp...et toujours rien sur internet de bien convaincant, a savoir que je suis un peu un brêle ^^
Titre: Re : Limite Integrers en C...
Posté par: Wouf le 31 Janvier 2012 à 02:27
Es-tu sûr d'avoir bien lié ta bibliothèque au projet ? (en plus d'inclure les entêtes)
Regarde le paragraphe "compiler notre code" du tuto (http://www.siteduzero.com/tutoriel-3-2164-gmp-arithmetic-without-limitation.html#ss_part_4) :)

Il faut apparemment lier d'abord libgmpxx puis libgmp.
Titre: Re : Limite Integrers en C...
Posté par: Gold-Link le 31 Janvier 2012 à 17:42
Oui oui y a aucun soucis a ce niveau la, je pense pas que cela vienne de gmp...
Titre: Re : Limite Integrers en C...
Posté par: Wouf le 01 Février 2012 à 01:29
Peut être un problème de versions alors ...
As-tu bien compilé ta lib avec la même version du compilateur que tu utilises avec DevCpp ?
Titre: Re : Limite Integrers en C...
Posté par: Gold-Link le 03 Février 2012 à 00:14
Bon , j ai changé d'ordi par souci de mobilité et j ai du reinstaller tout les logiciels, et miracle! Ca fonctionne ! Enfin ^^
L erreur devait probablement venir de l installation de gmp, enfin merci a tous pour m avoir aidé a resoudre ce probleme et a avancer dans mon Tpe  :)
Titre: Re : Limite Integrers en C...
Posté par: Vauteck le 03 Février 2012 à 01:22
Salut,

Content de savoir que tu as résolu ton problème !  :super:
Juste une petite précision, tu disais dans ton premier post que c'était un projet en langage C, hors j'ai cru voir que GMP était une bibliothèque C++.
Je sais pas si çà a son importance, mais si c'est pour un cours, certains profs peuvent être pointilleux...  :mrgreen:
Titre: Re : Limite Integrers en C...
Posté par: Gold-Link le 03 Février 2012 à 19:38
Oui a la base c'était en C mais j'ai du effectivement passer au C++ afin d'obtenir ce que je voulais. Toutefois gmp fonctionne aussi avec des programmes en C mais je ne pense pas que tout ses fonctions également dans ce cas ^^