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 :

Passage en paramètre d'un tableau déclaré statiquement lors de l'appel à la fonction


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut Passage en paramètre d'un tableau déclaré statiquement lors de l'appel à la fonction
    Soit la fonction f déclarée comme suit: Il est possible de lui passer en paramètre un tableau de caractères déclaré statiquement lors de l'appel à la fonction grâce à la notation des chaînes de caractères: Est-il possible de faire de même pour une fonction g déclarée comme suit: La notation utilisée pour initialiser les tableaux statiques d'entiers ne marche pas: Cordialement.

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    préférer const char * à char *, car f ne doit pas modifier les éléments du tableau. Même remarque pour g. Maintenant pour la question, c'est faisable en C99 mais pas en C90. De nombreux compilateurs, dont gcc, supportent déjà le C99.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Apparement, il faut caster le type du tableau dans l'appel à la fonction pour que cela marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g((int[]){0x00,0x10,0x20});
    Sauf qu'en fait la fonction g attend un second paramètre, la taille du tableau: Bien sûr, on peut remettre deux fois la déclaration statique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g((int[]){0x00,0x10,0x20}, sizeof((int[]){0x00,0x10,0x20}));
    Seulement il serait plus propre d'utiliser une macro pour ne la mettre qu'une fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define h(t) g(t, sizeof(t))
    Mais sans savoir pourquoi, cela nécessite une paire de parenthèses supplémentaire lors de l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h(((int[]){0x00,0x10,0x20}));
    Voilà pour ceux que ca pourrait intéresser.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Melem Voir le message
    préférer const char * à char *, car f ne doit pas modifier les éléments du tableau. Même remarque pour g. Maintenant pour la question, c'est faisable en C99 mais pas en C90. De nombreux compilateurs, dont gcc, supportent déjà le C99.
    Exact pour le const, celui-ci est bien présent dans mon code qui est un poil plus compliqué que le petit exemple que j'ai utilisé dans mon message initial.

    Effectivement, d'après mes recherches sur le web, la notation que j'utilise dans mon précédent message serait une des nouveautés du C99. Toutefois, gcc n'a pas l'air d'avoir besoin du paramètre std=c99 pour compiler cela, contrairement à par exemple, la déclaration de variables initiales dans les boucles for.

    Cordialement.

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Toutefois, gcc n'a pas l'air d'avoir besoin du paramètre std=c99 pour compiler cela
    Parce que cette syntaxe a déjà été supportée par gcc avant sa normalisation (d'ailleurs les nouveautés du C99 viennent en majorité des fonctionnalités GNU C) ...

    Mais sans savoir pourquoi, cela nécessite une paire de parenthèses supplémentaire lors de l'appel
    Etrange en effet. Et que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define h(t) g((t), sizeof((t)))
    ?

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h((int[]){0x00,0x10,0x20});
    Sans les parenthèses, la macro croit qu'il y a 3 arguments
    (int[]){0x00
    0x10
    et
    0x20}

    il faut caster le type du tableau dans l'appel à la fonction pour que cela marche:
    Il faut bien spécifier le type de l'objet (non nommé) que l'on veut créer. Mais, bien que la syntaxe soit similaire à celle d'un cast, ce n'est pas l'opérateur de cast puisque le résultat est un objet. (C'est comme spécifier un type entre parenthèses pour l'opérateur sizeof, ça ressemble à un cast sans en être un)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Melem Voir le message
    Parce que cette syntaxe a déjà été supportée par gcc avant sa normalisation (d'ailleurs les nouveautés du C99 viennent en majorité des fonctionnalités GNU C) ...

    Etrange en effet. Et que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define h(t) g((t), sizeof((t)))
    ?
    Ca ne change rien, mais comme la suggéré Diogene, sans parenthèse, le préprocesseur prend en effet chacun des élements du tableau pour des paramètres séparées.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ah oui ça je ne l'avais pas vu. En plus sans compilo pour tester, je ne l'aurais jamais pu trouvé. Heureusement alors que diogene soit passé .

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2014, 14h26
  2. [WD15] Passage en paramètre d'un tableau à 2 dimentions
    Par Laurent_m_paris dans le forum WinDev
    Réponses: 5
    Dernier message: 15/09/2010, 16h49
  3. Réponses: 5
    Dernier message: 08/07/2008, 19h57
  4. Procédure : Tableau en passage de paramètres
    Par ero-sennin dans le forum Delphi
    Réponses: 10
    Dernier message: 04/08/2006, 17h00
  5. passage par paramètre d'un tableau dynamique bidimensionnel
    Par shaftJackson dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/07/2006, 13h28

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