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 :

Compilation programmation modulaire


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 26
    Par défaut Compilation programmation modulaire
    Bonjour,*

    Jai un pb dans mon code, je souhaiterai crer une fonction et l utiliser dans mon main en l'écrivant avec fprintf dans un nouveau fichier fonction.c et en incluant le header dans le fichier main.c

    Or lorsque j execute mon fichier le compilateur n'arrive pas a gérer la création de la fonction dans fonction.c et son appelle dans main.c

    Aidez moi svp, je suis perdue

  2. #2
    Membre actif Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Par défaut
    si tu veux dire que la fonction doit être dans le fichier fonction.c et l'appeler dans main.c alors le fichier contenant cette fonction doit avoir l'extension *.h
    et son appel dans l’entête de main.c est:

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Pour chaque fichier d'implémentation .c tu devrais avoir un fichier d'en-tête .h qui déclare les fonctions qui s'y trouvent.
    Ce fichier .h doit être inclus pour pouvoir déclarer les fonctions qui existent et pouvoir les utiliser dans le fichier incluant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 26
    Par défaut
    Alors je me suis peut être un peu mal exprimé mais j'aimerai trouver un moyen de compiler la fonction hello juste après sa création dans un fichier .c par fprintf
    Mais en gros voici mon code et code blocks m affiche "undefined reference to hello()"
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "entete1.h"
     
    int main()
    {
     
    FILE* fichier2 = NULL;
     
    fichier2 = fopen("fonction1.c", "a");
     
    if(fichier2 != NULL)
    {
     
      fprintf(fichier2, "void hello()\n{\nprintf(\"Hello there\");\n}");
     
      fclose(fichier2);
    }
    else
    {
        printf("Impossible d'ouvrir le fichier entete1.h");
    }
     
    hello();
    return 0;
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Je suppose que hello est déclarée dans entete1.h et définie dans entete1.c
    Il faut bien sûr ajouter le fichier .c à ton projet sur ton IDE pour qu'il le compile et le lie automatiquement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 26
    Par défaut
    Le problème c que je l'ai bien ajouté au projet mais il ne semble pas vouloir compiler le fichier fonction1.c apres qu'on l'ai complété par l'instruction fprintf
    Voici le fichier fonction1.c qui sera complété lors de l'éxécution du programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "entete1.h"

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Tu essayes d'utiliser un fichier que tu compilerais en même temps.
    Ta demande n'a aucun sens, à fortiori à ton niveau.
    Fais un second programme qui remplisse ce fichier, puis recompile ton projet.
    Tu peux probablement inclure l'exécution de ce programme automatiquement quand tu compiles ton projet.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Donc tu ne maîtrises pas la notion de compilation/ édition de liens

    Il faut faire 2 projets :
    • Un projet "generation - moulinette" (ou nom approchant) qui va faire ton fprintf et générer le fichier source .c (1)
    • Ton projet principal, qui va utiliser ton fichier source (1)


    Mais, évidement à chaque changement de ton source (1), il faut exécuter ton projet "generation - moulinette" et recompiler ton projet principal.

    Ensuite tu peux simplifier le processus en faisant ton projet "generation - moulinette", une bibliothèque dynamique (2) (fichier .dll ou .so).
    Dans ce cas, tu n'auras qu'a regénérer ta bibliothèque (2) et c'est tout.
    Mais dans ton projet principal, il faudra faire tout le code pour ouvrir/ fermer ta bibliothèque (2) et faire les appels (*)
    Mais attention aux allocations à l'intérieur de ta bibliothèque (2) et aux échanges de données qui ne sont pas des PODs (hors structures et pointeurs, lien wiki en anglais) entre elle et ton projet.

    Et enfin tu as un dernier moyen : intégrer un parser d'1 langage script/ interprété comme Python, Lua, JavaScript.
    Alors certes, ta source (1) ne sera plus en langage C, mais à chaque fois que tu exécuteras ton projet principal, ton code sera reparsé et donc pas de prise de tête de regénération/ recompilation/ chemin de la bibliothèque/ ...

    Et si tu as le temps, tu peux aussi regarder les outils comme moc de Qt qui peuvent sûrement être paramétrés pour générer des sources avant la compilation.


    * : Sous Windows, tu as un système pour t'aider à faire ce code. Cela s'appelle 1 bibliothèque partagée.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Citation Envoyé par foetus Voir le message
    Ensuite tu peux simplifier le processus en faisant ton projet compilation "generation", une bibliothèque dynamique (2) (fichier .dll ou .so).
    Dans ce cas, tu n'auras qu'a regénérer ta bibliothèque (2) et c'est tout.
    Mais dans ton projet principal, il faudra faire tout le code pour ouvrir/ fermer ta bibliothèque (2) et faire les appels (*)
    Mais attention aux allocations à l'intérieur de ta bibliothèque (2) et aux échanges de données qui ne sont pas des PODs (hors structures et pointeurs, lien wiki en anglais) entre elle et ton projet.
    Dans ce cas, on peut simplifier encore plus en faisant du projet "génération" et du projet "appelant" un seul et même projet. Un truc du genre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef void (*helloproc)(void);
     
    void CreeEtUtiliseBiblio()
    {
    	CreeFichier("fonction1.c", "void hello()\n{\nprintf(\"Hello there\");\n}");
    	system("gcc (options qui vont bien) -o fonction1.so fonction1.c");
    	void* pDll = dlopen("fonction1.so", RTLD_NOW);
    	helloproc pHello = dlsym(pDll, "hello");
     
    	pHello();
     
    	dlclose(pDll);
    }

    Bien sûr, ça va polluer le répertoire courant. Mais bon, faire ça de manière propre, c'est pour plus tard.

    Edit: Oh, et les antivirus tendent à ne vraiment pas aimer ce genre de programme.
    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.

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Dans ce cas, on peut simplifier encore plus en faisant du projet "génération" et du projet "appelant" un seul et même projet. Un truc du genre:
    J'y pensait également :

    Mais autant dans ce cas, faire un script bash, python ou un makefile.

    Et d'ailleurs , c'était ma dernière phrase/ mon dernier point : des outils faisant partie de la chaîne de compilation, sont déjà créé pour parser et générer des sources (comme moc de Qt), peuvent peut-être le faire.

Discussions similaires

  1. L'interet de la programmation modulaire.
    Par giggs dans le forum C
    Réponses: 3
    Dernier message: 01/11/2006, 12h35
  2. programmation modulaire en C
    Par lastrecrue dans le forum GTK+ avec C & C++
    Réponses: 11
    Dernier message: 28/06/2006, 21h03
  3. programmation modulair en C
    Par argon dans le forum C
    Réponses: 32
    Dernier message: 26/06/2006, 10h10
  4. programmation modulaire
    Par barbarello dans le forum C++
    Réponses: 2
    Dernier message: 19/02/2006, 13h04
  5. [Projet] Programmation modulaire d'un projet.
    Par loverdose dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 18/11/2005, 21h59

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