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 :

besoin d'aide pour l'implémentation d'un grand entier


Sujet :

C

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Par défaut besoin d'aide pour l'implémentation d'un grand entier
    Bonjour tout le monde!

    Je suis débutante en langage C, mais je dois m'attaquer à un problème trop grand pour moi il faut bien l'avouer.

    Je dois implémenter un grand entier (à partir d'une chaîne de caractères), puis faire des fonctions additionner, soustraire, multiplier et diviser. Enfin je dois faire un main qui teste ces opérations avec des arguments en ligne de commande.

    Le soucis, c'est que je n'arrive même pas à faire le tout début de mon programme, à savoir construire mon grand entier. J'obtiens plusieurs erreurs "dereferencing pointer to incomplete type"...

    Je vous affiche mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    //bigint.h
     
    typedef struct Biginteger* big_integer_t;
     
    big_integer_t bigIntFromString (const char *str);
    void freeBigInt (big_integer_t a);
     
    big_integer_t add (big_integer_t a, big_integer_t);
    big_integer_t subtract (big_integer_t a, big_integer_t);
    big_integer_t multiply (big_integer_t a, big_integer_t);
    big_integer_t divide (big_integer_t a, big_integer_t);
     
    //bigint.c
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <stddef.h>
     
    #include "bigint.h"
     
     
    struct big_integer_t
    {
            char *data;
            size_t length;
    };
     
     
    big_integer_t bigIntFromString (const char *str)
    {
        big_integer_t bi = malloc(sizeof (big_integer_t));
        bi->length = sizeof (bi) / sizeof (char);
        bi->data = malloc (bi->length*sizeof(char));
        strcopy(bi->data,str);
        return bi;
    }
    Je n'ai pas encore fait de main, j'ai déjà des erreurs avec ca...

    Si vous pouviez m'aider ce serait vraiment super!
    Merci!

    Audrey

  2. #2
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Dans la fonction, tu n'alloues pas la taille de ta chaine passée en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    big_integer_t bigIntFromString (const char *str)
    {
        big_integer_t bi = malloc(sizeof (big_integer_t));
        // Longueur de la chaîne + 1 pour le zéro de fin.
        bi->length = strlen(str) + 1 ;
        bi->data = malloc (bi->length*sizeof(char));
        strcopy(bi->data,str);
        return bi;
    }
    Sans oublier, qu'il te faudra appeler ta fonction pour désaouller correctement ton pointeur retourné (bi), ainsi que le pointeur de chaîne (data).

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //bigint.h
     
    typedef struct Biginteger* big_integer_t;
    Ce n'est pas une bonne idée de cacher un pointeur dans un typedef : cela obscurcit le code et on arrive à des erreurs d'inattention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "bigint.h"
     
    struct big_integer_t
    {
            char *data;
            size_t length;
    };
    on a maintenant deux types différents : big_integer_t et struct big_integer_t mais on n'a pas de struct Biginteger

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    big_integer_t bi = malloc(sizeof (big_integer_t));
    est faux. On doit avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    big_integer_t bi = malloc(sizeof (big_integer_t *));
    //ou
    big_integer_t bi = malloc(sizeof *bi);
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        bi->length = sizeof (bi) / sizeof (char);
        bi->data = malloc (bi->length*sizeof(char));
    Voir la remarque d'Elijha. A noter que sizeof(char) vaut toujours 1 par définition.

    -
    strcpy() pas strcopy()

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gau,

    Utiliser des char pour du multi-précision n'est pas une bonne idée pour les performances (à la limite, pour voir les algorithmes, c'est tout).

    Il manque un champ signe dans ta structure (il ne faut pas stocker ce genre de nombre en non signé, source d'erreurs).
    En clair, il faut remplacer char par unsigned char.


  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Par défaut
    Merci pour vos réponses!

    Je vais essayer de corriger tout ça, mais je sens que je vais galérer à finir ce code moi! Déjà pleins d'erreurs au bout de 3 lignes!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //bigint.h
     
    typedef struct Biginteger* big_integer_t;
    Ce n'est pas une bonne idée de cacher un pointeur dans un typedef : cela obscurcit le code et on arrive à des erreurs d'inattention :
    Le problème c'est que je n'ai pas le choix pour le.h, je dois utiliser celui-là... C'est un devoir que je dois faire, on m'a donné le .h et je dois faire le reste...

    Je me remets à l'assaut de mon grand entier!

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 6
    Par défaut
    Bonjour,

    Il semblerait que je rencontre des problèmes d'overflow avec mes opérateurs... Savez vous comment je peux arranger ca?
    Je commence à désespérer vraiment...

    Merci

    Audrey

Discussions similaires

  1. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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