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 :

tableau de fonction


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut tableau de fonction
    Bonjour,

    j'ai essayé l'exemple d'un cours de c sur les tableaux de fonction

    voila le code :

    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
    #include <stdio.h>
    #include <tgmath.h>
    #include <string.h>
     
    double sin(double), cos(double), exp(double), log(double);
     
    struct {
     
      char *nom;
      double (*fon)(double);
     
    } table[] = {
      "sin", sin,
      "cos", cos,
      "exp", exp,
      "log", log };
     
    #define NBF (sizeof table / sizeof table[0])
     
    int main(int argc, char **argv)
    {
      char nom[100];
      double nb = 0;
      int i = 0;
     
      while(1)
        {
          scanf("%s", nom);
          if(strcmp(nom, "fin") == 0) return 1;
          scanf("%lf", &nb);
     
          for(i = 0; i < NBF && strcmp(table[i].nom, nom) != 0; i++);
     
          if(i < NBF) printf("%f\n", (*table[i].fon)(nb));
          else printf("%s ? \n", nom);
        }
     
      return 0;
    }
    et les résultats de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main2.c:5:8: erreur: expected identifier or(’ before ‘__extension__’
    main2.c:13:3: attention : accolades manquantes autour de l'initialisation [-Wmissing-braces]
    main2.c:13:3: attention : (near initialization for ‘table[0]) [-Wmissing-braces]
    j'aimerais savoir pour quoi cela ne fonctionne pas.

    Merci d'avance,

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    • Ligne 2, tu inclus <tgmath.h> qui déclare lui-même les fonctions que tu essaies de re-déclarer ligne 5, et comme ce fichier utilise des macros define, celles-ci sont développées à ce moment et donnent un résultat incohérent. C'est pourquoi tu n'obtiens pas un message d'erreur explicite ;
    • Lignes 13 à 16, il faut ajouter des accolades à chaque paire de valeurs, car tu définis un tableau de structures.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    merci,

    mais cela ne fonctionne toujours pas
    j'ai juste inclus math.h sans les redéclarer par la suite et j'obtiens ça à la compil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /tmp/cc9GE0Rl.o:(.data+0x8): undefined reference to `sin'                                                                            
    /tmp/cc9GE0Rl.o:(.data+0x18): undefined reference to `cos'                                                                           
    /tmp/cc9GE0Rl.o:(.data+0x28): undefined reference to `exp'                                                                           
    /tmp/cc9GE0Rl.o:(.data+0x38): undefined reference to `log'
    collect2: ld a retourné 1 code d'état d'exécution

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    C'est une erreur classique : ton fichier *.h déclare les fonctions qui se trouvent ensuite dans une bibliothèque séparée. Si tu veux exploiter leurs adresses d'implantation en mémoire, il faut lier cette bibliothèque à ton projet.

    Ajoute -lm à ta ligne de commande.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Nickel merci,

    Juste par curiosité à quoi sert cette commande ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par panaC Voir le message
    Juste par curiosité
    Ah non ! :-) Surtout pas « juste par curiosité » !
    Il est fondamental que tu te poses ce genre de questions si tu fais du développement logiciel.

    à quoi sert cette commande ?
    « -l » (L minuscule, pour « library ») sert à lier une bibliothèque dynamique à ton programme compilé. Sous Unix, on préfixe tous les noms de bibliothèque par « lib » et, pour le compilateur, ce préfixe est implicite. La bibliothèque mathématique, accompagnée par <math.h>, s'appelle « libm.so ». On la lie donc avec l'exécutable via « -lm ».

    Note également que « #include <math.h> » n'est pas une commande d'import. #include ne fait qu'insérer le contenu d'un ficher à l'endroit où il a été appelé, quel que soit le contenu de ce fichier, d'ailleurs.

    Dans le cas des bibliothèques dynamiques, leur contenu a déjà été compilé et à l'avance. Il n'a donc pas à être inclus au milieu de de ton code source. Il n'empêche que celui-ci a quand même besoin du « mode d'emploi » pour savoir comment on l'utilise. C'est à ça que servent les « *.h » : ils contiennent toutes les définitions de types et déclarations de fonctions utilisés par la bibliothèque dont on souhaite se servir.

    C'est pour cela que tu obtenais le message « undefined reference to… » : si tu déclares une fonction sans la définir, le compilateur te fait confiance en estimant qu'elles doit se trouver dans un autre module et laisse en blanc ce qui doit l'être. Mais si au moment de construire ton exécutable (à l'édition des liens), on ne trouve toujours pas les fonctions correspondantes, alors l'éditeur de liens te répondra à juste titre que tu « fais référence à une fonction qui n'est pas définie ».

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de ton explication, clair et précise.

    Bonne soirée,

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

Discussions similaires

  1. tableau de fonction membre
    Par Sergejack dans le forum C++
    Réponses: 5
    Dernier message: 11/08/2006, 02h39
  2. [8086] Un tableau de fonctions
    Par disturbedID dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 21/04/2006, 21h14
  3. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  4. [mise à jour tableau en fonction du button radio]
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 30/12/2005, 11h41
  5. tableau et fonction en c++
    Par flobx dans le forum C++
    Réponses: 5
    Dernier message: 13/11/2005, 15h12

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