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. #1
    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 Statistiques de char *
    Bonjour à tous,

    J'ai un peu de mal avec le fait qu'on puisse mettre des nombres dans un char*.

    Malgré que ce soit le cas, j'ai encore plus de mal à concevoir que l'on puisse "jouer" avec ces nombres, j'entends par la, calculer leur somme, leur moyenne...etc

    Pourriez vous me donner un exemple s'il vous plait ? A moins que je sois totalement à coté de la plaque et que ce soit impossible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char *a, *b, *c = 434, 545, 652; 
    printf("%c",a+b+c);
    Je sais bien entendu que la syntaxe est incorrecte car je peux pas employer d opérateur binaire à des char *, mais c'est l'idée que je souhaite faire passer...

    Merci d'avance.

  2. #2
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Est-ce que tu pourrais expliquer plus clairement ? Je n'ai absolument rien compris à ton message.

    Les objets a, b et c (qui sont mal déclarés) de ton exemple sont des pointeurs. Que veux-tu faire avec des pointeurs ?

    Les pointeurs sont des objets qui, comme les objets de types de base, se trouvent à une adresse spécifique et contiennent une valeur. La valeur contenue dans un pointeur a la particularité d'être une adresse mémoire. Et un pointeur, contrairement aux autres objets, a aussi une seconde particularité : il peut être déréférencé, c'est-à-dire qu'on peut aller (écrire ou lire) à l'emplacement mémoire correspondant à sa valeur (qui est une adresse). C'est tout l'intérêt d'un pointeur.
    On ne peut pas additionner des pointeurs (on peut les additionner avec un entier par contre), ni les diviser, ni les multiplier ; cela n'aurait aucun sens. Par contre on peut les soustraire ; cela permet de mesurer la "distance" entre deux cases mémoire.

  3. #3
    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
    Je reconnais que c'est vraiment brouillon.

    Alors je m'explique.
    J'ai une structure composée de pointeurs sur char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct
    {
        char *  noms;
        char *  age;
        char *  nbPersonnes;
        char *  nbHommes;
        char *  nbFemmes;
     
    } donnees;
    et je souhaiterais faire une fonction qui me calcule la moyenne du nombre d hommes de toutes mes structures (par exemple...).

    Etant donné que même les nbPers/H/F sont des char * , comment suis je censé faire ?

    En espérant avoir été plus clair.
    Merci d'avance.

  4. #4
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    Etant donné que même les nbPers/H/F sont des char * , comment suis je censé faire ?
    Comme ce sont des pointeurs qui pointent sur un objet de type char, il suffit de les déréférencer, pour accéder à l'objet en question. Un pointeur sert à ça.

    age -> pointeur sur char.
    *age -> l'objet de type char, sur lequel le pointeur pointe.

    Même chose pour nbPersonnes, nbHommes et nbFemmes.

    Après, pour calculer la moyenne/somme, tu fais comme s'il s'agissait de variables classiques (sauf qu'il faut tenir compte ici qu'il s'agit d'une structure et adapter le code en conséquence).

    Si tu poses ce genre de question, c'est que -je suppose- tu n'as pas bien assimilé la notion de pointeurs. Je te propose de bien relire les cours à ce sujet.

    Mais bon, concernant age, nbPersonnes, nbHommes et nbFemmes, je ne comprends pas pourquoi tu veux utiliser des pointeurs (cela oblige à réserver de la mémoire supplémentaire via malloc par exemple). Tu peux mettre dans ta structure des membres de type char carrément (je te conseille int pour ce genre de données, char n'est pas spécifiquement approprié).

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Mai,

    Le meilleur moyen aurait été de mieux réfléchir à la structure nécessaire.

    Pourquoi stocker des valeurs numériques sous forme de chaîne de caractères ?

    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    Pourquoi stocker des valeurs numériques sous forme de chaîne de caractères ?
    Argh... j'avais même pas pensé à cette possibilité.

    @larchicha :
    Tes données numériques sont stockées sous forme de chaines de caractères ou d'un entier pointé par un pointeur ? Car c'est pas du tout pareil...
    En tout cas, comme le dit droggo, stocker des nombres dans des chaines de caractères, c'est pas terrible...

  7. #7
    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
    A vrai dire, toutes mes données sont extraites d'un fichier CSV, et pour les récupérer, j'ai pensé qu'un pointeur sur char était une bonne solution...

    Et je pensais plus à ce que ce soit des entiers pointés par des pointeurs...

    Pour ce qui est du déréférencement, j'ai relu le cours du SDZ (désolé si ça concurrence :/) et je vois le shmilblik, mais si j'essaie de coder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char a = 5;
    char *aPrime = &a;
    char b =5;
    char *bPrime = &b;
    char somme = *aPrime+*bPrime;
    printf("%c",somme);
    Tout plante à l éxécution - Windows a cessé de fonctionné -
    (Merci du temps que vous m'accordez)

    PS : Et là vous allez me dire, mais pourquoi ne pas faire directement a+b ?
    Parce que ce que je récupère du fichier CSV arrivent sous forme de char *...

  8. #8
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 467
    Points
    467
    Par défaut
    Salut,

    Je ne suis pas sûr de bien comprendre ce que tu veux.
    Il existe des fonctions qui permettent de convertir une chaine en un entier ou float. (atoi, atof).

    Si ta chaine contient des chiffres qui sont donc stockés dans un char, tu peux transformer cette valeur en entier ou flottant grâce aux fonctions citées ci-dessus.
    En revanche, un caractère n'est rien d'autre qu'un code ASCII en l'occurrence ( mais ça dépend où tu travailles ). Donc char c = 'a' est aussi un entier. Cette entier n'est rien d'autre que le code ASCII decimal ( mais c'est pas toujours ASCII hein ) du caractère a, c'est à dire 97.

    Voici la table ASCII :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main ()
    {
        char *valueIsChar ="235";
        int value = atoi(valueIsChar);
     
        int sum = 0;
        size_t i;
        for (i=0 ; i<strlen(valueIsChar) ; i++ )
        {
            sum = sum + (int)valueIsChar[i];
        }
     
        printf("\n La chaine de caractere devient un nombre : %d \n\n Somme des valeurs ASCII dans la chaine = %d", value, sum);
     
        char a = '3';
        char b = 'A';
        char c = a+b;
        printf("\n\n CODE ASCII de la variable a = %d\n CODE ASCII de la variable b = %d",(int)a, (int)b );
        printf("\n CODE ASCII de la variable a+b = %d donne le caractere %c",(int)(a+b), a+b );
        return 0;
    }


    Si tu regardes le caractère qui a pour code ASCII décimal 116, tu trouves bien le caractère t. Sommer les caractères '3' + 'A' te donne le caractère 't'.

    Voilà j'espère que ça t'aidera à mieux comprendre ce qui ce passe.
    Cdt.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  9. #9
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Bonjour,

    Citation Envoyé par larchicha Voir le message
    A vrai dire, toutes mes données sont extraites d'un fichier CSV, et pour les récupérer, j'ai pensé qu'un pointeur sur char était une bonne solution...
    Oui mais, ce que tu récupères est la représentation textuelle, c'est à toi de convertir tes données CSV en quelquechose de vraiment exploitable par ton programme, et donc d'adapter le type de tes données. Ainsi pour manipuler des entiers, autant utiliser des int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct
    {
        char *  noms;
        int age;
        int nbPersonnes;
        int nbHommes;
        int nbFemmes;
     } donnees;
    A toi de faire la conversion chaine de caractères -> entier (strtol(), atoi(), ...) après avoir parsé ton fichier CSV.

    Citation Envoyé par larchicha Voir le message
    Et je pensais plus à ce que ce soit des entiers pointés par des pointeurs...

    Pour ce qui est du déréférencement, j'ai relu le cours du SDZ (désolé si ça concurrence :/) et je vois le shmilblik, mais si j'essaie de coder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char a = 5;
    char *aPrime = &a;
    char b =5;
    char *bPrime = &b;
    char somme = *aPrime+*bPrime;
    printf("%c",somme);
    Tout plante à l éxécution - Windows a cessé de fonctionné -
    (Merci du temps que vous m'accordez)

    PS : Et là vous allez me dire, mais pourquoi ne pas faire directement a+b ?
    Parce que ce que je récupère du fichier CSV arrivent sous forme de char *...
    Répondu plus haut, il faut que tu fasses ta couche d'adaptation chaines de caractères (char*) -> autre type.

    --
    Foobar1329

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je ne sais pas ce que tu lui fais à ton windows, mais cela ne vient pas de ce code !
    Par contre, il y a une erreur au niveau du printf, qui montre que le systeme ascii te perturbe encore La première partie de ce lien devrait t'aider : http://sebsauvage.net/comprendre/ascii/

    Pour en revenir à ton problème, tu demandes à printf de t'afficher un caractère (%c), qui correspond à la valeur 10 : il va donc chercher dans la table ascii à quoi correspond le 10, qui est un caractère non imprimable; lorsqu'il te l'affiche, tu ne vois donc rien à l'écran.
    Mais toi dans ton cas, tu ne souhaites pas que l'ordinateur considère la valeur 10 comme correspondant à un caractère, mais à un nombre. Tu indiques cela à printf en utilisant le même code %d, qui sert également pour les int.

    Enfin, il existe une fonction qui convertit une chaîne de caractères en nombre : atoi.
    Si tu as un peu de temps, je te conseille de la recoder toi-même afin d'être certain que tu as bien compris comment fonctionne le code ascii et comment le manipuler.
    Pour te mettre sur la piste : quelle est la valeur de nb dans la cas suivant :

  11. #11
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    A vrai dire, toutes mes données sont extraites d'un fichier CSV, et pour les récupérer, j'ai pensé qu'un pointeur sur char était une bonne solution...

    Et je pensais plus à ce que ce soit des entiers pointés par des pointeurs...

    Pour ce qui est du déréférencement, j'ai relu le cours du SDZ (désolé si ça concurrence :/) et je vois le shmilblik, mais si j'essaie de coder (...)
    Mais là, si j'ai bien compris ce que tu veux faire, tu confonds deux choses (c'est ce qui m'a induit en erreur, car tu ne l'avais pas précisé) :
    * un nombre (qui peut être contenu dans une variable de type char ou int, ou autre)
    * une chaine de caractères représentant ce nombre.

    Ce n'est absolument pas la même chose. Ta méthode ne peut donc pas marcher !

    Tu aurais dû préciser qu'il s'agissait de lire un CSV.

    Lorsque tu lis ton fichier CSV, il faut le parser. Cela consiste à récupérer les données contenues dedans, en fonction du format utilisé. Chaque donnée est séparée par un délimiteur (par exemple une virgule).
    Ces données sont bien entendu des chaines de caractères. Mais lorsque tu as affaire à des chaines de caractères représentant un nombre (tel que l'âge, le nombre de personnes, etc), il faut ensuite le convertir ces données (chaines de caractères) en nombre, qui sera ensuite stocké dans une variable de type int (par exemple).

    A titre d'exemple, si ton fichier CSV est composé de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    champs1,champs2,champs3
    champs1,champs2,champs3
    champs1,champs2,champs3
    ...
    Tu lis chaque ligne, que tu remplis dans un tableau de taille fixe (assez grand), en utilisant la fonction fgets (par exemple).
    Ensuite, tu parses cette ligne. Il s'agit de récupérer chaque token (ici : champs1,champs2 et champs3). Ceci peut être fait grâce à la fonction strtok.
    Lorsque ce token est une chaine de caractères représentant un nombre, il faut le transformer en nombre. Dans ce cas, la fonction strtol (surtout pas atoi, qui doit être abandonnée) est ton amie.
    Ensuite, tu remplis ta structure avec les valeurs, une fois que tu as fini d'analyser ta ligne courante.

  12. #12
    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 beaucoup à tous pour toutes ces précisions...
    Je m'y met, et je vous tiens au courant.

  13. #13
    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
    Résumé de la situation :

    Je dois extraire des données d'un fichier CVS de type : (champ1,champ2,champ3)

    Comme vous m'avez dit, j'extrais la représentation textuelle donc je dois transformer mes représentations textuelles de long en " vrais " long...

    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
    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
    126
    127
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define DELIM ","
    #define BUF_SIZE 10000
     
     
    typedef struct
    {
        char *  nom;
        char *  nbH;
        char *  nbF;
    } infos_p;
     
     
    //tres utile pour le switch
    typedef enum
    {
        NOM,
        NBH,
        NBF
     
    } infos_type;
     
     
     
     long StrToLong(char *a)
    {
        char ** endstr ;
        int base = 0;
        long retour = strtol(a,endstr,base);
        //;printf("%ld",retour);
        return retour;
    }
     
     
     
    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
        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
     
     
                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:
                            infos->nbH = StrToLong(copie_chaine(k));
                             break;
                        case NBF:
                            infos->nbF = StrToLong(copie_chaine(k));
                             break;
                        }
                        i++; //mot suivant
                    }
                 }
            }
            /* 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);
    }
    Le but étant de pouvoir faire des statistiques avec ces champs.

    A partir de là, comment puis je accéder au champ "nombre d hommes " de la 54eme ligne (~~du 54eme nom enregistré) par exemple ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long get_nbH(infos_p *t){
     
         long resultat = t -> nbH;
         return resultat;
    }
    Me retourne logiquement le dernier champ nbH qui a été écrit (genre Last in First out)...

    Je verrais donc quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    long get_nbH(infos_p *t, int n){
     
         long resultat = *(t+n) -> nbH;
         return resultat;
    }
    seulement le programme plante à l éxécution...

    Merci d'avance pour l'aide apportée.

  14. #14
    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
    Salut,
    alors premièrement passage d'un entier à un char sans cast :
    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
    infos_p* get_infos(const char * file)
    {
       ......
    
                        switch (i)
                        {
                        case NOM:
                            infos->nom = copie_chaine(k);
                            break;
                        case NBH:
                            infos->nbH =(char*) StrToLong(copie_chaine(k));
                             break;
                        case NBF:
                            infos->nbF =(char*) StrToLong(copie_chaine(k));
                             break;
                        }
                        i++; //mot suivant
    ......  
     }
    to be continued ...

  15. #15
    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...
    (mais still blocked... )

  16. #16
    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
    .... minute papillon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     long StrToLong(char *a)
    {
        char ** endstr = NULL; //Vers quoi pointe endstr ? (endstr = endptr ?)
        int base = 0;
        long retour = strtol(a,endstr,base);
        printf("%ld",retour);
        return retour;
    }
    Ensuite dans ton main , je verrai bien ça :
    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
    int main()
    {
     
    FILE* fichier = NULL;
     
    fichier = fopen("lol.csv", "r");
     
    infos_p TOTO ;
     
    get_infos(( const char*)&fichier);
     
    long z = get_nbH (&TOTO , 54);
     
    printf("nbre = %lu", z);
    return 0;
    }
    Je t'avoue que j'ai un peu lu ton programme en travers donc si il y a encore des soucis dit moi

  17. #17
    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
    Je pars de la fac, je regarde en rentrant... mais merci bcp du temps que tu prends pour moi ...

  18. #18
    Invité
    Invité(e)
    Par défaut
    Hum mon message n'était pas passé, je le copie tel quel, il n'est plus totalement à jour du coup
    Bonjour,
    Ceci ne peut pas fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    long get_nbH(infos_p *t, int n){        long resultat = *(t+n) -> nbH;      return resultat; }
    En effet, la notation *(t+n) n'est valable que dans le cas d'un tableau, car elle sous-entend que les valeurs sont contigues en mémoire, ce qui ne peut être garanti que dans le cas d'un tableau.
    Pour en revenir à ton problème, tu as deux méthodes :
    - soit tu lis tout le fichier en une fois, et tu stockes les informations dans un tableau de structure. Ensuite, tu pourras accéder à une structure en particulier avec la méthode *(t+n). C'est sans doute la méthode la plus optimisée, au détail près qu'il te faut connaître le nombre de structures pour allouer ton tableau à l'avance. Sinon tu peux faire une liste chaînée.
    - soit tu avances dans le fichier tant que tu n'es aps arrivée à la Xème ligne. SI tu n'as que quelques valeurs spécifiques à récupérer, c'est la méthode la plus rapide. Si tu as besoin d'utiliser la majorité du fichier, oublie la.

    Quoiqu'il en soit, il faut déjà que tu compiles absolument avec les warning, car les affectations que tu fais dans le switch sont fausses au niveau des types.

  19. #19
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long StrToLong(char *a)
    {
        char ** endstr ;
        int base = 0;
        long retour = strtol(a,endstr,base);
        //;printf("%ld",retour);
        return retour;
    }
    Tu n'utilises pas la fonction correctement. En plus, tu ne vérifies pas si la fonction a échoué ou pas. http://man.developpez.com/man3/strtol.3.php

    (Je n'ai pas regardé le reste du code)

  20. #20
    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, j'ai de la matière pour continuer...(grâce à vous)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2003, 17h24
  2. Réponses: 6
    Dernier message: 24/03/2003, 18h11
  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, 22h48

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