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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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