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 :

Define est chaine de caractères [Débutant(e)]


Sujet :

C

  1. #1
    Membre éclairé 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
    Par défaut Define est chaine de caractères
    Bonjour,

    J'ai un programme (récupéré), dont je souhaite modifier certaines déclations notamment des #define que je veux passer en tableau de char
    Dans le pgm d'origine un nom est déclaré par un define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define COM "toto"
    J'ai remplacé ce define par un fichier paramètre dans lequel je vais chercher "toto" pour le stocker dans un tableau de char[] (char COM[20])

    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
     
    ----
    int Len = 0;      
    char *pdeb = NULL;
    FILE *fparm;                   
    fparm = fopen("dd:SYSPRM","r");
    char COM[20]="";
    ----
    while(fgets(recparm,80,fparm) != NULL)
     {
      pdeb = strchr(recparm,':');
      Len = strlen(pdeb);   
      strncat(COM,pdeb,Len);   
      ---
     ---                               
     }
     
    ----
    Lorsque que j'affiche le contenu de COM, j'ai bien le paramêtre. Cependant ce paramêtre est passé à une fonction. Hors la fonction renvoi un code disant que COM est invalide.

    Existe t'il une difference entre une chaine créee par un #define est un tableau de char type char[] (dans son contenu) ?
    Faut il gérer un '\0' dans mon tableau, ce caractère est'il implicite lors d'un #define ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu ne dois pas comprendre le principe d'un #define.
    Un #define est une instruction du preprocesseur.

    En gros quand le preprocesseur va faire son tour sur ton code source il remplacera tous les occurences à ton #define par la valeur que tu lui a donné

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TATA "tata"
    printf("%s\n", TATA);
    Une fois le preproc passé ton code ressemblera à ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s\n", "tata");
    Donc dans ton code

    #define COM "toto" avec ensuite char COM... est une aberration sans nom.

  3. #3
    Membre éclairé 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
    Par défaut
    Je me suis mal exprimé.

    J'ai supprimé le '#define COM ' du code source pour le remplacer par un tableau de char[] afin de l'avoir COM en paramètre dans un fichier dans lequel je vais chercher sa valeur.

    Ma question est une chaine déclaré par 'define' est elle structurellement identique à une chaine d'un tableau de char[] ?

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu ne déclares rien du tout par un #define, le preprocesseur fait juste du remplacement.

    Mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *buffer = "tata";
    est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TATA "tata"
    const char *buffer = TATA;
    Si c'est ça que tu veux savoir.

  5. #5
    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 SPACHFR Voir le message
    J'ai supprimé le '#define COM ' du code source pour le remplacer par un tableau de char[] afin de l'avoir COM en paramètre dans un fichier dans lequel je vais chercher sa valeur.

    Ma question est une chaine déclaré par 'define' est elle structurellement identique à une chaine d'un tableau de char[] ?
    Non. C'est une chaine "littérale", c'est à dire non modifiable, de même nature que "hello" dans ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const *s = "hello";
    Mais c'est quand même un tableau de char initialisé terminé par un 0...

  6. #6
    Membre éclairé 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
    Par défaut
    En fait je ne veux plus de COM soit déclaré comme une constante mais comme un paramètre valorisé dans un fichier.

    Donc si je veux retrouver la même structure, je dois gérer la fin de chaine avec l'ajout de '\0' à la fin de la chaine du tableau de char[].

    J'ai testé la fin de chaine du contenu du tableu j'ai un '\n'
    La solution afin d'avoir la même chaine que celle déclararée par un #define est'elle de remplacer cet '\n' par un '\0' ?

  7. #7
    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 SPACHFR Voir le message
    En fait je ne veux plus de COM soit déclaré comme une constante mais comme un paramètre valorisé dans un fichier.
    C'est pas clair... Tu peux donner un exemple ?
    Donc si je veux retrouver la même structure, je dois gérer la fin de chaine avec l'ajout de '\0' à la fin de la chaine du tableau de char[].
    produit un tableau de char initialisé avec les caractères 'h', 'e' etc. terminé par un 0. C'est strictement équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      char s[] = {'h', 'e', 'l', 'l', 'o', 0};
    Le tableau est modifiable (mais ne peut être agrandi...)
    J'ai testé la fin de chaine du contenu du tableu j'ai un '\n'
    La solution afin d'avoir la même chaine que celle déclararée par un #define est'elle de remplacer cet '\n' par un '\0' ?
    Tu as testé quoi ? Dans quelles conditions ? On est pas devins...

    Et explique exactement ce que tu veux faire, parce que tu m'as l'air de passer par des chemins plutôt tortueux. Expose ton problème final et on étudiera les solutions.

  8. #8
    Membre éclairé 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
    Par défaut
    voila un exemple du fichier paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*---------------------------------------------------------------------*/
    /*  PGM PARAMETERS FILE                                                                */
    /* SET YOUR HMC ADRESS IP AND COMMUNITY NAME AS THE FOLLOWING */ /* SAMPLE                                                                                     */
    /* IP HMC    :XXX.XXX.XXX.XXX                                                        */
    /* COMMUNITY :COMMUNITY                                                            */
    /*---------------------------------------------------------------------*/
    IP HMC    :10.10.10.100                                                                                                      
    COMMUNITY :TOTO
    Ensuite pour récupérer ces paramètres j'ai fait le pgm suivant :
    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
     
    #include <stdio.h>              
    #include <stdlib.h>             
    #include <errno.h>              
    #include <string.h>             
    #include "zcostmng.h"           
    int main(void)                  
    {                               
    int rec = 0;                    
    int Len = 0;                    
    char *pdeb = NULL;              
    char IP[20]="";                 
    char COM[20]="";                
    char recparm[85] = "";          
    FILE *fparm;                    
    fparm = fopen("dd:SYSPRM","r"); 
    if (fparm != NULL)           
     {                                      
      while(fgets(recparm,80,fparm) != NULL)
       {                                    
        rec++;                              
        if (rec >= 6)      
        {                               
          pdeb = strchr(recparm,':');       
          pdeb = (pdeb + 1);            
          if ( pdeb != NULL)  
           {                                 
            if (rec == 7)      
             {                         
              Len = strlen(pdeb);      
              strncat(IP,pdeb,Len);    
              printf(" IP  : %s\n",IP);
             }                         
            if (rec == 8)              
             {                         
              Len = strlen(pdeb);      
              strncat(COM,pdeb,Len);   
              char *cn = strchr(COM,'\n');
              if ( cn != NULL)            
               {                          
                *cn = '\0';               
                printf(" trouve\n");      
               }                          
              printf(" COM : %s\n",COM);  
             }                            
           }                              
           else                           
           {                              
           printf("Error: Missing HMC IP adress or COMMUNITY name\n");     
           printf("       Verify your parameters member");                 
           exit(12);                                                       
           }                                                               
        }                                                                  
         *recparm = NULL;     /
       }                     /* fin du while */                            
     }                                                                     
     else { 
      printf(" Error :Unable to open parameters member\n");
      printf("        Check DD name SYSPRM            ");  
      exit(12);                                            
      }                                                    
     return(0);                                            
    } /* fin du main*/
    Dans le pgm d'origine l'adresse IP et la communauté sont valorisés en dur dans le programme par l'instruction '#define COM "TOTO" '

    J'ai ajouté ce petit bout de code pour récupérer ces paramètres dans un fichier. Mais lors de l'éxecution du programme (origine + mon bout de code sans le main() de mon code ), il me renvoi une erreur disant que la community (mon tableau de char COM[20]) est invalide.

    Concernant le test de fin de chaine je le fais via l'instruction strstr() en recherchant '\n'
    D'ou ma question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define COM "TOTO"
    la chaine est elle structurellement identique à
    sachant que j'ai valorisé COM[20] par le contenu du fichier paramètre.

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Non

    est equivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *COM = "toto";

  10. #10
    Membre éclairé 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
    Par défaut
    Oui mais COM n'est plus une constante, puisque je vais chercher la valeur dans un fichier

  11. #11
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Je suis désolé mais je comprends pas.

  12. #12
    Membre éclairé 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
    Par défaut
    En fait j'ai supprimé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define COM "toto"
    du code d'origine.
    j'ai remplacé ce ' #define ' par un petit bout de code chargé de lire un fichier puis de stocker ce qui est trouvé pour COM dans un tableau de char.
    Je passe ensuite ce tableau de char à une fonction qui initialise une connexion UDP pour faire du snmp.
    Hors, cette dernière fonction me renvoi systématiquement une erreur disant que COM (mon tableau de char) est invalide (comunauté invalide) comme si le nom n'était pas bon.
    Par contre si je remet le #define, ça marche. Je pense que le problème vient de mon tableau, mais je vois pas car quand je vais un printf() de mon tableau j'ai bien TOTO.

  13. #13
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    Je pense que le problème vient de mon tableau, mais je vois pas car quand je vais un printf() de mon tableau j'ai bien TOTO.
    Je conseillerais d'afficher la longueur de la chaîne avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d\n",strlen(COM));
    Le résultat est-il bien 4?

  14. #14
    Membre éclairé 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
    Par défaut
    Oui, le résultat est bon. j'ai modifé la fin de chaine en remplacant \n par \0.
    Je vais refaire le test sans modif de la chaine pour voir si j'ai le même résultat sur la taille de la chaine.
    Merci pour ce petit truc

  15. #15
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu es sur que ta chaine ne contient pas justement un \n à la fin avant le \0 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *p = strchr(COM, '\n');
    if(p != NULL)
    {
        *p = 0;
    }

  16. #16
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    D'après votre code, il semble que vous n'ôtiez pas le '\n' pour le paramètre IP comme vous l'avez fait pour COM? Ne serait-ce pas là la cause de votre problème?

  17. #17
    Membre éclairé 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
    Par défaut
    Effecivement, je ne le fais pas pour l'adresse IP car celle-ci était déjà passée en argument au programme. J'ai supprimé cette argument (@IP) pour la mettre dans un fichier avec le paramètre COM (qui lui était en dur dans le pgm).

    En fait avant je ne retirait pas l' \n de COM (probablement mon erreur)
    Maintenant je le remplace par \0.

    Malheureusement, je ne peux pas tester complétement le pgm. Je l'ai envoyé à un ami qui lui peux tester (j'attend le retour...).
    En attendant, je fais des traces IP dans lesquelles j'essai de trouver les différences.
    Apparament la trame envoyée est maintenant identique à celle du programme d'origine (du moins pour la partie concernant COM).

    Merci pour l'idée du strlen(), je vais également la tester sur le pgm d'origine histoire de voir les tailles de ces paramètres par rapport à ce qui est affiché

Discussions similaires

  1. #define et chaine de caractères
    Par Tequilapaf dans le forum C
    Réponses: 10
    Dernier message: 07/02/2011, 20h09
  2. Réponses: 2
    Dernier message: 13/08/2006, 23h56
  3. [RegEx] Tronquer une chaine de caractère sauf si c'est une URL.
    Par psychoBob dans le forum Langage
    Réponses: 16
    Dernier message: 03/06/2006, 12h01
  4. Réponses: 14
    Dernier message: 22/04/2006, 21h59
  5. Réponses: 11
    Dernier message: 24/03/2006, 11h12

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