Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec char motSecret[] = ""; Dés lors Qu'il exède les 8 char

4 réponses
Avatar
clapannac
J'ai tenté de suivre vos conseils, d'ailleurs merci de vous être penché sur les divers aspe erroné qu'il pressente, voici le nouveau code revue et les dernières erreur trouvé par le debugger GCC (compilateur C98) avec les commandes -W -Wall -O2 de spécifié :

###################### les fichiers source ###############
Main.c #
########

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

int main()
{
char motSecret[] = "GRAMMAIRE";
char lettreTap;

printf("Longueur du mot secre : ");
Etoile_Secr(motSecret);

printf("Propose une lettre : ");
lettreTap = lireCaractere();

printf("Etat du mot secre : ");
printf("%s",Result_Trouve_Cache_Save(motSecret,lettreTap));

system("pause");

return 0;
}



###########
Fonction.c #
###########

#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "Proto.h"

char lireCaractere()
{
char caractere = 0;

caractere = getchar(); // On lit le premier caractère
caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

// On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
while (getchar() != '\n') ; // il y a un ";" car c'est une boucle minimaliste "Technique de programmeur"

return caractere; // On retourne le premier caractère qu'on a lu

}

void Etoile_Secr(char* Tab)
{
int i;

for(i=0;i<strlen(Tab);i++)
{
printf("*");
}

printf("\n");
}

char* Result_Trouve_Cache_Save(char* Tab,char lettre)
{
int i;
char* copieTab = 0;

copieTab = malloc(strlen(Tab) + 1);
if (copieTab == 0)
{
exit(0);
}

for (i = 0 ; i < strlen(Tab) ; i++)
{
if (lettre == strlen(Tab))
{
copieTab[i] = lettre;
printf("%s\n",copieTab);
}
else
{
copieTab[i] = '*';
printf("%s\n",copieTab);
}

}

return copieTab;
}

################ Headers ###############
Proto.h #
########

#ifndef _PROTO_
#define _PROTO_

char lireCaractere();
void Etoile_Secr(char* Tab);
char* Result_Trouve_Cache_Save(char* Tab,char lettre);

#endif

###############Debugger##################

C:\Program Files\CodeBlocks\Save_Prog\Pendu>gcc -W -Wall -O2 main.c
C:\DOCUME~1\AUR~1\LOCALS~1\Temp\ccxZlJ8o.o:main.c:(.text+0x35): référence indÃ
©finie vers « Etoile_Secr »
C:\DOCUME~1\AUR~1\LOCALS~1\Temp\ccxZlJ8o.o:main.c:(.text+0x46): référence indÃ
©finie vers « lireCaractere »
C:\DOCUME~1\AUR~1\LOCALS~1\Temp\ccxZlJ8o.o:main.c:(.text+0x63): référence indÃ
©finie vers « Result_Trouve_Cache_Save »
collect2: ld returned 1 exit status

4 réponses

Avatar
YBM
Le 07.01.2012 01:08, clapannac a écrit :
...
C:Program FilesCodeBlocksSave_ProgPendu>gcc -W -Wall -O2 main.c
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x35): référence
indÃ
©finie vers « Etoile_Secr »
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x46): référence
indÃ
©finie vers « lireCaractere »
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x63): référence
indÃ
©finie vers « Result_Trouve_Cache_Save »
collect2: ld returned 1 exit status



Comment veux-tu que gcc devine que les fonctions appelé dans main.c
sont définies dans fonction.c ? Il faudrait déjà compilé celui-ci pour
commencer, et ensuite faire l'édition de lien:

(par ailleurs il manque un #include<stdio.h> dans main.c)

$ gcc -c -o fonction.o fonction.c
$ gcc fonction.o main.c -o prog
$ ./prog
Longueur du mot secre : *********
Propose une lettre : a
Etat du mot secre : *
**
***
****
*****
******
*******
********
*********
sh: pause: not found
$

Ça marche pô.

c'est quoi pause ? Tu es sous quel système d'exploitation ? Ça n'a rien
de standard en tout cas.
Avatar
espie
In article ,
clapannac wrote:
J'ai tenté de suivre vos conseils, d'ailleurs merci de vous être penché sur les
divers aspe erroné qu'il pressente, voici le nouveau code revue et les dernières
erreur trouvé par le debugger GCC (compilateur C98) avec les commandes -W -Wall
-O2 de spécifié :

C:Program FilesCodeBlocksSave_ProgPendu>gcc -W -Wall -O2 main.c
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x35): référence
indÃ
©finie vers « Etoile_Secr »
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x46): référence
indÃ
©finie vers « lireCaractere »
C:DOCUME~1AUR~1LOCALS~1TempccxZlJ8o.o:main.c:(.text+0x63): référence
indÃ
©finie vers « Result_Trouve_Cache_Save »
collect2: ld returned 1 exit status



Relis ton bouquin/ton cours sur la partie compilation separee.

