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'allocation dynamique de mémoire d'une structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 31
    Par défaut Problème d'allocation dynamique de mémoire d'une structure
    Bonjour,
    Je vous explique mes soucis, j'ai un programme qui doit récupérer les données d'un fichier csv pour les classer. Pour cela je crée N structures (N étant le nombre de catégorie présente dans le fichier csv) et ces structures possèdent chacune L lignes (L étant le nombre total de lignes présentes dans le fichier).

    Pour cela j'alloue de la mémoire dynamiquement, mais j'ai un soucis car des caractères bizarres apparaissent dans certains champs (par exemple des >, des cœurs, des smileys etc..). Alors qu'il n'y a aucun de ces caractères dans le fichier d'origine.

    Comment trouver et résoudre le problème ?

    Voici mon code présent dans le main()

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    typedef struct MOTS MOTS;
        struct MOTS
        {
        int id;
        char champs[45];
        };
     
        typedef struct BDD BDD;
        struct BDD
        {
        MOTS *mot;
        };
     
    int ligne= ouvrir_fichier("null.csv" ,texte);//recupération du nombre de lignes durant l'ouverture du fichier
    int cat = comptage_categorie(texte);
     
     
        BDD *structure = (BDD *)malloc (cat*sizeof(BDD));
        int i,j;
     
        for (i=0; i<cat; i++)
        {
            for(j=0;j<ligne;j++){
            structure[i].mot = (MOTS *)malloc (sizeof(MOTS));
            }
        }
     
        j=0;
        int k=0,a=0,l=0;
     
    while(texte[a] != '\n')//boucle pour ignorer la première ligne
        {
            a++;
        }
     
        for(i=a+1;i<strlen(texte);i++)
        {
            if(isalnum(texte[i]))
            {
                structure[k].mot[l].champs[j] = texte[i];//si le caractère est une lettre ou un chiffre il est stocké
                j++;
            }
            else if(texte[i] == ',')
            {
                j=0;//si c'est une virgule, on change de catégorie 
                k++;
            }
            else if(texte[i]== '\n')
            {
                l++;// si c'est un retour à la ligne changement de ligne et retour à la premiere catégorie
                j=0;
                k=0;
            }
        }

  2. #2
    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
    Les chaines que tu construis ne sont pas terminées par '\0'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ....
            if(isalnum(texte[i]))
            {
                structure[k].mot[l].champs[j] = texte[i];//si le caractère est une lettre ou un chiffre il est stocké
                j++;
            }
            else...  // on change de chaine mais structure[k].mot[l].champs[j] 
                     // n'a pas de zéro terminal

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 31
    Par défaut
    C'était bien cela, merci

    Bonne fin d'après midi

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut
    Citation Envoyé par Manio 54 Voir le message
    Bonjour,
    Pour cela j'alloue de la mémoire dynamiquement, mais j'ai un soucis car des caractères bizarres apparaissent dans certains champs (par exemple des >, des cœurs, des smileys etc..). Alors qu'il n'y a aucun de ces caractères dans le fichier d'origine.
    Bonjour Manio 54,
    tel que vous le présentez impossible de compiler votre code : ) Pour vous aidez c'est un peu dur.
    Sinon,
    vous allouez, vos structures mais elles ne sont pas pré-initialisées, résultat vos champs "char champs[45];" contiennent n'importent quoi au départ. Lorsque vous assignez texte vous n'ajouter pas un `\0` final à vos chaînes. Quand vous les relisez vous constatez des choses bizarres correspondant à votre texte plus le nombre de caractères qui complètent la longueur de "champs" (voir plus tant qu'un 0 n'est pas lu, si vous ne contrôler pas la longueur de la chaîne que vous afficher).

    Donc soit ajouter à la main le `\0` manquant ou à la place d'un malloc utiliser calloc

    Diogène m'a précédé

Discussions similaires

  1. (Re)Allocation dynamique de mémoire dans une fonction
    Par Stupendous Man dans le forum Débuter
    Réponses: 11
    Dernier message: 17/06/2011, 16h46
  2. Réponses: 3
    Dernier message: 01/03/2008, 23h28
  3. test d'une allocation dynamique de mémoire
    Par gotrunkssj dans le forum C
    Réponses: 7
    Dernier message: 27/01/2008, 21h41
  4. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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