Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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:37

make -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 1

Compilation 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 wink .

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 wink

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 ! wink


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!! big_smile


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.

Sysko le prospecteur a écrit :

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 !! wink


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne