Multiple definition of

Résolu/Fermé
yoano - 25 févr. 2010 à 14:30
 yoano - 25 févr. 2010 à 16:10
Bonjour

J'ai creer un programme sous C contenant :
un fichiersource.c
fonction.c
fonction.h

j'ai ensuite compiler aucun problème, j'ai voulu faire l'édition de lien et la petit message d'erreur :

factcholesky.o: In function `factcholesky':
factcholesky.c:(.text+0x0): multiple definition of `factcholesky'
Maincholesky.o:Maincholesky.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status

=> voila mon fichiersource.c :

#include <stdio.h>

#include <stdlib.h>

#include"LectureMatrice.h"
#include"AffichageMatrice.h"


#include "factcholesky.c"



int main()


{
int af;


char NomMatrice,NomMatrice2;



MATfloat A;

MATfloat L;



char nomfich[256];



printf("Entrez le nom du fichier :");

scanf("%s",&nomfich[0]);


A = LectureMATfloat(nomfich,&NomMatrice);



NomMatrice = 'A';

af=AffichageMATfloat(NomMatrice,A);





NomMatrice2='L';


L=factcholesky(A,NomMatrice);


AffichageMATfloat(NomMatrice2,L);







return 0;

}



=> et mon fichier fonction.c :
#include <stdlib.h>

#include <stdio.h>
#include <math.h>


#include "TypedefMatrice.h"

#include "AllocationMatrice.h"

#include "AffichageMatrice.h"

#include "factcholesky.h"

MATfloat factcholesky (MATfloat A, char NomMatrice)


{

MATfloat L; /* L la matrice triangulaire inférieure */

int i,j,k;
/*int af;*/

int err=0; /* compteur si présence d'une erreur */

float x,y,z;


/*char NomMatrice='A';

af=AffichageMATfloat(NomMatrice,A);*/




/* Allocation de la matrice L en mémoire*/

L=AllocationMATfloat(A.NbrLig,A.NbrCol); /* On a présence d'une matrice définie carrée */




/* => TEST SUR MATRICE A */

/* Vérification que la matrice est carré */

if(A.NbrLig-A.NbrCol!=0.0) /* if(A.NbrLig!=A.NbrCol)*/


{

printf("ERREUR : la matrice n'est pas carrée\n"); err=1;exit(-1);

}



/* => CALCUL DE LA MATRICE, FACTORISATION DE CHOLESKY */

if (err==0) /* Réalisation d'un test afin de n'avoir aucune erreur enregistrée */

{


/* Premier coefficient calculé */

if(A.Mat[0][0]>0.0) /* Le 1er coefficient doit être positif*/


{

L.Mat[0][0]=sqrt(A.Mat[0][0]);

}


else {/*erreur*/err=1;}




/* Premiers coefficient de chaque ligne calculés */

for (i=1;i<A.NbrLig;i++)

{

if (L.Mat[0][0]!=0.0) /* Le 1er coefficient doit être non nul*/

{

L.Mat[i][0]=A.Mat[i][0]/L.Mat[0][0];

}


else{/*erreur*/err=1;}

}




/* Le reste des coefficients est calculé */

for(i=1;i<A.NbrLig;i++)

{

for(j=1;j<=i;j++)

{

/* Le coefficient diagonal est calculé */

if(i==j)

{

/* La somme des coefficients(²) est calculée dans un même temps à part */

for(k=0,x=0;k<i;k++)

{

x+=L.Mat[i][k]*L.Mat[i][k];

}


z=A.Mat[i][j]-x;


if (z>0) /* La bonne éxécution de la racine est testée */

{

L.Mat[i][j]=sqrt(z);

}

else


{/*erreur*/err=1;}

}


/* Le calcul des autres coefficients est réalisé */

else

{

/* Le calcul de la somme est éffectué à part */

for(k=0,y=0;k<j;k++)

{

y+=L.Mat[i][k]*L.Mat[j][k];

}


if(L.Mat[j][j]!=0) /* La bonne exécution de la division est testée*/

{

L.Mat[i][j]=(A.Mat[i][j]-y)/(L.Mat[j][j]);

}

else

{/*erreur*/ err++;}

}

}

}



}


if (err>=1) /* La présence d'une erreur renvoi, un message d'erreur */

{
printf("ERREUR : La factorisation de Cholesky présente une erreur \n");

}

return (L);

}

=> et fonction.h :

/*Fonction de décompositon selon la factorisation de Cholesky*/



MATfloat factcholesky(MATfloat A,char NomMatrice);


Voila si quelqu'un pouvez m'éclairer dans mon sombre chemin de C.

Je suis sous ubuntu avec le compilateur gcc.

Merci par avance

3 réponses

J'ai résolu le problème :

En faite dans le code source

Il fallait remplacer le factcholesky.c

par factcholesky.h

De ce fait il n'y a plus de fonction multiple.

Merci de votre aide

cordialement
4