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'attribution de valeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut Problème d'attribution de valeurs
    Bonjour à tous !

    Je suis en train d'essayer d'attribuer une valeur à un élément d'une structure... Ce qui peut parraitre plutot aisé... Cependant je n'y parvien pas...

    Voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct PosteTLOTS
      { char       LOTNULOT[6];
        char       LOTNUTRT[9];
        char       LOTIDEME[25];
        char       LOTDTPEC[8];
        char       LOTHRPEC[7];
        char       LOTNBEVE[9];
        char       LOTNBREJ[9];
        char       LOTNOMFI[251];
        char       LOTNOMRJ[251];
        char       LOTSOMME[33];
      };
      typedef struct PosteTLOTS PosteTLOTS;
    Et voici ce que j'essaye de faire :

    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
     
        size_t i;
     
        while((c = fgetc(g_fp)) != EOF) 
        {
            i++;
        }
        printf("Longueur du fichier: %lu\n", (unsigned long) i);
        printf("=> i : %s\n", i);;
        sprintf(pBufferTLOTS->LOTSOMME, "%032.32g", i);
        printf("=> i en 32g : %32g\n", i);
        printf("=> i en l : %l\n", i);
        printf("pBufferTLOTS->LOTSOMME : en s : %s; en l : %l; en g : %32g\n",
                pBufferTLOTS->LOTSOMME, pBufferTLOTS->LOTSOMME, 
                pBufferTLOTS->LOTSOMME);
        sprintf( pLot->LOTSOMME, "%32g", i);
        printf("=> taille fichier <%l> \n", i);
    En bref mon problème c'est que je n'arrive pas à attribuer la valeur de i à pBufferTLOTS->LOTSOMME.

    Mon affichage est le suivant :

    Longueur du fichier: 218599
    => i : OD ACC
    Je n'ai rien de plus, ce qui me laisse penser que le "sprintf" ne s'effectue pas.

    J'ai besoin de votre aide !!!

    D'avance merci à vous.

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    J'utiliserais plutot un snprintf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(pBufferTLOTS->LOTSOMME, sizeof(pBufferTLOTS->LOTSOMME),  "%032.32g", i);
    Cela évitera un débordement éventuel (ce qui est peut-être la cause de ton plantage).

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Initialise au moins le i à 0 avant de commencer à compter.
    Aussi, le format %032.32g ne me parait pas correct. Tu reserve toute la place pour la partie flottante.

  4. #4
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Je vien d'essayé ce que vous m'avez conseillé et voila le retour :

    Longueur du fichier: 27
    => i :
    Pas de réelle amélioration donc...

  5. #5
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Voici mon code après modifications en fonction de vos conseils :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        printf("Longueur du fichier: %lu\n", (unsigned long) i);
        printf("=> i : %s\n", i);
        snprintf(pBufferTLOTS->LOTSOMME, sizeof(pBufferTLOTS->LOTSOMME),
                  "%032.32g", i);
    L'initialisation de i à 0 est une bonne chose, j'ai désormais toujours la même taille pour mon fichier, ce qui n'était pas le cas...

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    size_t i;
     
    ...
     
    printf("Longueur du fichier: %lu\n", (unsigned long) i);
    printf("=> i : %s\n", i);
    Ne serais ce pas plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("=> i : %d\n", i);
    Sinon à la place de cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    snprintf(pBufferTLOTS->LOTSOMME, sizeof(pBufferTLOTS->LOTSOMME),
                  "%032.32g", i);
    j'ajouterais le cast suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    snprintf(pBufferTLOTS->LOTSOMME, sizeof(pBufferTLOTS->LOTSOMME),
                  "%032.32g", (double)i);
    mais comme cela je ne vois pas vraiment l'intérêt et je ferais plutot ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    snprintf(pBufferTLOTS->LOTSOMME, sizeof(pBufferTLOTS->LOTSOMME),
                  "%d", i);

  7. #7
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Voici le résultat obtenu avec vos modifications :

    Longueur du fichier: 27
    => i : 27
    Si ce n'est que j'arrive à récupérer la valeur de I, je n'arrive cependant toujours pas à l'attribuer à "pBufferTLOTS->LOTSOMME", ni à "pLot->LOTSOMME".

    Es ce que quelqu'un voi la solution???

    Vu que i est visiblement compté comme un Décimal, la fonction sprintf me semblait donc tout à fait approprié pour l'ajouter à "pLot->LOTSOMME" ou à "pBufferTLOTS->LOTSOMME" qui sont des tableaux (chaines de caractères).

    Merci d'avance pour votre aide.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spinoza23 Voir le message
    Je suis en train d'essayer d'attribuer une valeur à un élément d'une structure... Ce qui peut parraitre plutot aisé... Cependant je n'y parvien pas...
    Je ne vois pas trop ce que tu cherches à faire, mais ce code est
    1. incomplet
    2. bourré de fautes basiques (signalées par le compilateur si il est correctement réglé)

    Voici ton code corrigé :
    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
     
    #include <stdio.h>
    #include <assert.h>
    #include <stdlib.h>
     
    struct PosteTLOTS
    {
       char LOTNULOT[6];
       char LOTNUTRT[9];
       char LOTIDEME[25];
       char LOTDTPEC[8];
       char LOTHRPEC[7];
       char LOTNBEVE[9];
       char LOTNBREJ[9];
       char LOTNOMFI[251];
       char LOTNOMRJ[251];
       char LOTSOMME[33];
    };
    typedef struct PosteTLOTS PosteTLOTS;
     
    int main (void)
    {
       size_t i = 0;
    #define FNAME "data.txt"
       {
          FILE *fp = fopen (FNAME, "r");
          if (fp != NULL)
          {
             int c;
     
             while ((c = fgetc (fp)) != EOF)
             {
                i++;
             }
             fclose (fp), fp = NULL;
          }
          else
          {
             perror (FNAME);
          }
          assert (fp == NULL);
       }
     
       {
          PosteTLOTS BufferTLOTS =
          {
             {0}
          };
          PosteTLOTS *pBufferTLOTS = &BufferTLOTS;
     
          printf ("Longueur du fichier: %lu\n", (unsigned long) i);
          printf ("=> i : %d\n", i);
          sprintf (pBufferTLOTS->LOTSOMME, "%032g", (double) i);
          printf ("=> i en 32g : %32g\n", (double) i);
          printf ("=> i en l : %lu\n", (unsigned long) i);
          printf ("pBufferTLOTS->LOTSOMME : en s : %s; en l : %lu; en g : %32g\n",
                  pBufferTLOTS->LOTSOMME, strtoul (pBufferTLOTS->LOTSOMME, NULL,
                                                   10),
                  strtod (pBufferTLOTS->LOTSOMME, NULL));
          sprintf (pBufferTLOTS->LOTSOMME, "%32g", (double) i);
          printf ("=> taille fichier <%lu> \n", (unsigned long) i);
       }
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Longueur du fichier: 112
    => i : 112
    => i en 32g :                              112
    => i en l : 112
    pBufferTLOTS->LOTSOMME : en s : 00000000000000000000000000000112; en l : 112; en
     g :                              112
    => taille fichier <112>
     
    Press ENTER to continue.
    avec data.txt (j'ai pris ce qu'il y avait sur mon PC...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    1
    1,2
    1,2,3
    1,2,3,4
    1,2,3,4,5
    1,2,3,4,5,6
    1,2,3,4,5,6,7
    1,2,3,4,5,6,7,8
    1,2,3,4,5,6,7,8,9
    1,2,3,4,5,6,7,8,9,10
    Pose des questions si tu ne comprends pas...

  9. #9
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Oki... Ben écoute j'ai repris ce que tu avais mis, et ça marche. Mais j'ai une autre erreur dans une autre fonction appelé au part avant qui me fait tout planter... Donc je ne peux pas voirle résultat pour l'instant... Je trouve le problème et je reviens poster pour montrer le résultat et mettre le tag résolu. Merci beaucoup

  10. #10
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Par défaut
    Ca marche !!!! Le truc c'est que par contre je ne compte pas les blancs inutiles, situés àprès ma chaine de caractère. De plus, les "\n" sont compté sur le total des caractères, mais cela ne me dérange pas. Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/03/2014, 16h01
  2. Réponses: 4
    Dernier message: 31/07/2007, 21h52
  3. Problème d'attribut de lecture seule sur des dossiers
    Par Redbull dans le forum Sécurité
    Réponses: 2
    Dernier message: 09/08/2005, 09h52
  4. problème count avec la valeur 0
    Par cristolb dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/07/2005, 09h39
  5. Nouveau problème de récupération de valeurs.
    Par pmboutteau dans le forum ASP
    Réponses: 4
    Dernier message: 09/03/2005, 10h48

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