IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème d'overflow pour un grand entier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut Problème d'overflow pour un grand entier
    Bonjour,
    Je débute en programmation et j'ai du mal à comprendre le principe de la fonction malloc() et je pense que mon problème d'overflow est lié à sa mauvaise utilisation,
    Je vous met l'extrait de mon programme qui apparament pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void def_chaine()
    {
    	int temp;
    	printf("Saisir la chaine de bits\n");
    	scanf("%d",&temp);
    	sprintf(chaine_bits,"%d",temp);
    	printf("temp : %d",temp);
    	printf("chaine bits : %s",chaine_bits);
    }
    Sachant que je dois entrer un entier compris entre 1*10^95 et 1*10^95+1*10^94 soit 95 chiffres.
    Evidemment un int ne peut le contenir mais tous les essais (maladroits) que j'ai pu faire avec malloc() et calloc() n'ont rien donné...
    les deux printf() à la fin servent juste à vérifier si ça a marché, je ne les garderai pas.

    Si vous avez un conseil, je suis preneur !
    Merci d'avance,
    Adrien.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Je ne comprends pas ce que malloc (qu'on ne voit de toute façon pas dans ton code) vient faire dedans.
    Tu ne pourra jamais entrer un entier de 95 chiffres dans une variable de type int ni même de type long int.

    Que veux-tu faire avec un nombre de 95 chiffres exactement ? Explique clairement le but du programme.

    Si tu dois réellement gérer des grands nombres, il faudra te tourner vers des librairies ad hoc.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut
    Merci de ta réponse rapide
    malloc() n'apparait pas parce que je n'ai rien réussi à faire de bon avec mais il me semblait intéressant de l'utiliser !

    Le but du programme est de retrouver les 13 chiffres d'un code barre EAN13 à partir de la chaine de bits formée par les barres (95 bits donc), mais en fait il me parait plus judicieux de traiter cette chaine uniquement comme une chaîne de caractère...

    (Ma question peut paraître bête mais je suis passé d'une prépa maths à une license info alors il me manque quelques bases...)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    D'après ce que je comprends du code EAN13, les 13 éléments se décomposent en quatre barres (deux barres claires qui alternent avec deux barres sombres) dont la somme des largeurs élémentaires vaut toujours 7, auxquels s'ajoute 3 éléments de calibrage : deux zones de garde normales de 3 barres et une zone de garde centrale de 5 barres.

    Au total, ça te fait 13x7 + 2x3 + 1x5 = 102 barres.

    Le plus simple serait en effet de concevoir ta chaîne de caractères comme une suite de 102 caractères (par exemple '1' pour les barres sombres et '0' pour les barres claires).

    Après, tu extraits de ta chaîne ces caractères pour délimiter et reconstituer chacun des chiffres du code-barres en fonction de leur position dans la chaîne (apparemment, chaque chiffre peut prendre 3 valeurs différentes suivant sa position dans le code-barres).

    C'est une idée. Peut-être pas la meilleure.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut
    Oui je m'y retrouve en traitant une chaîne de caractères plutôt qu'un entier (ce qui a de plus l'avantage de protéger les 0).

    Sinon tua s bien décris la méthode à ce détail près que le 1er chiffre est obtenu en fonction de l'alternance des sets de codage des 6 premiers chiffres codés et n'est donc pas lui même codé dans la chaîne de bits, d'ou les 95 caractères

    Merci de votre aide en tout cas ;p

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Oui, c'est plus simple de traiter par chaine de caractères. Il faut prévoir un tableau suffisamment grand pour y entrer chaque bit (chacun correspond soit à une barre blanche ou noire). [Y a moyen aussi d'utiliser la solution des décalages de bits, mais je sais pas si t'as déjà abordé ce thème.]

    Plusieurs choses :
    * Créer un tableau à deux dimensions (ce sera plus simple à gérer) de taille 3 * 10 chaines de caractères de 7 caractères (+1 pour le '\0'), chacune d'elle contenant le codage de l'élément A, B et C de chacun des 10 chiffres.
    * Créer un tableau de 10 chaines de caractères, chacune avec ses 6 séquences, ceci permettant de trouver le 1er chiffre du code barre.

    Ensuite, c'est simple.
    1) Les chiffres 2 à 7 sont codés grâce à un élément A ou B.
    2) Les chiffres 8 à 13 sont codés grâce à un élément C.

    1) Il suffit de faire un système de boucles imbriquées qui teste la "n"ième série de 7 caractères avec chaque élément du tableau (uniquement les éléments A et B), afin de déterminer le chiffre et l'élément (A ou B) utilisé pour ce chiffre (c'est capital pour trouver le 1er chiffre à la fin). Le chiffre sera ajouté dans un tableau où sera stocké le résultat (sous forme de chaine de caractères), et l'élément courant (A ou B) sera stocké dans un autre. Faire ceci pour chaque série de 7 caractères, pour les chiffres 2 à 7.

    Ensuite, pour trouver le premier chiffre, il suffit de comparer le tableau contenant la séquence de chiffres trouvée et le tableau contenant les séquences possibles. Le chiffre sera écrit au début du tableau de résultat.

    2) Même chose, mais pour les chiffres 8 à 13, mais comparer uniquement avec les éléments C.

    Il faudra modifier selon si tu utilises les zones de garde normale ou non. J'ai fait au plus simple, au niveau de l'explication.

    Pour vérifier la clé de contrôle, utiliser l'algorithme de vérification.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Par défaut
    merci c'est en effet ce que je comptais faire en plus léger (j'ai utilisé un switch pour attribuer les chiffres , ce qui est assez lourd et redondant)
    Mon gros problème était de traiter ces 95 bits sans overflow mais en fait la réponse était toute bête

    Un autre petit soucis, j'ai declaré ma chaîne de caractère comme ceci :

    char chaine_bits[95];

    Mais apparament cela ne suffit pas à la limiter à 95 caractères, existe t'il un moyen de faire cela ?

Discussions similaires

  1. Structure pour grands entiers positifs
    Par NonoSC dans le forum C#
    Réponses: 7
    Dernier message: 19/04/2012, 12h42
  2. Réponses: 5
    Dernier message: 28/03/2011, 18h18
  3. petit problème sur les grand entiers en c
    Par abdou4101 dans le forum C
    Réponses: 4
    Dernier message: 01/05/2010, 20h00
  4. Problème pour convertir un entier en String
    Par K-you dans le forum C++
    Réponses: 13
    Dernier message: 15/04/2010, 17h19
  5. Réponses: 3
    Dernier message: 12/08/2007, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo