Problème de fonctions dans fichiers séparés
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 :
Code:
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.cpp :
Code:
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;
} |
frequence.h
Code:
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); |
L'erreur retournée au lancement du build :
Code:
undefined reference to `freqBigrammes(std::string, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&)'|
J'utilise Code::Blocks 13.12 sous Windows 10.
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.