[DEV-C++] fonction : undefined reference to

Fermé
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007 - 4 avril 2007 à 18:06
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 - 6 avril 2007 à 21:49
Bonjour,
je débute en C, j'ai fait ma première fonction, et DEV-C++ refuse de compiler mon programme, que voici.

EX1.C
/* programme mettant à zéro la diagonale du milieu de la matrice */
#include <stdio.h>
#include "matrice.h"

main()
{
int **mat;
int ilig, icol, taille;
printf("Entrez la taille de la matrice : ");
scanf("%d", &taille);
decmatrice(mat, taille, taille);
initmatrice(mat, taille, taille);

for (ilig=0;ilig<taille;ilig++)
for (icol=0;icol<taille;icol++)
if (ilig==icol)
mat[ilig][icol] = 0;

affichmatrice(mat, taille, taille);
freematrice(mat, taille, taille);
}

matrice.c (certaines de ses fonctions ne servent pas dans le programme EX1, mais pour d'autres exercices. Ils ne gènent pas, si?):
/* Déclaration de la matrice */
int decmatrice(int **mat, int tlig, int tcol)
{
int ilig, icol;
mat = (int**)calloc(tlig, sizeof(int*));
for (ilig=0;ilig<tlig;ilig++)
mat[ilig] = (int*)calloc(tcol, sizeof(int));
return 0;
}
/* Initialisation de la matrice */
int initmatrice(int **mat, int tlig, int tcol)
{
int ilig, icol;
for (ilig=0;ilig<tlig;ilig++)
for (icol=0;icol<tcol;icol++)
{
printf("Entrez la valeur de la %dème ligne et de la %dème colonne :\n", ilig+1, icol+1);
scanf("%d", &mat[ilig][icol]);
}
return 0;
}
/* Affichage de la matrice */
int affichmatrice(int **mat, int tlig, int tcol)
{
int ilig, icol;
for (ilig=0;ilig<tlig;ilig++)
{
for (icol=0;icol<tcol;icol++)
printf("%d",mat[ilig][icol]);
printf("\n");
}
return 0;
}
/* Libération de la mémoire */
int freematrice(int **mat, int tlig, int tcol)
{
int ilig, icol;
for (ilig=0;ilig<tlig;ilig++)
free(mat[ilig]);
free(mat);
return 0;
}

matrice.h :
int decmatrice(int **mat, int tlig, int tcol);
int initmatrice(int **mat, int tlig, int tcol);
int affichmatrice(int **mat, int tlig, int tcol);
int freematrice(int **mat, int tlig, int tcol);


Quand je compile EX1.C, voici les erreurs que j'obtiens :

[Linker error] undefined reference to `decmatrice(int**, int, int)'
[Linker error] undefined reference to `initmatrice(int**, int, int)'
[Linker error] undefined reference to `affichmatrice(int**, int, int)'
[Linker error] undefined reference to `freematrice(int**, int, int)'
ld returned 1 exit status

j'ai lu quelque part qu'il fallait taper :
c -l(matrice)
dans "option du compilateur" -> ajouter ces commandes lors de l'éditeur de liens.
Dans ce cas, il compile (pas d'erreur), mais EX1.EXE n'est pas créé.
J'ai essayer de le mettre aussi dans "ajouter ces commandes lors de l'appel au compilateur", mais ça fait pareil.

Quelqu'un peut-il m'aider?
Merci
A voir également:

6 réponses

mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
5 avril 2007 à 21:25
Bon alors déjà pour ce qui est de la compilation ça doit ressembler à ça :
(mando@polgara) (~) $ make
g++ -W -Wall -c matrice.c
g++ -W -Wall -o plop.exe plop.c matrice.o

Ci dessous les sources que j'ai compilé (j'ai fait deux trois corrections mais ce ne sont pas elles qui font que tu as un pb de linkage, c'est vraiment ton complateur qui est mal configuré) :
(mando@polgara) (~) $ cat plop.c

/* programme mettant à zéro la diagonale du milieu de la matrice */
#include <stdio.h>
#include "matrice.h"

int main(){
        int **mat;
        int ilig, icol, taille;
        printf("Entrez la taille de la matrice : ");
        scanf("%d", &taille);
        decmatrice(mat, taille, taille);
        initmatrice(mat, taille, taille);

        for (ilig=0;ilig<taille;ilig++)
                for (icol=0;icol<taille;icol++)
                        if (ilig==icol)
                                mat[ilig][icol] = 0;

        affichmatrice(mat, taille, taille);
        freematrice(mat, taille);
        return 0;
}

(mando@polgara) (~) $ cat matrice.h

#ifndef MATRICE_H
#define MATRICE_H

void decmatrice(int **mat,unsigned int tlig,unsigned int tcol);
void initmatrice(int **mat,unsigned int tlig,unsigned int tcol);
void affichmatrice(int **mat,unsigned int tlig,unsigned int tcol);
void freematrice(int **mat,unsigned int tlig);

#endif

(mando@polgara) (~) $ cat matrice.c

#include <stdio.h>
#include <stdlib.h>

/* Déclaration de la matrice */
void decmatrice(int **mat,unsigned int tlig,unsigned int tcol){
        unsigned int ilig;
        mat = (int**)calloc(tlig,sizeof(int*));
        for (ilig=0;ilig<tlig;ilig++) mat[ilig] = (int*)calloc(tcol, sizeof(int));
}

/* Initialisation de la matrice */
void initmatrice(int **mat,unsigned int tlig,unsigned int tcol){
        unsigned int ilig, icol;
        for (ilig=0;ilig<tlig;ilig++){
                for (icol=0;icol<tcol;icol++){
                        printf("Entrez la valeur de la %dème ligne et de la %dème colonne :\n", ilig+1, icol+1);
                        scanf("%d", &mat[ilig][icol]);
                }
        }
}

/* Affichage de la matrice */
void affichmatrice(int **mat,unsigned int tlig,unsigned int tcol){
        unsigned int ilig, icol;
        for (ilig=0;ilig<tlig;ilig++){
                for (icol=0;icol<tcol;icol++) printf("%d",mat[ilig][icol]);
                printf("\n");
        }
}

/* Libération de la mémoire */
void freematrice(int **mat,unsigned int tlig){
        unsigned int ilig;
        for(ilig=0;ilig<tlig;ilig++) free(mat[ilig]);
        free(mat);
}


Bon sinon le programme segfault quand tu saisis la deuxième ligne de la matrice je te laisse chercher pourquoi...
(mando@polgara) (~) $ ./plop.exe
Entrez la taille de la matrice : 5
Entrez la valeur de la 1ème ligne et de la 1ème colonne :
1
Entrez la valeur de la 1ème ligne et de la 2ème colonne :
2
Entrez la valeur de la 1ème ligne et de la 3ème colonne :
3
Entrez la valeur de la 1ème ligne et de la 4ème colonne :
4
Entrez la valeur de la 1ème ligne et de la 5ème colonne :
5
Entrez la valeur de la 2ème ligne et de la 1ème colonne :
6
Erreur de segmentation

Bonne chance
1
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
6 avril 2007 à 21:49
Ah ben faut lire la doc, mais vu que devcpp utilise gcc ou g++ ça doit pas être très différent de ce que j'ai fait sous linux ;)
g++ -W -Wall -c matrice.c
g++ -W -Wall -o plop.exe plop.c matrice.o

Bonne chance
1
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
4 avril 2007 à 20:51
Ben en fait il manque le fameux matrice.c qui donne le contenu des fonctions :
int decmatrice(int **mat, int tlig, int tcol);
int initmatrice(int **mat, int tlig, int tcol);
int affichmatrice(int **mat, int tlig, int tcol);
int freematrice(int **mat, int tlig, int tcol); 

Au niveau du compilateur lui même je ne sais pas trop comment il se règle mais ce qui est sûr c'est qu'il manque au moins le code de ces fonctions pour que ça puisse compiler.

Pour ces 4 fonctions, tu peux préciser que les paramètres tlig et tcol sont des entiers poistifs avec le mot clé unsigned :
int decmatrice(int **mat,unsigned int tlig,unsigned int tcol);

Bonne chance
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
5 avril 2007 à 17:04
2ème essai...
mais si il y est le fichier matrice.c, je n'ai sauté qu'une ligne après le programme principal, tu n'as pas du le voir, c'est ma faute, dsl.

merci pour "unsigned", je n'y avais pas pensé.
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
5 avril 2007 à 21:36
Heu... pour compiler, j'appuie juste sur le bouton "compiler". Comment fais-t-on pour taper des lignes de commandes?

je n'ai pas encore regardé tes modifications, je le ferais plus tard.

Pour Segmentation fault... je ne sais pas... c'est mon premier exercice sur les pointeurs donc...
Pourtant je l'avais fais sous Linux en TP, et ça marchait... c'est bizarre.

Merci pour ton aide
0

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

Posez votre question
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
6 avril 2007 à 14:03
Ben je suis sous linux ;) Voilà comment je fais ^^ Mais j'imagine que tu as l'équivalent dans ton environnement de développement.
0
LunaSev Messages postés 9 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 24 mai 2007
6 avril 2007 à 18:11
Ah d'accord!

avec Dev-cpp, il suffit d'appuyer sur le bouton compiler, et ça marche. Il y a très certainement des options, mais je ne les connais pas.
0