Bien le bonjour !
Avant tout, je m'excuse si la solution est évidente et que j'ai simplement tout fiat de travers. Mon problème peut sembler au problème typique d'un FAQ, il ne s'agit d'ailleurs pas du fait que je ne trouve pas de solution mais simplement que je ne vois pas ce que je fais de différent par rapport à la solution.
Voilà donc, je dois réaliser un petit code, les fonctions devant être séparées dans différents fichiers. Lors que j'écris tout dans un même fichier principal Cpp, tout se passe bien. Mais lorsque je retire les fonctions de ce fichier principal pour les mettre dans un fichier cpp annexe, et que je créé le header associé, le fichier header est bien lu mais la fonction n'est pas trouvée. Je mets les codes en guise de démo :
Le code principal, contenant le main et une fonction printBigrammes
bigrammes.cpp :
frequence.cpp :
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 #include <iostream> #include <iomanip> #include <cmath> #include <fstream> #include <vector> #include "frequence.h" using namespace std; void printBigrammes(int countBigrammes,vector< vector<int> > &tab); int main(int argc, char *argv[]) { // On initialise notre tableau //int tabBigrammes [27][27]; int countBigrammes; vector<vector<int> > tabBigrammes(27, vector<int>(27)); // On check le nombre d'arguments if ( argc != 2 ) { cout << "usage: " << argv[0] << " nom_fichier" << endl; return 1; } // On ecrit le nom de fichier string nom(argv[1]); // On utilise la fonction freqBigrammes countBigrammes = freqBigrammes(nom,tabBigrammes); // On utilise tabBigramme pour verifier la lecture if ( countBigrammes == -1){ cout << "Probleme de lecture du fichier: " << argv[1] << endl; return 1; } // Print in text printBigrammes(countBigrammes,tabBigrammes); return 0; } void printBigrammes(int countBigrammes,vector<vector<int> > &tab) { // Nombre de bigrammes cout << countBigrammes << endl; // Firstline cout << ' ' << ' '; for (int i=0; i<27; i++) { char headerChar; if (i == 26) { headerChar = ' '; } else { headerChar = 'a'+i ;} cout << headerChar << ' '; } cout << endl; // Print values for (int i=0; i<27; i++) { char lineChar; if (i == 26) { lineChar = ' '; } else { lineChar = 'a'+i ;} cout << lineChar << ' '; for (int j=0; j<27; j++) {cout << tab[i][j] << ' ';} cout << endl; } return; }
frequence.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
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 #include "frequence.h" #include <iostream> #include <iomanip> #include <cmath> #include <fstream> #include <vector> using namespace std; int freqBigrammes(string nom, vector< vector<int> > &tab); void cumuleBigrammes(vector<vector<int> > &tab, char c1, char c2); int freqBigrammes(string nom , vector<vector<int> > &tab) { int countBigrammes = 0; ifstream input; input.open(nom.c_str()); // Fail : premiere case = -1 if ( input.fail() ) { countBigrammes = -1; return countBigrammes; } // Pas de fail else { char c1; char c2; // Premier chargement du premier caractere // Ne sera pas effectue dans la boucle c2 = input.get(); c2 = tolower(c2); do { // On passe c2 dans c1 et on recupere un nouveau c2 c1 = c2; c2 = input.get(); c2 = tolower(c2); cumuleBigrammes(tab,c1,c2); countBigrammes += 1; } while (c2 != EOF); // While jusqu'a fin de fichier } return countBigrammes; } void cumuleBigrammes(vector<vector<int> > &tab, char c1, char c2) { // Si les deux sont des lettres if (( c1 >= 'a' && c1 <= 'z' ) && ( c2 >= 'a' && c2 <= 'z' )) { tab[c1-'a'][c2-'a']++; } // Si c1 est un espace if (( c1 == ' ' || c1 == '\n' ) && ( c2 >= 'a' && c2 <= 'z' )){ tab[26][c2-'a']++; } // Si c2 est un espace if (( c2 == ' ' || c2 == '\n' ) && ( c1 >= 'a' && c1 <= 'z' )){ tab[c1-'a'][26]++; } // Si c1 et c2 sont des espaces if (( c1 == ' ' || c1 == '\n' ) && ( c2 == ' ' || c2 == '\n' )){ tab[26][26]++; } return; }
L'erreur retournée au lancement du build :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <iostream> #include <iomanip> #include <cmath> #include <fstream> #include <vector> using namespace std; int freqBigrammes(string nom, vector< vector<int> > &tab); void cumuleBigrammes(vector<vector<int> > &tab, char c1, char c2);
J'utilise Code::Blocks 13.12 sous Windows 10.
Code : Sélectionner tout - Visualiser dans une fenêtre à part undefined reference to `freqBigrammes(std::string, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&)'|
Si quelqu'un saurait me dire la faute grossière que je dois être incapable de voir, il ou elle est le/la bienvenu/e !
Merci à vous.
Partager