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 avec une chaine de caractère en static


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut problème avec une chaine de caractère en static
    Bonjour,
    j’écris actuellement un programme qui récupère (dans un fichier) puis traite de longues chaines de caractère. Pour cela j’utilise une procédure dans laquelle je déclare une chaine de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tampon = (char *)malloc(1000*sizeof(char));
    Comme j’ai besoin de conserver le contenu de la chaine entre 2 appels de ma procédure, je souhaiterais la déclarer en static comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char *tampon = (char *)malloc(1000*sizeof(char));
    Mais j’obtient l’erreur de compilation suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: un élément de l'initialisation n'est pas une constante
    Avez-vous une idée?

    À savoir: en déclarant ma chaine comme un tableau de caractère, ça fonctionne, mais cette solution ne m’arrange pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char tampon[1000];
    Merci pour l’aide que vous pourrez m’apporter.

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Est-ce déclaré à l'intérieur du corps d'une fonction ou à l'extérieur ?

  3. #3
    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
    Le message est clair pourtant.
    Ca veut dire qu'une variable qui est initialisée lors de la déclaration avec le mot clé "static" doit être de type constante.

  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 Bayard
    Est-ce déclaré à l'intérieur du corps d'une fonction ou à l'extérieur ?
    La déclaration que nous montre le P.O est forcément faite à l'intérieure d'une fonction. A l'extérieure c'est impossible.

  5. #5
    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 EdXray
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tampon = (char *)malloc(1000*sizeof(char));
    Le cast sur le "malloc" n'est pas nécessaire en C.
    La taille d'un "char" ne peut pas valoir autre chose que 1.
    Ce code peut donc être réduit à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *tampon = malloc(1000);

  6. #6
    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 Bayard
    Est-ce déclaré à l'intérieur du corps d'une fonction ou à l'extérieur ?
    Peu importe, le problème est le même.

  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 EdXray
    Comme j’ai besoin de conserver le contenu de la chaine entre 2 appels de ma procédure, je souhaiterais la déclarer en static comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char *tampon = (char *)malloc(1000*sizeof(char));
    Mais j’obtient l’erreur de compilation suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: un élément de l'initialisation n'est pas une constante
    La méthode barbare que tu utilises est peu recommandable (comment tu libères ? comment tu instancies ?)

    Mais si tu y tiens, voici comment faire (les variables static ne peuvent être initialisée que par des expressions constantes) :

    Dans une fonction (ou non) :
    dans une fonction (la même si tampon est définie dans une fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {
       if (tampon == NULL)
       {
          tampon = malloc (1000 *sizeof *tampon);
          if (tampon != NULL)
          {
             /* ... suite ... */
          }
       }
    }
    mais, sauf dans de rares cas, tout celà est du domaine de la bidouille infâme. Tu devrais apprendre à programmer par contextes (structures) et donc à écrire du code réutilisable et instanciable (séparation du code et des instances des données).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour votre aide si rapide!

    Citation Envoyé par Emmanuel Delahaye
    mais, sauf dans de rares cas, tout celà est du domaine de la bidouille infâme. Tu devrais apprendre à programmer par contextes (structures) et donc à écrire du code réutilisable et instanciable (séparation du code et des instances des données).
    Je ne connais pas encore ttes les ficelles de C mais la propreté de mon code est ma priorité. Pourrais tu m’expliquer en qq mots ce qu’est la programmation par contextes? Je pensais que le mot instanciation était réservé à la programmation objet...

  9. #9
    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 EdXray
    Je ne connais pas encore ttes les ficelles de C mais la propreté de mon code est ma priorité. Pourrais tu m’expliquer en qq mots ce qu’est la programmation par contextes? Je pensais que le mot instanciation était réservé à la programmation objet...
    Il est fréquent que l'on ait besoin de données persistantes dans une code. Pour ça, on définit les données soit comme variable locale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void f ()
    {
       T var;
    }
    soit comme variable dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void f ()
    {
       T* p_var = malloc (sizeof *p_var);
    }
    et ensuite, on passe l'adresse de la variable aux fonctions qui en ont besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f ()
    {
       T var;
       g (&var, ...);
       h (&var, ...);
    }
    ou, en dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void f ()
    {
       T* p_var = malloc (sizeof *p_var);
       if (p_var != NULL)
       {
          g (p_var, ...);
          h (p_var, ...);
     
     
          /* quand c'est fini */
          free (p_var), p_var = NULL;
       }
    }
    Les fonctions g() et h() ont pour prototype (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* lecture / écriture */
    void g(T *p);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* lecture seule */
    void h(T const *p);
    T est un type qui peut être simple ou composé (tableau, structure)

    Le gros avantage de ce type de codage est que l'on peut créer plusieurs instances des données qui utilisent le même code, ce qui est impossible avec une statique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void f ()
    {
       T var_a;
       T var_b;
     
       g (&var_a, ...);
       h (&var_a, ...);
     
       g (&var_b, ...);
       h (&var_b, ...);
    }
    C'est comme ça que fonctionne FILE*, par exemple...

    Pour aller plus loin :

    http://emmanuel-delahaye.developpez.com/tad.htm

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2007, 14h10
  2. [débutant] Problême avec les chaines de caractères
    Par Micky_du_57 dans le forum C++
    Réponses: 2
    Dernier message: 03/06/2007, 19h03
  3. Réponses: 4
    Dernier message: 01/02/2007, 19h06
  4. Réponses: 5
    Dernier message: 26/07/2006, 11h13
  5. Réponses: 3
    Dernier message: 26/05/2006, 19h49

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