Fonctions en cpp

Lil -  
neofenix Messages postés 145 Statut Membre -
Bonjour,
Bonjour,

J'ai un problème pour structurer mon programme cpp. Je ne suis pas experte en cpp et je suis en train de créer un programme qui contient plusieurs classes. Au moins deux ou trois de ces classes ont besoin d'utiliser des fonctions communes qui elles, utilisent des look-up-tables assez grosses..,Je ne veux pas créer une classe pour y mettre ces fonctions puisque je ne trouve aucun objet à leur associer (mes fonctions s'appliqueront simplement à des int). J'ai essayé de les mettre dans un fichier .cpp avec son .h à part, mais je ne sais pas comment définir l'entête du fichier. J'ai essayé aussi de les déclarer dans le main mais ça ne les rend pas vosobles à l'intérieur des classes. J'ai essayé le mot-clé 'extern' mais ce n'est apparemment pas cela. Y-a-t il un autre moyen de les utiliser sans avoir à les copier à chaque fois dans chacune de mes classe?
merci d'avance pour la réponse
Lil

12 réponses

neofenix
 
ca fait un moment que j'ai plus fait de cpp donc je vais essayer de t'aider de memoire.
tu crées tes fonctions dans ton fichier .cpp et tu remets les entetes de chaques fonctions dans ton .h

pour les appeler dans les autres fichiers .cpp ou tu as tes classes. tu mets juste ton #include avec ton fichier .h
Voila, en esperant t'avoir donné la bonne reponse
0
Lil
 
Merci bcp pour ta réponse. J'en comprends que c'est possible de définir ces fonction dans un fichier .cpp à part, et de les déclarer dans un .h que je vais inclure partout où je veux les utiliser, sans que créer forcément une classe pour ça... c'est dèjà ça..
Mnt mon problème: si ce n'est pas une classe, c'est quoi? je veux dire: comment j'introduis mon fichier? je les met par exemple:
dans fich.h:


int f_ad(int a, int b, int m);
int f_m(int a, int b, int q);
int f_inv(int a, int q);
int f_a(int a, int b);

puis dans fich.cpp


#include <cstdlib>
#include <math.h>
#include <string>
#include "fich.h"


const int log4[4] = {0,0,1,2};
const int log8[8] = {0,0,1,3,2,6,4,5};
const int log16[16] = {0,0,1,4,2,8,5,10,3,14,9,7,6,13,11,12};
const int log32[32] = {0,0,1,18,2,5,19,11,3,29,6,27,20,8,12,23,4,\
10,30,17,7,22,28,26,21,25,9,16,13,14,24,15};
const int log64[64] = {0,0,1,6,2,12,7,26,3,32,13,35,8,48,27,18,4,24,\
33,16,14,52,36,54,9,45,49,38,28,41,19,56,5,62,\
25,11,34,31,17,47,15,23,53,51,37,44,55,40,10,\
61,46,30,50,22,39,43,29,60,42,21,20,59,57,58};
const int log128[128] = {0,0,1,31,2,62,32,103,3,7,63,15,33,84,104,\
93, 4,124,8,121,64,79,16,115,34,11,85,38,105,46,94,51,\
5,82,125,60,9,44,122,77,65,67,80,42,17,69,116,23,35,118,\
12,28,86,25,39,57,106,19,47,89,95,71,52,110,6,14,83,92,126,\
30,61,102,10,37,45,50,123,120,78,114,66,41,68,22,81,59,43,76,\
18,88,70,109,117,27,24,56,36,49,119,113,13,91,29,101,87,108,\
26,55,40,21,58,75,107,54,20,74,48,112,90,100,96,97,72,98,53,73,111,99};
const int log256[256] = {0,0,1,25,2,50,26,198,3,223,51,238,27,104,199,75,4,100,\
224,14,52,141,239,129,28,193,105,248,200,8,76,113,5,138,101,47,225,\
36,15,33,53,147,142,218,240,18,130,69,29,181,194,125,106,39,249,185,\
201,154,9,120,77,228,114,166,6,191,139,98,102,221,48,253,226,152,37,\
179,16,145,34,136,54,208,148,206,143,150,219,189,241,210,19,92,131,\
56,70,64,30,66,182,163,195,72,126,110,107,58,40,84,250,133,186,61,202,\
94,155,159,10,21,121,43,78,212,229,172,115,243,167,87,7,112,192,247,\
140,128,99,13,103,74,222,237,49,197,254,24,227,165,153,119,38,184,180,\
124,17,68,146,217,35,32,137,46,55,63,209,91,149,188,207,205,144,135,151,\
178,220,252,190,97,242,86,211,171,20,42,93,158,132,60,57,83,71,109,65,\
162,31,45,67,216,183,123,164,118,196,23,73,236,127,12,111,246,108,161,59,\
82,41,157,85,170,251,96,134,177,187,204,62,90,203,89,95,176,156,169,160,\
81,11,245,22,235,122,117,44,215,79,174,213,233,230,231,173,232,116,214,\
244,234,168,80,88,175};

const int exp4[3] = {1,2,3};
const int exp8[7] = {1,2,4,3,6,7,5};
const int exp16[15] = {1,2,4,8,3,6,12,11,5,10,7,14,15,13,9};
const int exp32[31] = {1,2,4,8,16,5,10,20,13,26,17,7,14,28,29,31,\
27,19,3,6,12,24,21,15,30,25,23,11,22,9,18};
const int exp64[63] = {1,2,4,8,16,32,3,6,12,24,48,35,5,10,20,40,19,\
38,15,30,60,59,53,41,17,34,7,14,28,56,51,37,\
9,18,36,11,22,44,27,54,47,29,58,55,45,25,50,\
39,13,26,52,43,21,42,23,46,31,62,63,61,57,49,33};
const int exp128[127] = {1,2,4,8,16,32,64,9,18,36,72,25,50,100,65,11,\
22,44,88,57,114,109,83,47,94,53,106,93,51,102,69,3,6,12,24,\
48,96,73,27,54,108,81,43,86,37,74,29,58,116,97,75,31,62,124,\
113,107,95,55,110,85,35,70,5,10,20,40,80,41,82,45,90,61,122,\
125,115,111,87,39,78,21,42,84,33,66,13,26,52,104,89,59,118,101,\
67,15,30,60,120,121,123,127,119,103,71,7,14,28,56,112,105,91,63,\
126,117,99,79,23,46,92,49,98,77,19,38,76,17,34,68};
const int exp256[255] = {1,2,4,8,16,32,64,128,29,58,116,232,205,135,19,38,76,\
152,45,90,180,117,234,201,143,3,6,12,24,48,96,192,157,39,78,156,\
37,74,148,53,106,212,181,119,238,193,159,35,70,140,5,10,20,40,80,\
160,93,186,105,210,185,111,222,161,95,190,97,194,153,47,94,188,101,\
202,137,15,30,60,120,240,253,231,211,187,107,214,177,127,254,\
225,223,163,91,182,113,226,217,175,67,134,17,34,68,136,13,26,52,104,\
208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,\
102,204,133,23,46,92,184,109,218,169,79,158,33,66,132,21,42,84,168,\
77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,191,99,\
198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,\
98,196,149,55,110,220,165,87,174,65,130,25,50,100,200,141,7,14,28,56,\
112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,\
69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,\
88,176,125,250,233,207,131,27,54,108,216,173,71,142};


int f_ad(int a, int b, int m) const { // xor
int sum=0;
for (int i=0;i<m;i++){

sum=sum+(int)(( (int)((float)(a+b) / pow(2,i)) %2 ) * pow(2,i));

}
return sum ;
}

int f_m(int a, int b, int q) //multiplication
{
if ( a == 0 || b == 0 ) return 0 ;
if ( a == 1 ) return b ;
if ( b == 1 ) return a ;

switch (q){

case 256:

return exp256[(log256[a]+log256[b])%255];

case 128:

return exp128[(log128[a]+log128[b])%127];

case 64:

return exp64[(log64[a]+log64[b])%63];

case 32:

return exp32[(log32[a]+log32[b])%31];

case 16:

return exp16[(log16[a]+log16[b])%15];

case 8:

return exp8[(log8[a]+log8[b])%7];

case 4:

return exp4[(log4[a]+log4[b])%3];

}

cout << "no multiplication..";

return 0 ;

}



int f_inv(int a, int q) //inversion

{

if ( a == 0) cout<<"GFq_inv: no inverse for 0!";

if ( a == 1 ) return 1 ;

switch (q){

case 256:

return exp256[(255-log256[a])];

case 128:

return exp128[(127-log128[a])];

case 64:

return exp64[(63-log64[a])];

case 32:

return exp32[(31-log32[a])];

case 16:

return exp16[(15-log16[a])];

case 8:

return exp8[(7-log8[a])];

case 4:

return exp4[(3-log4[a])];

}

cout<<"f_inv: not defined inverse for GFq";

return 0 ;

}



int f_a(int a, int b) // power

{
return a^b;
}





Après ca compile pas :-(
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
comment ça ça ne compile pas ???
Je ne voi pas ou est le problème.
fct.h
int fonc1(int);
fct.cpp
#include <fct.h>
int fonc1(int b)
{ return 3*b;}
clas.cpp
#include <fct.h>
class A
{
int c,d;
A(int j):c(j)
{ d=fonc1(c); }
}

Note en passant que a^b ce n'est pas "a" à la puissance "b", mais a SEULEMENT OU b (^ est le ou exclusif bit à bit)
0
neofenix
 
voici un exemple de code que je faisait et ça marchais très bien :


#include "StdAfx.h"
#include "ini.h"
#define __LCC__
//
//#pragma comment(lib, "urlmon.lib")
//#include <urlmon.h> //et linker urlmon.lib dans project/settings 
//
#include <stdio.h>
#include <mysql.h>
#include <conio.h>
#include <time.h>
#include <iostream>
#include <string>
#include "odbc.h"

#define	hostname "xxx.xxx.xxx.xxx"
#define	user "xxxx"
#define	password "xxxxx"


using namespace waracademy;
using namespace std;

LPCSTR path="./game.warac";

char chtemp[1000]="";
char chtemp2[1000]="";

char * AlloueEtConcat(char * s1, char * s2)
{
  int longueur;
  char * s3;
  
  longueur=strlen(s1) + strlen(s2) + 1;
  s3=(char *)malloc(longueur*sizeof(char));
      strcpy(s3,s1);
      strcat(s3,s2);
  return s3;
}


et mon fichier .h

bool CreerIni(char* Log);
char * AlloueEtConcat(char * s1, char * s2);
char * LireIni(char* cle, char* var);
bool RecupNb(char* Log);
bool Verif_Adr(char* mail);
bool Verif_Poin(char* LeText, unsigned int TextLen);
int RecupNbrArmes(int nbr_armes);
char* InitList(int flag);
char* Insere(char * ch);
int NbDestinat(char* ch);
void Destinat(char * ch, unsigned int pos, char* LObj, char* LeText, char* LeLog, char* nbdest,char* accuse);
bool WriteFile(char *Texte, char* monfichier);
bool CreerWarac(char* Log);
bool EnvoiArme(char* log, char* choix, char* dest);


et mon fichier ou j'appelle les fonctions:

#include "ini.h"
cont=AlloueEtConcat(cont,nb);

sinon dit moi quelles sont tes erreurs de compilation
0
Lil
 
Merci bcp pour vos réponses..

en fait j'ai l'impression du coup que c'est un #include qui manque soit dans mon .cpp, soit dans le .h: l'erreur que j'ai (qui renvoie à la ligne: int GFq_ad(int , int , int ); dans le .h) est la suivante:

new types may not be defined in a return type
extraneous `int' ignored


on dirait qu'il comprend pas ce qu'est un int ou qqc comme ça

ceci dit, l'erreur provient peut être d'ailleurs.. je ne sais pas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neofenix Messages postés 145 Statut Membre 2
 
verifie ta syntaxe de ton .h genre un point virgule oublié
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
ça semble bien venir d'ailleurs !
surement du .h inclu juste avant. Tu n'en dit pas assez là.
0
Lil
 
Oups.. Effectivement, même quand j'enlève l'include de fich.h, il me reste des erreurs
je rame..
merci en tt cas, mnt c sur que le probleme est ailleurs
0
neofenix Messages postés 145 Statut Membre 2
 
est ce normal que dans ta ligne int GFq_ad(int , int , int ); tu ne mettes pas de variable ca ne serait pas plutot
int GFq_ad(int var1, int var2 , int var3);
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
un prototype de fonction ne requiert pas de VARi.
écrire type1 fonction(type2,type3) est tout à fait normal et propre.
Bon, ensuite, si le .h doit être utiliser par d'autre personne et que les paramètres ne sont pas évident, mettre un nom permet de "documenter" la fonction, par exemple :
int strcpy(char * detination, const char* source);
quand tu sais que strcpy copie une chaine de caractère dans une autre, destination et source sont parlant.
Mais à par ça, le type suffit.
0
Lil
 
euh.. oui ca parait plus naturel
j'avais simplement suivi l'exemple de Char Snipeur, et j'ai supprimé le nom de la variable
je vais reesayer donc..
0
neofenix Messages postés 145 Statut Membre 2
 
tiens nous au courant
0
Lil
 
Bonjour,
Merci bcp pr votre aide.. mnt j'arrive à compiler cette partie du code (il me manquat aussi un using namespace std; ). Me reste à debugger tt le rest :-s
merci encore!
0
neofenix Messages postés 145 Statut Membre 2
 
de rien bonne continuation
0