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 :

Statistiques de char *


Sujet :

C

  1. #21
    Membre du Club Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Il faudrait que tu actives les warnings dans ton IDE (EDI) ..

    Parce que tu passes à travers les erreurs de cast et bien d'autre encore sans ça ...

  2. #22
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    J'ai choisi la pillule bleue, c'est à dire, de tout mettre dans un tableau de structure de taille fixée... Parler c'est simple, implémentez c'est autre chose (à mon niveau).

    Je pense qu'il y a une erreur car mes tests dans le main me donne des résultats louches...

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define DELIM ","
    #define BUF_SIZE 10000
     
     
    typedef struct
    {
        char *  nom;
        int  nbH;
        int  nbF;
    } infos_p;
     
     
    //tres utile pour le switch
    typedef enum
    {
        NOM,
        NBH,
        NBF
     
    } infos_type;
     
     
     
    static char * copie_chaine(const char *chaine)
    {
        char * copie = NULL;
        if (chaine != NULL)
        {
            size_t taille = strlen (chaine) + 1;
    /
            copie = malloc (taille * sizeof *copie);
            if (copie != NULL)
            {
     
                *copie = '\0';
                strcat(copie, chaine);
            }
        }
        return copie;
    }
     
    static void term_chaine(char *chaine)
    {
     
        char * p = strchr(chaine, '\n');
        if(p != NULL)
        {
            *p = 0;
        }
    }
     
     
    infos_p* get_infos(const char * file)
    {
        infos_p * infos = NULL;//structure de retour
        infos_p * tab[227]; // comment je l initialise ? NULL ? {0} ?
        FILE * fic = NULL;
        char * k = NULL;
     
        char buff [10000] = "";//Tampon
     
        fic = fopen(file, "r");
        if (fic != NULL)
        {
            printf("Ouverture du fichier reussie.\n \n");
            while ((fgets (buff, sizeof buff, fic)) != NULL)
            {
                char * p = buff;
                int i = 0;//compteur mot
                int j = 0;
     
     
                term_chaine(buff);
     
                infos = malloc (sizeof (* infos));
     
                if (infos != NULL)
                {
                    /* l'utilisation de strtok() a le desavantage
                       d'utiliser un tampon statique pour stocker la chaine entre
                       deux appels, ce qui la rend non réentrante et thread-unsafe.*/
     
                    while ((k = strtok(p, ",")) != NULL)
                    {
                        if (i == 0)
                        {
                            p = NULL;
                        }
     
                        switch (i)
                        {
                        case NOM:
                            infos->nom = copie_chaine(k);
                            break;
                        case NBH:
                             {
                                int nbH = strtol(k,NULL,10); 
                                infos -> nbH = nbH ; // ou bien infos.nbH = nbH ?
                            }
                             break;
                        case NBF:
                             {
                                int nbF = strtol(k,NULL,10);
                                infos -> nbF = nbF ;// de meme ?
                            }
                             break;
                        }
                        i++; //mot suivant
                    }
                    tab[j]=infos;
                 }
                 j++;
             }
            /* Une fois que fic est ferme, on reaffecte a fic une adresse
               invalide testable, a savoir NULL */
            fclose(fic),fic = NULL;
        }
     
        return infos;
        //free(infos);
    }
    J'ai changé un peu la structure et j'ai viré la fonction StrToLong... Qu'en pensez vous? Pouvez vous m'aider ?

    Merci d'avance.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    puisque tu connais le nombre exact de structures, je pense que tu pourrais simplifier ton code en déclarant un tableau "en dur", c'est à dire Cela t'éviterait d'avoir à utiliser malloc, et à avoir à te soucier des free ensuite, sans compter que tu gagnerais en concision.
    Pour initialiser un tableau, il suffit d'écrire :
    Dans ta version actuelle, il faudrait utiliser NULL et non 0 puisque ce sont des pointeurs.

    Je viens de comprendre ton problème :
    - lorsque tu crées une variable dans une fonction, elle est détruite au moment où le programme quitte la fonction (on dit que le programme a quitté le scope de la fonction). Deux exceptions : les variables déclarées static qui ne sont pas détruites et seront identiques à chaque appel de la fonction et les zones de mémoires malloquées. Pour ce deuxième cas, la zone mémoire malloquée en elle-même n'est pas détruite, mais un pointeur oui, ce qui conduit à des fuites mémoires car tu as perdu l'accès à de la mémoire de ton programme que tu ne pourras pas récupérer.

    - à la lumière de cela, qu'arrive-t-il à "tab" au moment où le programme quitte le scope de la fonction get_infos ? Les pointeurs sont-ils détruits ?

    Et une dernière question : à la fin de get_infos, tu retournes une structure info_p. A quoi sert-elle, que contient-elle ?

  4. #24
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    infos_p get_infos(const char * file)
    {
        infos_p  infos = {0};//structure de retour
        infos_p  tab[227]= {{0}};  
        FILE * fic = NULL;
        char * k = NULL;
     
        char buff [10000] = "";//Tampon
     
        fic = fopen(file, "r");
        if (fic != NULL)
        {
            printf("Ouverture du fichier reussie.\n \n");
            while ((fgets (buff, sizeof buff, fic)) != NULL)
            {
                char * p = buff;
                int i = 0;//compteur mot
                int j = 0;
     
     
                term_chaine(buff);
     
               // infos = malloc (sizeof (* infos));
     
              //  if (infos != NULL)
               // {
                    /* l'utilisation de strtok() a le desavantage
                       d'utiliser un tampon statique pour stocker la chaine entre
                       deux appels, ce qui la rend non réentrante et thread-unsafe.*/
     
                    while ((k = strtok(p, ",")) != NULL)
                    {
                        if (i == 0)
                        {
                            p = NULL;
                        }
     
                        switch (i)
                        {
                        case NOM:
                            infos->nom = copie_chaine(k);
                            break;
                        case NBH:
                             {
                                int nbH = strtol(k,NULL,10); 
                                infos.nbH = nbH ; 
                            }
                             break;
                        case NBF:
                             {
                                int nbF = strtol(k,NULL,10);
                                infos.nbF = nbF ;
                            }
                             break;
                        }
                        i++; //mot suivant
                    }
                    tab[j]=infos;
                // }
                 j++;
             }
            /* Une fois que fic est ferme, on reaffecte a fic une adresse
               invalide testable, a savoir NULL */
            fclose(fic),fic = NULL;
        }
     
        return tab
        //free(infos);
    }
    Erreur d incompatibilité avec tab :

    " incompatible types when returning type 'struct infos_p *' but 'infos_p' was expected|
    ||=== Build finished: 1 errors, 0 warnings ===| "

    Et puis mon but reste de pouvoir accéder à n'importe quel champ de n importe quelle structure qui devrait se trouver dans mon tableau... seulement j'ai l impression que je place mal mon tab[j] = infos...

    ex : tab[34].nbH me renvoie le nbH de la 35eme structure qui a été rentrée dans le tableau...

  5. #25
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    ton return tab; ne convient pas avec le type de retour que tu as choisi infos_p. En effet selon ta déclaration infos_p tab[227]= {{0}}; cette variable est d'un type assimilable à infos_p*.

    Accorde ta valeur de retour avec la signature de ta fonction ou fait l'inverse (accorder ta signature de fonction avec la valeur que tu retourne).
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  6. #26
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    De toute façon, on ne doit pas retourner tab : il est interdit de retourner l'adresse d'une variable locale (parce qu'elle est détruite en sortie de fonction)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #27
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci mon ... heu merci TheGzD.... ca compile...

    Edit : J'avais pas vu le commentaire de diogène... Je refais en conséquence...

    Franchement, comment vais je faire pour ne pas craquer mentalement? Rien ne fonctionne comme je veux...

  8. #28
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Citation Envoyé par larchicha Voir le message
    Franchement, comment vais je faire pour ne pas craquer mentalement? Rien ne fonctionne comme je veux...
    malheureusement la maitrise d'un langage passe par pas mal d'enseignement et de pratique, tu ne peux pas espérer en contrôler toutes les ficelles si tu grilles certaines étapes ...

    Bon courage
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  9. #29
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    C'est sûr... j'aurais dû mieux écouter en cours...

    Je reprends du début..

    Je veux charger les données contenues dans le fichier CSV en mémoire.

    Ma fonction get_infos peut elle ne rien retourner ? // Je ne pense pas...

    Ou doit elle retourner un pointeur sur infos_p ? car d'apres ce que j'ai compris un simple tableau de structure infos_p déclaré " a la dure " est une variable locale donc supprimé à la fin de ma fonction.

    Donc comment faire en sorte de remplir mes structures pour que je puisse les réutilisées par la suite ?

    PS : Je vois bien que je tourne en rond depuis des jours, mais je trouve que la fonction d extraction avec le switch et strtok est bien d'ou mon acharnement à l utiliser.

  10. #30
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Il serait sûrement temps d'aller te former sur les pointeurs en te plongeant dans les tutos et la FAQ.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  11. #31
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci à tous...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2003, 16h24
  2. Réponses: 6
    Dernier message: 24/03/2003, 17h11
  3. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48

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