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 :

[débutant] ecriture de lignes dans un fichier


Sujet :

C

  1. #1
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut [débutant] ecriture de lignes dans un fichier
    Bonjour
    J'ai un petit code source qui il un fichier ASCCI,converti chaque caractère en EBCDIC puis ecrit le résultat (ligne par ligne ) dans un fichier de sortie.
    Toute fonctionne sauf que j'écris toujours sur la même ligne en sortie ...

    Mon ASCCI fichier en entrée (je suis sur système IBM donc c'est normal)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ø/ÈÊÑÄÁ               Ã*
    ø/ÈÊÑÄÁ               Ã*
    Mon fichier EBCDIC en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    patrice  .0123456789 patrice  .0123456789
    Le transcodage est bon mais tout est sur une ligne ?

    Voici mon source (zcost.h contient la fonction atoe)
    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
     
    /*---------------------------------------------------------------*/
    /* objet : conversion d'un fichier ASCII -> EBCDIC               */
    /*---------------------------------------------------------------*/
    #include <stdio.h>                                                 
    #include <string.h>                                                
    #include "zcost.h"                                                 
    #define LRECL 80                                                   
    FILE *fp;                                                          
    FILE *fpwrite;                                                     
    void read_fic(){                                
      char line[LRECL];                             
      char wline[LRECL];                            
      char Cchaine;                                 
      int compteur=0;                               
      int Ctrl=0;                                   
      if (fgets(line,sizeof line,fp)==NULL) {       
          printf("I/O error when reading file\n");} 
      while (fgets(line,LRECL,fp)!=NULL)                              
         {                                                            
      /*  puts(line); */                                              
          for (compteur=0;compteur<strlen(line);compteur++)           
            {                                                         
             if (strlen(line)>2)                                      
              wline[compteur]=atoe(&line[compteur]); /*transcodage*/  
              Ctrl=1;                                /*enreg valide*/ 
            }/*fin du for*/                                           
            if (Ctrl)                                                 
             {                                                        
          /*  wline[compteur+1]='\0';   fin de l'enreg */             
              fputs(wline,fpwrite); /*ecriture de l'enreg complet*/   
              Ctrl=0;                                                 
             }/*fin du if*/                                           
         }/*fin while*/                                               
    }                                                  /*fin read_fic*/
    /*---------------------------------------------------------------*/
    int main() {                                                   
    if ((fp = fopen("'ADCDB.MIB.HEXA'","r")) == NULL)              
       fprintf(stderr,"Unable to open source file \n");            
     else                                                          
       {                                                           
         if ((fpwrite = fopen("'ADCDB.MIB.HEXA.NEW'","w")) == NULL)
         fprintf(stderr,"Unable to open dest file \n");            
         else                                                      
         {                                                         
          read_fic();                                              
          fclose(fp);                                              
          fclose(fpwrite);                                         
         }                                                         
       }                                                           
    return 0;                                                      
    } /* fin du main */
    J'ai essayé d'ajouter \0 c'est pareil.
    Pouvez vous m'expliquez ou est mon erreur ?
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par SPACHFR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            if (Ctrl)                                                 
             {                                                        
          /*  wline[compteur+1]='\0';   fin de l'enreg */             
              fputs(wline,fpwrite); /*ecriture de l'enreg complet*/   
              Ctrl=0;                                                 
             }/*fin du if*/
    Pourquoi compteur+1 ?
    J'aurais simplement mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (Ctrl)                                                 
             {                                                        
              wline[compteur]='\0';               
              fputs(wline,fpwrite); /*ecriture de l'enreg complet*/   
              Ctrl=0;                                                 
             }/*fin du if*/
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    J'ai pas regarde ton programme, mais je me demande si ton fichier ascii sur un ordinateur ebcdic, tu ne devrais pas l'ouvrir comme etant du binaire.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    J'ai pas regarde ton programme, mais je me demande si ton fichier ascii sur un ordinateur ebcdic, tu ne devrais pas l'ouvrir comme etant du binaire.
    Hmmm, pas bête du tout cette idée...
    Je pense que c'est une très bonne piste
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #5
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    C''etait pour ne pas écraser le dernier caractère de la chaine.
    Je vais le tester avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (Ctrl)                                                 
             {                                                        
              wline[compteur]='\0';               
              fputs(wline,fpwrite); /*ecriture de l'enreg complet*/   
              Ctrl=0;                                                 
             }/*fin du if*/
    est j'ai ça en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     patrice  .0123456789 pa
    Consernant la transco elle fonctionne parfaitement, quel est l'intérêt de d'ouvrir mon fichier en binaire ?
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    fputs() ne génère pas automatiquement de \n, contrairement à puts().
    Si tu supprimes le \n à un moment ou un autre de la lecture, tu dois l'insérer toi-même lors de l'écriture.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par SPACHFR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    patrice  .0123456789 patrice  .0123456789
    Le transcodage est bon mais tout est sur une ligne ?

    Voici mon source (zcost.h contient la fonction atoe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             if (strlen(line)>2)                                      
              wline[compteur]=atoe(&line[compteur]); /*transcodage*/  
              Ctrl=1;                                /*enreg valide*/
    Ceci mieux présenté donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             if (strlen (line) > 2)
                wline[compteur] = atoe (&line[compteur]); /*transcodage */
             Ctrl = 1;              /*enreg valide */
    ce qui montre clairement que Ctrl vaut 1 tout le temps. Tu voulais peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             if (strlen (line) > 2)
             {
                wline[compteur] = atoe (&line[compteur]); /*transcodage */
                Ctrl = 1;              /*enreg valide */
             }
    Pourquoi ne pas alors ecrire tout simplement :
    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
     
       while (fgets (line, LRECL, fp) != NULL)
       {
           size_t const len = strlen (line);
           if (len > 2)
           {
              for (compteur = 0; compteur < len; compteur++)
              {
                 /*transcodage */
                 wline[compteur] = atoe (line + compteur); 
              }                         /*fin du for */
             wline[compteur] = '\0';
     
             /*ecriture de l'enreg complet */
             fputs (wline, fpwrite); 
          }                         /*fin du if */
       }                            /*fin while */
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Bien vue pour la variable Ctrl qui était toujours à 1.
    C'est vrai qu' une fois la forme de l'écriture du code améliorée ça saute au yeux. Merci pour ce precieux conseil tout simple mais efficace.
    ça fonctionne, avec la boucle while j'ai ajouté le '\n' avant la fin de chaine.
    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
     
    while (fgets (line, LRECL, fp) != NULL)                    
       {                                                       
           printf("une lign");                                 
           size_t const len = strlen (line);                   
           if (len > 2)                                        
           {                                                   
              for (compteur = 0; compteur < len; compteur++)   
              {                                                
                 /*transcodage */                              
                 wline[compteur] = atoe (line + compteur);     
              }                         /*fin du for */        
             wline[compteur] = '\n';                           
             wline[++compteur] = '\0';                         
             /*ecriture de l'enreg complet */                  
             printf("ligne n:%d\n",++a);                       
             fputs (wline, fpwrite);                           
          }                         /*fin du if */
    J'ai une dernière question à propos de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    size_t const len = strlen (line);
    Quelle différence et intérêt par rapport à une déclaration de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int len=0;
    ---
    len = strlen(line);
    Je ne comprend pas le : size_t const
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ça indique qu'il ne sera pas modifiable ensuite.
    Et bien sûr, une "variable constante" ne peut être affectée que lors de sa déclaration (une initialisation, quoi) puisqu'elle ne peut être modifiée après.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    mais que vient faire ce size_t ?
    Mettre la variable en constante pourquoi pas pourtant les longueurs de mes enreg peuvent varier, donc len également..
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    size_t est le type de retour de strlen().
    Ça veut dire qu'on lit la taille avec strlen(), on la mémoirise et on ne modifie plus la variable jusqu'à la fin du bloc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    OK, je vais approfondir la fonction strlen (retour dans le tutorial.....)

    Merci à tous
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par SPACHFR
    J'ai une dernière question à propos de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    size_t const len = strlen (line);
    Quelle différence et intérêt par rapport à une déclaration de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int len=0;
    ---
    len = strlen(line);
    Je ne comprend pas le : size_t const
    Il y a 2 choses;

    size_t et const.

    Pour const, tu as déjà eu une réponse. Pour size_t, c'est tout simplement le type retourné par strlen(), alors moi pas contrariant...

    http://emmanuel-delahaye.developpez....tes.htm#size_t
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour le fait que ce soit le type retourné par sizeof, j'ai toujours des doutes.
    Ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
    	size_t taille1 = sizeof(int);
    	int taille2 = sizeof(int);
    	short taille3 = sizeof(int);
    }
    ne me donne aucun warning sous Visual 2005, malgré le fait que je sois en Warning niveau 4 + warning 64bits (cette seconde option donnant un warning si je cherche à affecter un size_t à un int).

    Il faudrait que je voie ce que donne un test avec gcc...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    Pour le fait que ce soit le type retourné par sizeof, j'ai toujours des doutes.
    Il n'y a aucun doute à avoir :
    Citation Envoyé par n1124
    ISO/IEC 9899:TC2 Committee Draft — May 6, 2005 WG14/N1124
    6.5.3.4 The sizeof operator
    Constraints
    <...>
    4 The value of the result is implementation-defined, and its type (an unsigned integer type)
    is size_t,
    defined in <stddef.h> (and other headers).
    <...>
    Ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        {
    		size_t taille1 = sizeof(int);
    		int taille2 = sizeof(int);
    		short taille3 = sizeof(int);
        }
    ne me donne aucun warning sous Visual 2005, malgré le fait que je sois en Warning niveau 4 + warning 64bits (cette seconde option donnant un warning si je cherche à affecter un size_t à un int).

    Il faudrait que je voie ce que donne un test avec gcc...
    Comme tu évalues des expressions constantes qui tiendraient même dans un signed char, il est normal qu'il n'y ait pas de warnings...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stddef.h>
     
    int main (void)
    {
       int a[1];
       size_t taille1 = sizeof (a);
       int taille2 = sizeof (a);
       short taille3 = sizeof (a);
       signed char taille4 = sizeof (a);
       return 0;
    }
    RAS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stddef.h>
     
    int main (void)
    {
       int a[1u << 12];
       size_t taille1 = sizeof (a);
       int taille2 = sizeof (a);
       short taille3 = sizeof (a);
       signed char taille4 = sizeof (a);
       return 0;
    }
    main.c:9: warning: overflow in implicit constant conversion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stddef.h>
     
    int main (void)
    {
       int a[1u << 14];
       size_t taille1 = sizeof (a);
       int taille2 = sizeof (a);
       short taille3 = sizeof (a);
       signed char taille4 = sizeof (a);
       return 0;
    }
    main.c:8: warning: overflow in implicit constant conversion
    main.c:9: warning: overflow in implicit constant conversion

    etc.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet, les compilateurs ne font pas la norme.
    Mais il font l'implémentation.
    Avec ce genre de problème, il faut un cast systématique si l'on veut utiliser un sizeof dans une fonction variadique...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    En effet, les compilateurs ne font pas la norme.
    Mais il font l'implémentation.
    Avec ce genre de problème, il faut un cast systématique si l'on veut utiliser un sizeof dans une fonction variadique...
    Relis ma réponse, je l'ai amendée.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet.
    Mais avec ces warnings, le compilateur (l'implémentation, donc) ne semble pas "attribuer un type" à sizeof. Quand je vois ce code et ces warnings, j'ai l'impression qu'il les traite comme de simples constantes numériques.

    Et je ne pense pas qu'on puisse dire que "1 a le type int", par exemple...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    En effet.
    Mais avec ces warnings, le compilateur (l'implémentation, donc) ne semble pas "attribuer un type" à sizeof. Quand je vois ce code et ces warnings, j'ai l'impression qu'il les traites comme de simples constantes numériques.

    Et je ne pense pas qu'on puisse dire que "1 a le type int", par exemple...
    Citation Envoyé par ISO-C
    The type of an integer constant is the first of the corresponding list in which its value can be represented.
    Suit un tableau a double entree donnant des listes differentes suivant le suffixe et la nature (decimal ou octal/hexadecimale) de la constante. 1 a clairement le type int d'apres cela (ca joue pour le passage des parametres a des fonctions variadiques entre autres).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Merci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Ecriture ligne par ligne dans un fichier texte
    Par PhDt76 dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/12/2008, 17h11
  2. Débutant - Suppression de lignes dans un fichier
    Par Mil17 dans le forum Langage
    Réponses: 1
    Dernier message: 20/11/2007, 17h08
  3. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 16h23
  4. Réponses: 2
    Dernier message: 02/03/2004, 19h38
  5. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

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