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 de compilation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut Problème de compilation
    Bonsoir,

    Tout d'abord voici mon 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <stdarg.h>
     #include <stdio.h>
    #include <stdlib.h>
    include "my_printf.h"
     
    char    *my_tab_flag()
    {
      char  *tab;
     
      tab = malloc(sizeof(tab) * 14);
      tab[0] = '%';
      tab[1] = 'd';
      tab[2] = 'i';
      tab[3] = 'c';
      tab[4] = 's';
      tab[5] = 'p';
      tab[6] = 'o';
      tab[7] = 'x';
      tab[8] = 'b';
      tab[9] = 'X';
      tab[10] = ' ';
      tab[11] = 'S';
      tab[12] = 'u';
      tab[13] = '\0';
      return (tab);
    }
     
    int     my_is_flag(char c, char *str)
    { 
      int   i;
     
      i = 0;
      while (str && str[i] && c != str[i])
        i = i + 1;
      return (i);
    }
     
    ptr_func        *make_ptr_func()
    {
      ptr_func      *ptr_flag;
     
      ptr_flag = malloc(sizeof(ptr_flag) * 14);
      ptr_flag[0] = flag_perc;
      ptr_flag[1] = flag_di;
      ptr_flag[2] = flag_di;
      ptr_flag[3] = flag_c;
      ptr_flag[4] = flag_s;
      ptr_flag[5] = flag_p;
      ptr_flag[6] = flag_o;
      ptr_flag[7] = flag_x;
      ptr_flag[8] = flag_b;
      ptr_flag[9] = flag_X;
      ptr_flag[10] = flag_space;
      ptr_flag[11] = flag_S;
      ptr_flag[12] = flag_u;
      ptr_flag[13] = '\0';
      return (ptr_flag);
    }
     
    int     my_printf2(const char *format, va_list ap, int i)
    {
      int   result;
      int   returned;
      ptr_func      *ptr_flag;
      char  *tab_flag;
     
      returned = 0;
      ptr_flag = make_ptr_func();
      tab_flag = my_tab_flag();
      while (format && format[i])
        {
          if (format[i] == '%')
            result = my_is_flag(format[i + 1], tab_flag);
          if (format[i] == '%' && result < 13)
            {
              returned = returned + ptr_flag[result](ap) - 1;
              i++;
            }
          else
            my_putchar(format[i]);
          returned++;
          i++;
        }
      return (returned);
    }
     
    int     my_printf(const char *format, ...)
    {
      va_list       ap;
      int   returned;
      int   i;
     
      i = 0;
      va_start(ap, format);
      returned = my_printf2(format, ap, i);
      va_end(ap);
      return (returned);
    }
    Voici mon printf.h :

    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
     
    #ifndef __MY_PRINTF__
       #define __MY_PRINTF__
     
    typedef int (*ptr_func)(va_list ap);
     
    int    flag_di(va_list ap);
    int     flag_perc(va_list ap);
    int     flag_c(va_list ap);
    int     flag_s(va_list ap);
    int     flag_p(va_list ap);
    int     flag_b(va_list ap);
    int     flag_x(va_list ap);
    int     flag_X(va_list ap);
    int     flag_o(va_list ap);
    int     flag_space(va_list ap);
    int     flag_S(va_list ap);
    int     flag_u(va_list ap);
     
    #endif
    En gros, j'essaie de recoder la fonction printf, mais, j'ai une erreur de compilation :
    "undefined reference to" pour tous mes flags.

    Je ne vois vraiment pas comment faire :/

    Merci de votre aide.

  2. #2
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut
    Bonjour,

    le truc qui me saute aux yeux:
    il me semble que dans ton printf.h, tu declares tes flag_di , flag_perc , flag_c etc ... comme des fonctions (avec des parenthèses) et dans ton source tu les utilises comme de int (sans parenthèses) : ptr_flag[0] = flag_perc;

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    ↑C'est normal, c'est un tableau de pointeur de fonctions.

    ↑↑"undefined reference" n'est pas une erreur de compilation mais une erreur d'édition de liens.

    PS: my_is_flag() devrait prendre son paramètre en const char *, vu qu'elle ne modifie pas la chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ↑C'est normal, c'est un tableau de pointeur de fonctions.
    oup's en effet, j'ai la mémoire qui flanche, http://www.developpez.net/forums/d13...urs-fonctions/

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut
    Salut !

    Merci de ta réponse.
    Tu voudrais dire qu'il faudrait que je les déclares juste comme de simples variables ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tes fonctions sont déclarées correctement. Il faut juste savoir dans quelle fichiers source elles sont définies, et si ta commande d'édition de liens prend en compte le fichier en question.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Par défaut
    Le fichier source je l'ai bien include pourtant

  8. #8
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Quelle est ta ligne de compilation dans le Makefile ?
    Et quelle est l'organisation "en gros" de tes .h/.c ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fullmetale Voir le message
    Le fichier source je l'ai bien include pourtant
    Salut
    On n'inclus pas des sources mais des headers, headers qui contiennent les signatures des fonctions.
    Le code contenant les fonctions, lui, doit être compilé à part puis le module objet correspondant doit ensuite être lié à l'exécutable.

    Typiquement, pour faire simple, imagine une fonction "carré".
    Tu commences par écrire le code de la fonction dans un fichier "carre.c"
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned long carre(int x)
    {
        return x*x;
    }

    Puis tu écris le header "carre.h" afin que les utilisateurs sachent comment appeler cette fonction. Et tu le protèges contre les inclusions multiples via un #ifdef (mais ça tu sais le faire)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef _CARRE_H_
    #define _CARRE_H_
    unsigned long carre(int);
    #endif // _CARRE_H_

    Ensuite tu écris le source de ton programme proprement dit ("pgm.c") qui va utiliser cette fonction
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "carre.h"
    int main()
    {
        printf("Le carré de 5 est %lu\n", carre(5));
    }

    Ensuite tu compiles carre.c et pgm.c en modules objets indépendants
    cc -c carre.c
    cc -c pgm.c

    Puis enfin tu relies ces modules objets entre eux pour faire l'exécutable
    cc carre.o pgm.o -o pgm

    Et là, losque le linqueur analyse pgm.o et qu'il voit qu'il utilise la fonction "carre", il sait où la chercher et ainsi pas de pb de liens indiquant que "carre" est inconnu...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  2. problème de compil devc++ socket
    Par stefdem dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2003, 11h33
  3. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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