Cote vocabulaire:
- gcc est un compilateur, pas un debuggueur.
- C98 ne veut rien dire. Il y a une norme pour le C++ C++98, mais les normes
C sont C89 et C99.

Ici, gcc te dit juste que main.c n'est pas un programme complet. Il n'a aucune
raison d'aller chercher des trucs "ailleurs".

-> il faut stopper la compilation avant la phase d'edition de liens, grace a -c.
-> il faut aussi compiler ton deuxieme source
-> et enfin faire l'edition de liens.

gcc -c -W -Wall -O2 main.c
-> produit main.o
gcc -c -W -Wall -O2 function.c
-> produit function.o
gcc -o prog -W -Wall -O2 main.o function.o
-> produit ton prog.

Il y a fort a parier que tu vas encore trouver quelques problemes a corriger
dans fonction.c.

Puisque visiblement, tu es sous windows, *attention a distinguer
majuscules/minuscules*. Main.c et main.c, ca n'est pas forcement la meme
chose (et ce sont deux fichiers distincts sur beaucoup beaucoup
d'environnement.

Ce type de confusion conduit souvent les gens a ecrire des anneries non
portables... genre #include <Fichier.h> alors que le nom standard
de l'entete, c'est fichier.h.

(par defaut, ne fais que des noms de fichier tout en minuscule tout le
temps, c'est le plus simple et le moins casse-gueule pour debuter).


Pour le cas ou tu auras finalement besoin d'un debuggueur, rajoute
un -g dans toutes tes lignes de compilation, ca demandera au compilo
d'annoter les fichiers objets/les executables avec des info supplementaires
dont le debuggueur aura besoin...
Avatar
Samuel DEVULDER
Le 07/01/2012 01:08, clapannac a écrit :

...char lettre...

for (i = 0 ; i< strlen(Tab) ; i++)
{
if (lettre == strlen(Tab))


^^^^^^^^^^^^^^^^^^^^^
Que voulais tu faire avec ce test? Tu compares des carottes (lettre)
avec des pomme de terres (une longueur de chaine). Même si tous les
deux sont des légumes (en fait des entiers), je pense que la
comparaison n'a aucun sens.

Tu voulais peut-être tester 'i' plutôt que 'lettre'? Relis toi, et fais
tourner le prog "dans ta tête" pour comprendre ce qui cloche dans la
logique du code. Tu devrais comprendre pourquoi tester "== strlen(Tab)"
est idiot dans le corps de la boucle et qu'en fait le test est un peu
plus complexe que var == strlen(chaine).

{
copieTab[i] = lettre;
printf("%sn",copieTab);
}
else
{
copieTab[i] = '*';
printf("%sn",copieTab);
}

}



Que veux tu faire au juste dans cette fonction? A vrai dire même avec un
test sur "i == strlen(Tab)-1" je ne comprends pas bien sa logique. Elle
remplace toutes les lettres sauf la dernière par '*' et place 'lettre'
en dernière position de la chaine. C'est bien cela que tu voulais faire?
Ca me parait suspect, car cela peut être fait de façon beaucoup plus
simple. Que veux tu faire au juste dans "Result_Trouve_Cache_Save" ?

A mon avis le bug "de pas grand chose" est quelque part plaqué en partie
dans cette fonction dont la logique est pour le moins étrange dès
l'origine (comparaison de tab[i] un caractère avec i, un index au début;
puis comparaison d'un caractère avec une longueur ici). A mon avis
tu devrais commencer par écrire un commentaire décrivant ce que tu
veux faire dans cette fonction pour comprendre que ce que tu as écris
ne fait pas *du tout* ce que tu crois qu'elle fait.

sam.
Avatar
FX
clapannac a écrit :
char* Result_Trouve_Cache_Save(char* Tab,char lettre)
{
int i;
char* copieTab = 0;

copieTab = malloc((int)strlen(Tab));



Il faut allouer un char supplémentaire pour le caractère null final, qui
marque la fin de toute chaîne de caractères.

copieTab = (char*)malloc(strlen(Tab)+1);


if (copieTab == 0)
{
exit(0);
}

for (i = 0 ; i < (int)strlen(Tab) ; i++)
{
if (lettre == Tab[i])
{
copieTab[i] = lettre;
printf("%sn",copieTab);



Attention, la chaine n'est pas terminée (pas de null). Si tu veux
vraiment l'afficher à ce moment-là, tu peux faire:

// affiche seulement les i+1 1ers caracteres
printf("%.*sn", i+1, copieTab);

}
else
{
copieTab[i] = '*';
printf("%sn",copieTab);



Idem. Tu aurais d'ailleurs pu n'écrire cette ligne qu'une fois en dehors
du if/else. Ca revient au même.

}

}



Et tu termines la chaine avec le null final:

copieTab[i] = '';


return copieTab;
}



Ca devrait mieux marcher comme ça.

FX