Analyse.cpp n'inclue pas Analyse.h.
Et Analyse.h n'inclue pas l'en-tête qui définit la classe CImgl.
Analyse.cpp n'inclue pas Analyse.h.
Et Analyse.h n'inclue pas l'en-tête qui définit la classe CImgl.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Désolé, j'ai du quitter le boulot un peu précipitamment hier après midi.Envoyé par touco
J'ai continuer d'analyser mon problème, et je tombe sur quelque chose de bizarre (merci Miles et Touco).
Mon problème est le suivant : lorsque je déclare la fonction importDonnees comme suit :le compilateur m'indique ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CImg <unsigned char> importDonnees ( int numchoc, int camera, long image_deb, long image_fin)
Quand je remplace (pour test) cette fonction par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Compilation... analyse.cpp analyse.cpp(15) : error C2143: erreur de syntaxe : absence de ';' avant '<' analyse.cpp(15) : error C2501: 'CImgl' : Spécificateurs de type ou de classe de stockage manquants analyse.cpp(15) : error C2143: erreur de syntaxe : absence de ';' avant '{' analyse.cpp(15) : error C2447: '{' : en-tête de fonction manquant (liste formelle à l'ancien format ?)
ça compile sans aucuns problèmes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int importDonnees (int numchoc, int camera, long image_deb, long image_fin) { return 0; }![]()
Mon problème viendrait donc du template??? Pourtant, il n'y a rien de sorcier là dedans, je n'utilise pas de typename....
Merci énormément pour votre aide!![]()
Ca vient du fait qu'il ne sache pas ce qu'est CImg, ce qu'on disait un peu plus haut, il manque un header à inclure quelque part.
Je comprend bien ce que tu veux dire Miles, le problème c'est que l'include y est... il sert pour toutes les autres fonctions!Envoyé par Miles
Pour mémoire, voici mon main :Le truc, c'est que lorsque j'ôte #include "analyse.h" et que j'insère le code à la place
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 /*Main*/ #include <list> #include <algorithm> #include <iostream> // Les 3 fonctions exportées de la DLL tsrir_c.dll extern "C" int IRnb_images( int num_choc, int camera, int *nbimages ); extern "C" int IRimages( int num_choc, int camera, long image_deb, long image_fin, unsignedshort ** Images); extern "C" int IRimages_pas( int num_choc, int camera, long image_deb, long image_fin, long pas, unsignedshort ** Images ); #include "CImg.h" //pour la définition de CImg et CImgl usingnamespace cimg_library; //namespace correspondant #include "calc_camir.h" #include "quadrillage.h" #include "warping.h" #include "masque.h" #include "outils.h" #include "choixzone.h" #include "analyse.h" // .h du fichier qui nous intéresseca COMPILE !!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CImgl <unsignedshort> importDonnees (int numchoc, int camera, long image_deb, long image_fin) { CImg <unsignedshort> liste; return liste; }![]()
Y'a un truc qui m'échappe![]()
C'est donc que ton analyse.h fait du n'importe quoiDéjà, le using namespace est à mettre après tous les #include.
Bon, le pb est que tu n'inclus sans doute pas les headers dans analyse.cpp. En fait, tu devrais inclure les headers indispensables dans analyse.h. Là, tu nous dis comment résoudre lee pb en trafiquant dans main.cpp alors que le pb est dans analyse.cpp.
Je ne pense pas puisque mes autres include sont du type :Envoyé par Miles
car le fichier outils.cpp contient plein de template (et de non template aussi), et je me sers du namespace cimg_library...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #ifndef OUTILS_H #define OUTILS_H #include "outils.cpp" #endif
Celà dit, je suis d'accord avec toi, je dois faire n'importe quoi... Mais je ne suis pas un pro en programmation, et l'utilisation des ces template ont un peu perturbé ma vision des schémas de fonction classiques.
Je me bas contre un problème, et c'est vrai que je ne comprend pas trop ce qui se passe...
Mais, franchement, je trouve qu'il y a qqch de bizarre.
Je vais continuer à chercher sur la piste que tu m'as donné.
Merci encore pour ton aide.
Euh... Il n'y aurait pas confusion entre les .h et les .cpp là ?
En général le fichier toto.cpp contient une ligne #include "toto.h", or tu fais exactement l'inverse. Ca me semble dangereux et peu recommandé.
Bon, arrête tout de suite d'appeler tes fichiers contenant l'instanciation des templates .cpp. De préférence mets l'impélemntation dans la déclaration directement, ça simplifiera les choses. Là, comment le compilateur peut-il savoir qu'il ne doit pas compiler ton .cpp ? Tu as regardé la FAQ à ce sujet ?
J'ai fait exactement comme je l'ai vu dans la FAQ :Envoyé par touco
http://c.developpez.com/faq/cpp/?pag...VERS_templates
OK Miles, je vais tester. En fait, je déclare tout directement dans le .h c'est ça? Evidemment, je n'aurai plus de problèmes là dessus!![]()
Bizarre, je croyais que la FAQ n'avait pas ça écrit comme ça.
Désolé
en tout cas, je suis partisan de l'écriture de l'implémentation dans le .h, aucune confusion dans ces cas![]()
Je vais cependant suivre ton conseil...C'est vrai qu'il n'y a pas de confusions possibles!Envoyé par Miles
Je réécris tout et je vous tiens au courant!
Merci pour votre soutien (déjà deux jours de galère)!
OK la compilation aboutie, je pense effectivement que la fonction faisait quand même partie d'une classe template, et nécessitait donc une déclaration dans un .h, comme l'a fait remarqué Miles.
Un grand merci !![]()
Par contre, il se passe (encore ???) un truc un peu étrange:
J'ai 2 fichiers calc_camir.c et calc_camir.h dans ce même projet C++, faisant appel à une librairie C.
Si je la déclare comme suit:le compilo n'est pas content :
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 ifndef _CALCCAMIR_H // Pour éviter des warnings de redéfinitions lors de la compilation. #define _CALCCAMIR_H //------------------------------------------------------------------------------------- // Chemin des LUT #define DVCAMIR_NFS_LUT_DIR "F:\\lut\\" //------------------------------------------------------------------------------------- // PTSSURLUT doit être >=7 car sinon 3*2^14>MAXPTSLUT avec MAXPTSLUT=500; #define PTSSURLUT 8 // On prend 1 point sur 2^PTSSURLUT pour définir la LUT #define MAXPTSLUT 500 // Nb MAX de points max sur chaque LUT #define MAXSIZELINE 100 // Nb MAX de caracteres d'une ligne #define MAXDATAINFILE 2000 // Nb MAX de caracteres dans le fichier LUT #define MAXDATALUT 200 // Nb MAX de données de la LUT brute //------------------------------------------------------------------------------------- #ifndef GEMINY #define GEMINY 01 #endif #ifndef INDIGO #define INDIGO 02 #endif #define NUM_LUMV12_MAX 12 #define NB_FENETRES 16 // Stocke un fichier LUT en mémoire. char FileLUTStockMem[MAXDATAINFILE]; typedefstruct { float Temp_Fut; // Température du fut optique float Temp_Prisme; // Température du prisme float Temp_Saphir; // Température de la fenetre saphir float Trans_Fut[2]; // Transmission du fut optique float Trans_Prisme[2]; // Transmission du prisme float Trans_Saphir[2]; // Transmission de la fenetre saphir short Type; // Type de caméra (Geminy (1) ou Indigo (2)) short PtsLUT; // Nb de points dans LUT1 et LUT2 float LUT1[MAXPTSLUT]; // LUT pour la zone 1 float LUT2[MAXPTSLUT]; // LUT pour la zone 2 int PosArrete; // Position de l'arrete qui sépare les 2 zones du LPT char LUT1FilePath[256]; // Chemin vers le fichier de la LUT1. char LUT2FilePath[256]; // Chemin vers le fichier de la LUT2. char LUT3FilePath[256]; // Chemin vers le fichier de la LUT3. } struct_endoscope; struct_endoscope Endoscope[NUM_LUMV12_MAX]; float Temperature_Lue[NB_FENETRES] [NUM_LUMV12_MAX+1]; float Temperature_Zone0[NB_FENETRES] [NUM_LUMV12_MAX+1]; float Temperature_Zone1[NB_FENETRES] [NUM_LUMV12_MAX+1]; long DL_Lu[NB_FENETRES] [NUM_LUMV12_MAX+1]; long DL_Zone0[NB_FENETRES] [NUM_LUMV12_MAX+1]; long DL_Zone1[NB_FENETRES] [NUM_LUMV12_MAX+1]; // Données calculée en Temps Réel. // float TempRTC2, TempRTC3; float PLHRT, PCIRT; // Definition du pointer NULL #ifndef NULL #undef NULL #define NULL 0 #endif // Prototype des fonctions // ---------> Interpolation linéaire des données extern "C" short Interpol (long *xTab, long *yTab, int lTab, float xVal, float *yVal); // ---------> Reset de la structure Endoscope (tout à 0) extern "C" void Reset_Endoscope (struct_endoscope *Endoscope); // ---------> Lecture d'une variable de type float dans Top extern "C" LitTopFloat(long nchoc, char *NmProd, char *NmObj, char *NmPar, float *Val); // ---------> Lecture d'une variable de type String dans Top extern "C" LitTopString(long nchoc, char *NmProd, char *NmObj, char *NmPar, char *Str); // ---------> Lecture d'un fichier LUT .txt (calibration) extern "C" ReadFicLUT (char *NmFicLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Construction de la LUT finale pour passer des DL en T° extern "C" ConstructLUT (long *xLUTi, long *yLUTi, short lLUTi, short NumLUT, short Zone, struct_endoscope *Endoscope, float *xLUT , float *yLUT , short *lLUT ); // ---------> Lecture des fichiers de calibration LUT1 ou 2 ou 3 extern "C" InitLUT (long nchoc, short nEndo, short nLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Recopie de la LUT calibrée dans les varaibles de la structure Endoscope extern "C" void RecopieLUT(struct_endoscope *Endoscope , short Zone , float *DL , float *TP , short lDL); // ---------> Lecture des données Top et initialisation de la structure Endoscope extern "C" short Init_Endoscope (long nchoc, short nEndo, struct_endoscope *Endoscope); // ---------> Calcul de la T° à partir des DL mesurés extern "C" short DL2Temp (struct_endoscope *Endoscope, short zone, long DL, float *Temp); // ---------> Calcul du DL à partir d'une température extern "C" short Temp2DL (struct_endoscope *Endoscope, short zone, float Temp, long *DL); #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 calc_camir.c c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(85) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(88) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(91) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(94) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(97) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(100) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(105) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(108) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(112) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(115) : error C2059: erreur de syntaxe : 'chaîne' c:\Documents and Settings\GD280706\Bureau\analyse IR\IR\calc_camir.h(118) : error C2059: erreur de syntaxe : 'chaîne'
Alors que, quand je copie toutes les déclarations extern "C" dans l'en tête du main, tout se passe bien???![]()
MERCI ENCORE !! (je ne le dirai jamais assez!)
extern "C" ne doit être indiqué que lorsqu'on compile du C++, donc entouré de #ifdef _cplusplus #endif
De plus ça :
C'est sans doute pas ce que tu veux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #ifndef NULL #undef NULL #define NULL 0 #endif
Eh oui, bien sur !Envoyé par Miles
![]()
Je fais donc ça? :
A la compilation, c'est OK, par contre erreur à l'édition des liens
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 #ifdef _cplusplus // ---------> Interpolation linéaire des données extern "C" short Interpol (long *xTab, long *yTab, int lTab, float xVal, float *yVal); // ---------> Reset de la structure Endoscope (tout à 0) extern "C" void Reset_Endoscope (struct_endoscope *Endoscope); // ---------> Lecture d'une variable de type float dans Top extern "C" LitTopFloat(long nchoc, char *NmProd, char *NmObj, char *NmPar, float *Val); // ---------> Lecture d'une variable de type String dans Top extern "C" LitTopString(long nchoc, char *NmProd, char *NmObj, char *NmPar, char *Str); // ---------> Lecture d'un fichier LUT .txt (calibration) extern "C" ReadFicLUT (char *NmFicLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Construction de la LUT finale pour passer des DL en T° extern "C" ConstructLUT (long *xLUTi, long *yLUTi, short lLUTi, short NumLUT, short Zone, struct_endoscope *Endoscope, float *xLUT , float *yLUT , short *lLUT ); // ---------> Lecture des fichiers de calibration LUT1 ou 2 ou 3 extern "C" InitLUT (long nchoc, short nEndo, short nLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Recopie de la LUT calibrée dans les varaibles de la structure Endoscope extern "C" void RecopieLUT(struct_endoscope *Endoscope , short Zone , float *DL , float *TP , short lDL); // ---------> Lecture des données Top et initialisation de la structure Endoscope extern "C" short Init_Endoscope (long nchoc, short nEndo, struct_endoscope *Endoscope); // ---------> Calcul de la T° à partir des DL mesurés extern "C" short DL2Temp (struct_endoscope *Endoscope, short zone, long DL, float *Temp); // ---------> Calcul du DL à partir d'une température extern "C" short Temp2DL (struct_endoscope *Endoscope, short zone, float Temp, long *DL); #else // ---------> Interpolation linéaire des données short Interpol (long *xTab, long *yTab, int lTab, float xVal, float *yVal); // ---------> Reset de la structure Endoscope (tout à 0) void Reset_Endoscope (struct_endoscope *Endoscope); // ---------> Lecture d'une variable de type float dans Top short LitTopFloat(long nchoc, char *NmProd, char *NmObj, char *NmPar, float *Val); // ---------> Lecture d'une variable de type String dans Top short LitTopString(long nchoc, char *NmProd, char *NmObj, char *NmPar, char *Str); // ---------> Lecture d'un fichier LUT .txt (calibration) short ReadFicLUT (char *NmFicLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Construction de la LUT finale pour passer des DL en T° short ConstructLUT (long *xLUTi, long *yLUTi, short lLUTi, short NumLUT, short Zone, struct_endoscope *Endoscope, float *xLUT , float *yLUT , short *lLUT ); // ---------> Lecture des fichiers de calibration LUT1 ou 2 ou 3 short InitLUT (long nchoc, short nEndo, short nLUT, long *xLUTi, long *yLUTi, short *lLUTi); // ---------> Recopie de la LUT calibrée dans les varaibles de la structure Endoscope void RecopieLUT(struct_endoscope *Endoscope , short Zone , float *DL , float *TP , short lDL); // ---------> Lecture des données Top et initialisation de la structure Endoscope short Init_Endoscope (long nchoc, short nEndo, struct_endoscope *Endoscope); // ---------> Calcul de la T° à partir des DL mesurés short DL2Temp (struct_endoscope *Endoscope, short zone, long DL, float *Temp); // ---------> Calcul du DL à partir d'une température short Temp2DL (struct_endoscope *Endoscope, short zone, float Temp, long *DL); #endif
Miles : tu sais d'où ça peut venir? Sinon, je déclare tous mes extern dans le main (c'est moins propre, mais ça marche)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 calc_camir.obj : fatal error LNK1235: table de symboles COFF endommagée ou non valide![]()
Normalement, on fait même un
En revanche, l'erreur est bizarre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #ifdef _cpluplus extern "C" { #endif /// les fonctions #ifdef _cplusplus } #endif![]()
Bon, je ne comprends pas non plus cette erreur...
A la limite, le fait de recoder ma fonction en C++ doit pouvoir unifier mon projet au niveau langage. Ca devra être mieux non?
Je mets ça sur ma TO-DO list, et en attendant je fais les déclarations en extern "C" directement dans le main (pas très propre !)![]()
Tout a été compilé avec la même version du compilateur ?
Heu... pas tout à fait.Envoyé par Miles
Les DLL ont été compilé sous VC6.0. Par contre, en ce qui concerne mon projet, tout a été compilé sous VC++.net.
Mais je te vois venir, il faudrait que je recompile ma lib avec VC++.net?![]()
Peut-être.
Partager