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 :

[Debutant] Du C dans le C++


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut [Debutant] Du C dans le C++
    Bonjour,
    J'ai créé une fonction en C que j'aimerais utiliser dans une IHM en C++. Comment puis-je appeller cette fonction C dans mon code C++ ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    J'ai cru comprendre qu'il fallait créer une librairie static pour ma fonction C et l'appeller dans les .h du C++. Cependant le peu d'explications que j'ai trouvé n'est pas très clair .

    Y'a-t-il un tuto dédié à cela ? Sinon quelqu'un pourrait-il m'expliquer la demarche ?

    Merci

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Entourre ton code C d'une extern "C" et utilise-le directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
     
    void MaFonctionC( void );
     
     
    #ifdef __cplusplus
    }
    #endif

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Alors attends, je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #ifdef __cplusplus 
    extern "C" { 
    #endif 
     
    void MaFonctionC( void )
    {
    //code
    }
     
    #ifdef __cplusplus 
    } 
    #endif
    direct dans le fichier cpp c'est ça ?
    si oui, je l'ai fait, et mon problème reste le même, c'est a dire qu'en C j'utilise une fonction swab qui prends n'importe quoi en parametre, en C++ il n'accepte que des char*. Or ici quand je compile, il considere la version c++ de swab alors que je l'ai entouré d'une extern C .

    Donc soit j'ai fais une mauvaise manip, soit je dois faire autrement.
    L'idée d'un librairie partagée serait-elle envisageable ?

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Non pas comme ça.
    Faut mettre ça dans ton .h de ton .c. Ensuite tu peux inclure ton .h dans ton .cpp et ça devrait rouler. Regarde dans <stdio.h> c'est fait comme ça par exemple.
    Ca c'est pour la compilation.
    Pour l'édition de liens, tu peux opter pour une lib partagée ou pas. C'est un détail.
    Pour swab je comprends pas trop, c'est pas un problème de cast plutôt ? Le C++ est un peu moins permissif.
    Donne le code qui pose problème.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Bon voici le code de ma fonction C qui marche très bien.
    Tu vois que dans le swab je passe des short. En C++ il veut que des char*. Le cast marche pas parce le swab avec les short inverse les bits, le swab avec le char* inverse les octets ou un truc dans le genre.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
     
    void decouper(char * nom_fic)
    {
    	FILE *pin;
    	FILE *pout2;
    	FILE *pout3;
    	FILE *pout4;
    	FILE *pout5;
     
        char ligne[500];
     
    	short big_s;
    	short lit_s;
    	int i;
    	int j;
     
     
    	pin = fopen(nom_fic, "rb"); 
    	pout2 = fopen("./Data/porte2.dat", "w");
    	pout3 = fopen("./Data/porte3.dat", "w");
    	pout4 = fopen("./Data/porte4.dat", "w");
    	pout5 = fopen("./Data/porte5.dat", "w");
     
    	for (i = 0; i < 1160; i++) //on fait pas sur 1h mais sur 58 min -> 58*60/3 = 1160 
        {
    	  fgets(ligne, 500, pin); //on met l'entete en memoire
     
     
    	  for (j = 0; j < 4096; j++) 
          { //on saut le bloc de 4096 points correpondant a la premiere porte
    	    fread(&big_s, sizeof(short),1, pin);
    	  }
     
    	  //fprintf(pout2, "Seconde %d\n", 3 * i);
    	  for (j = 0; j < 4096; j++) {
    	    fread(&big_s, sizeof(short),1, pin);
    	    swab(&big_s, &lit_s, sizeof(short));
    	    fprintf(pout2, "%d\n", lit_s);
    	  }
     
    	  //fprintf(pout3, "Seconde %d\n", 3 * i);
    	  for (j = 0; j < 4096; j++) {
    	    fread(&big_s, sizeof(short),1, pin);
    	    swab(&big_s, &lit_s, sizeof(short));
    	    fprintf(pout3, "%d\n", lit_s);
    	  }
     
    	  //fprintf(pout4, "Seconde %d\n", 3 * i);
    	  for (j = 0; j < 4096; j++) {
    	    fread(&big_s, sizeof(short),1, pin);
    	    swab(&big_s, &lit_s, sizeof(short));
    	    fprintf(pout4, "%d\n", lit_s);
    	  }
     
    	  //fprintf(pout5, "Seconde %d\n", 3 * i);
    	  for (j = 0; j < 4096; j++) {
    	    fread(&big_s, sizeof(short),1, pin);
    	    swab(&big_s, &lit_s, sizeof(short));
    	    fprintf(pout5, "%d\n", lit_s);
    	  }
    	}
     
     
    	fclose(pin);
    	fclose(pout2);
    	fclose(pout3);
    	fclose(pout4);
    	fclose(pout5);
        }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Bon j'ai fais ce que tu m'as dis, j'ai mis ça ds le .h du .c, compilation ok, execution ok.
    Ensuite je l'ai inclus dans le cpp : #include<decoupage.h> ça compile
    par contre si j'appelle la fonction decoupage, la ça compile plus, j'ai cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    error LNK2001: unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z)
    Debug/Test2.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Oui il faut compiler et linker ton .c avec tes .cpp, comme si c'était plusieurs .c ou plusieurs .cpp.

  9. #9
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,

    Ton code C est compatible C++ à première vue, tu peux l'utiliser directement, le C++ est prévu pour compiler du C.

    Comme le dit Bjarne Strourtrup, le C++ est un sur-ensemble du C. Seule quelques syntaxes spécifique du C ne compilent pas en C++.

    Le C++ par exemple oblige un cast explicite devant un malloc.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    .
    Oui il faut compiler et linker ton .c avec tes .cpp, comme si c'était plusieurs .c ou plusieurs .cpp.
    oui mais je fais ça avec Visual C++ en fait. Donc j'ai inclu les fichiers .h et .c dans le projet visual. En fait je comprends pas bien ce que tu veux me dire

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Caine
    Ton code C est compatible C++ à première vue, tu peux l'utiliser directement, le C++ est prévu pour compiler du C.
    Oui ça compile, mais comme je le disais, la fonction swab en C prends en parametre ce que je veux, alors qu'on C++ elle ne prend que du char*. Un cast n'a pas réglé mon prb, il faut absolument qeu j'utilise la version C de la fonction swab, masi j''en ai besoin dans une petite interface en C++

  12. #12
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je viens d'incorporer ton fichier sous VC++, il compile parfaitement.

    Le C++ a été prévu par son créateur Bjarne Strourtrup pour compiler avec du C standard.

    Il y a peu de code C qui ne compile pas en l'état avec un compilateur C++.

    Les codes C non compatibles C++ sont souvent des version pré-Ansi du C comme la syntaxe K&K la plus vieille.

    Ou depuis la dernière norme C, C99, pour le malloc par exemple.

    Tu n'as pas besoin de changer ton fichier pour le compiler.

    Cependant il est plus propre de faire comme l'a indiqué Aurelien dans un second temps.

    [edit]

    Donne nous le code de swab alors, ça aidera.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Caine
    Je viens d'incorporer ton fichier sous VC++, il compile parfaitement.
    Oui il compile, mais si tu essaye d'utiliser la fonction decoupage("nom_du_fichier_a_decouper") il va te dire que swab peut pas transformer un short* en char* ou un truc dans le genre. Donc pour l'instant ce que j'ai essayé :
    copier coller du code de la fonction C dans le fichier C++, donc la erreur a la compilation car swab ne prend que des char*
    inclure le fichier .C et .h dans le projet VC++ et la j'ai une erreur
    de compilation et des warnig :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    warning C4133: 'function' : incompatible types - from 'short *' to 'char *'
    error LNK2001:unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z)
    donc je veux bien savoir comment t'as fait pour compiler

    Ouai c'est ma fête aujourd'hui

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Bon ça compile pas, j'ai ça comme erreur quand j'appelle ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Test2Dlg.obj : error LNK2001: unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z)
    Debug/Test2.exe : fatal error LNK1120: 1 unresolved externals

  15. #15
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    OK j'ai compris l'erreur.

    Tu as un problème car ton système utilise l'Unicode, or tu passes une chaine normale.

    utilise _T("Tachaine") dans ton appel de fonction.

    Au passage, il ne s'agit pas d'un problème de C/C++ mais de chaînes de caractères.

    Vérifies tes options de compilation.

    [edit]

    Deuxième problème, sous VC, il faut inclure stdafx.h.

    Rajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "stdafx.h"
    AU début de ton code. Je pensais que tu connaissais, autant pour moi, c'est la seule modif que j'ai fait (avec mettre en commentaire les appels à Swab que je n'ai pas).

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Points : 78
    Points
    78
    Par défaut
    Bon l'histoire du stdafx.h j'ai fini par trouver, mais pour ce qui est du _T("Tachaine"), j'appelle ma fonction ainsi decoupage(_T("fichier.dat")); ?

    Si oui, ça ne marche toujours pas et ça donne la même erreur


    Je précise que ça compile, mais le problème se passe à l'execution

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Je dirais plutot à l'édition des liens.
    T'es sûr de ne pas avoir oublie le extern "C" ?

  18. #18
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je n'ai pas eu besoin des extern "C".

    J'ai pris son code directement et il compile.

    Tient, j'ai un trou de mémoire, car j'écris souvent du code C que je compile sans en C++.

    Pourquoi les Extern "C" à la base?

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Mets le code dans un fichier avec l'extenion .c, utilise-le depuis un fichier avec l'extension .cpp et tu vas découvrir l'utilité.
    Y'a une histoire de name mangling, de convention d'appels, etc...
    Sans name mangling la fonction s'appelle "decoupage", et avec le mangling C++ "?decoupage@@YAXPAD@Z", dans le cas de ce compilateur. La décoration de nom permet au compilo C++ de faire de la surcharge, de connaitre le type de paramètres de la fonction, etc...

  20. #20
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    OK, je me souviens maintenant.

    Si on met le, code dans un fichier d'extension cpp, il n'est plus la peine d'utiliser 'extern "C"'.

    C'est ce que je fait assez souvent, du mélange de code C et C++, mais toujours avec l'extension cpp.

Discussions similaires

  1. [Debutant] Se lancer dans le C++
    Par trakiss dans le forum Débuter
    Réponses: 19
    Dernier message: 29/08/2004, 21h27
  2. [debutant] supprimer elements dans une listbox
    Par F.F. dans le forum C++Builder
    Réponses: 8
    Dernier message: 02/07/2004, 11h38
  3. [debutant][swing] pb dans un paintComponent
    Par tambourin dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 03/06/2004, 20h27
  4. [debutant] ajouter ImageIcon dans un Jbutton
    Par agugu dans le forum Composants
    Réponses: 4
    Dernier message: 25/04/2004, 22h40
  5. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57

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