#1 Le 30/12/2007, à 11:46
- Kpиc
[Résolu]Copier une chaà®ne de caractères.
Bonjour, je suis débutant en programmation et je n'arrive pas à compiler mon code. Je programme sous Emacs et voici les erreurs qui me sont indiquées :
-*- mode: compilation; default-directory: "~/C/" -*-
Compilation started at Sun Dec 30 06:23:37make -k
gcc -o chaineCaractere main.o fonction.o
fonction.o: In function `copieChaine':
fonction.c: (.text+0x0): multiple definition of `copieChaine'
main.o:main.c: (.text+0x0): first defined here
collect2: ld a retourné 1 code d'état d'exécution
make: *** [chaineCaractere] Erreur 1Compilation exited abnormally with code 2 at Sun Dec 30 06:23:3
Mon code doit copier une chaà®ne de caractères dans une autre chaà®ne.
main.c :
#include <stdio.h>
#include <stdlib.h>
#include "fonction.c"
int main(void)
{
char premiereChaine[] = "Bonjour", copieDeLaChaine[100] = "";
copieChaine(copieDeLaChaine, premiereChaine);
printf("Premier chaà®ne : %s\n", premiereChaine);
printf("\nCopie de la chaà®ne : %s\n\n", copieDeLaChaine);
return 0;
}
fonction.c
#include <stdlib.h>
#include <stdio.h>
void copieChaine(char copieDeLaChaine[], char premiereChaine[])
{
long i;
do
{
copieDeLaChaine[i] = premiereChaine[i];
i++;
}while (premiereChaine[i] != '\0');
}
fonction.h
#ifndef FONCTION
#define FONCTION
void copieChaine(char copieDeLaChaine[], char premiereChaine[]);
#endif
Et enfin mon makefile :
chaineCaractere: main.o fonction.o
gcc -o chaineCaractere main.o fonction.o
fonction.o: fonction.h
gcc -o fonction.o -c fonction.c -W -Wall
main.o:
main.c fonction.h
gcc -o main.o -c main.c -W -Wall
clean:
rm -rf *.o
mrproper: clean
rm -rf chaineCaractere
Voila, j'aimerai que quelqu'un m'aide à corriger mon erreur, j'ai pas compris d'o๠sa venait, merci d'avance .
Dernière modification par Kpиc (Le 30/12/2007, à 13:00)
Hors ligne
#2 Le 30/12/2007, à 12:34
- Kpиc
Re : [Résolu]Copier une chaà®ne de caractères.
C'est bon j'ai réussi à corriger mon erreur (enfin presque), d'une part le #include "fichier.c" dans le main.c c'est pas top, et ensuite pour la cible "fonction.o" du makefile, la dépendance n'était pas fonction.h mais fonction.c. Néanmoins j'ai toujours une erreur lors de l'exécution du programme : Erreur de segmentation (core dumped)
Dernière modification par Kpиc (Le 30/12/2007, à 12:35)
Hors ligne
#3 Le 30/12/2007, à 12:36
- Sysko le prospecteur
Re : [Résolu]Copier une chaà®ne de caractères.
bon je suppose que tu fais cela pour apprendre car sinon les fonctions de string.h du style strcpy ( char* destination , char* chaine_a_copier ) , le fait très bien , après avec un strlen ( chaine_a_copier) et un malloc pour que destination ai pil poil la bonne taille
sinon tu include un point c !!!
malheureux lol
donc tu devrais faire un include fonction.h dans ton main.c et ton fonction.c
ce serait plus mieux car cela resoudrait le problème des definition multiples
sinon le code en lui même ne semble pas comporter d'erreur même s'il est maladroit , mais bon si tu commence c'est normal
edit : prefere un while plutot qu'un do while et un int i ou même char i , car à mon avis tu depassera pas les 256 iteration s^^
Dernière modification par Sysko le prospecteur (Le 30/12/2007, à 12:39)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#4 Le 30/12/2007, à 12:43
- Kpиc
Re : [Résolu]Copier une chaà®ne de caractères.
Oui, et merci à toi, mais j'ai préciser dans le message plus haut que j'avais résolu cette erreur, mais j'ai toujours une erreur pendant l'exécution : Erreur de segmentation (core dumped).
Sinon en ce qui concerne la fonction strlen, en effet je ne l'utilise pas, je souhaite juste apprendre la programmation modulaire avec Emacs et l'utilisation d'un makefile.
Dernière modification par Kpиc (Le 30/12/2007, à 12:48)
Hors ligne
#5 Le 30/12/2007, à 12:52
- $Gaël$
Re : [Résolu]Copier une chaà®ne de caractères.
Un Core Dumped c'est souvent un problème de pointeur (t'as vas à une adresse mémoire ou tu n'as pas le droit d'aller)
Il me semble que tu oublies d'ajouter un '\0' à la fin de ta nouvelle chaine.
Ton i n'est pas initialisé (elle est sans doute là l'erreur), je ne suis pas certain qu'un long soit utile.
Et effectivement un inclut le .h pas le .c, justement si tu apprends la programmation modulaire, si tu dois diffuser ton code à d'autres programmeurs pour qu'ils puissent utiliser les fonctions que tu as créé, ils ont seulement besoin de connaitre leur déclaration et pas leur code, sinon ils pourraient très bien le modifier.
Dernière modification par $Gaël$ (Le 30/12/2007, à 12:53)
Ubuntu is an ancient african word meaning : "I can't configure Debian".
Hors ligne
#6 Le 30/12/2007, à 12:56
- Kpиc
Re : [Résolu]Copier une chaà®ne de caractères.
OMG, en effet elle était là l'erreur, l'initialisation du i ! -___________-" dorénavant j'initialiserai toute mes variables ! Merci à toi
Hors ligne
#7 Le 30/12/2007, à 13:00
- Sysko le prospecteur
Re : [Résolu]Copier une chaà®ne de caractères.
oui exacte je n'avais pas fait attention que i n'était inialisé
car sinon ( bon après sa dépend des OS etc...) ta variable i aura une valeur pseudo aleatoire et donc vu que c un long il y a de forte chance que i doit inialisé à une valeur largement superieur à 100 ce qui entraine un accès à un element >100 du tableau ce qui est interdit et entraine un core dumped
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#8 Le 30/12/2007, à 13:58
- $Gaël$
Re : [Résolu]Copier une chaà®ne de caractères.
Au fait Sysko, tu pourrais développer sur le coup des 256 itérations pour le do/while stp ? ca m'intéresse !
Ubuntu is an ancient african word meaning : "I can't configure Debian".
Hors ligne
#9 Le 30/12/2007, à 14:49
- Sysko le prospecteur
Re : [Résolu]Copier une chaà®ne de caractères.
non je disais juste que pour sa boucle un
char i
plutot que
long i
etait plus adapté ( enfin bon après c'est du pinaillement ) vu que char n'est qu'un entier ne pouvant pas depasser 256
et que donc dans le cas présent , le nombre d'itération etant < 256
char etait plus adapté
c'est vrai que maintenant que je me relis , on pouvait croire que je parlait dune limitation du nombre d'iteration de la boucle do while mais heuresement il n'y en pas
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#10 Le 30/12/2007, à 15:24
- Kpиc
Re : [Résolu]Copier une chaà®ne de caractères.
Un char ne peut dépasser 255 plutà´t, et pas 256, puisqu'un char prend un octet en mémoire, est un octet en mémoire ne peux excéder 255 sur le système décimale (ne pas oublier le 0). Enfin bon, là je chipote .. lol. Mais j'ai mis un long, c'est juste parce que le projet n'est pas énorme, et la mémoire de mon ordinateur est loin d'être saturée pour quelque long au lieu d'un int ou d'un char. Je prendrais tout de même l'habitude à présent de mettre un int au lieu d'un long pour les variables i dans les boucles.
Hors ligne
#11 Le 30/12/2007, à 16:19
- $Gaël$
Re : [Résolu]Copier une chaà®ne de caractères.
ah ok !! j'avais pas calculé, moi qui était parti sur une optimisation mémoire du saut du while!!
Ubuntu is an ancient african word meaning : "I can't configure Debian".
Hors ligne
#12 Le 01/01/2008, à 03:02
- Link31
Re : [Résolu]Copier une chaà®ne de caractères.
non je disais juste que pour sa boucle un char i plutot que long i etait plus adapté
Pas vraiment. Sur x86, les registres de calcul du processeur ont la taille d'un long int, donc autant utiliser un long int pour éviter de gaspiller de la place.
Il faut noter que int et long int représentent la même chose sur x86, et enfin que int représente toujours la taille de données la mieux optimisée pour l'architecture cible (c'est-à -dire un mot machine).
Dernière modification par Link31 (Le 01/01/2008, à 03:44)
Hors ligne
#13 Le 01/01/2008, à 13:45
- Sysko le prospecteur
Re : [Résolu]Copier une chaà®ne de caractères.
Au temps pour moi , je n'ai pas encore fini mes cours d'architecture des ordinateurs ^^ je vais pouvoir me la péter comme cela ^^
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#14 Le 01/01/2008, à 17:42
- $Gaël$
Re : [Résolu]Copier une chaà®ne de caractères.
Ohlala, ca me rappelle mes cours sur la mémoire cache, et sa me rappelle aussi que je n'avais pas tout compris !!
Ubuntu is an ancient african word meaning : "I can't configure Debian".
Hors ligne