CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Problème compilation.

shinigota
shinigota
Niveau 10
12 février 2013 à 20:00:07

Salut !
Je me suis remis au C il y a une bonne semaine. Je sais que d'après certain le SDZ est mauvais, mais contrairement aux autres tutos, j'ai souvent vu que le tuto C était pas mal, par rapport au tuto C++ qui serait catastrophique.

Bref, donc je suis au TP du pendu, je l'ai pas terminé et j'ai déjà un problème...

Voilà le code source : http://pastebin.com/YyL9E2s5

J'ai une erreur dans les lignes 61 et 64 : subscripted value is neither an arraynor pointer nor vector.

J'ai déjà assez galéré avec l'allocation dynamique pour un tableau de char, et envoyer un tableau de char dans une fonction, car je me suis rendu compte que le tuto du SDZ manquait de certains détails, du coup là je suis bloqué et sur leur tuto je ne trouve pas la solution ...
D'ailleurs je suis certain que j'ai fais d'autres grosses fautes.

Si quelqu'un pourrait m’éclaircir, je lui en serait très reconnaissant ! :)
Merci et salut ! :)

vive_cod4
vive_cod4
Niveau 9
12 février 2013 à 20:38:35

Salut,

pour commencer, ta ligne 17 ne fais pas ce que tu penses.

Voilà ce que dis le compilateur :

Erreur : Incompatible types when assigning to type char[(sizetype)(tailleChaine)] from type char.

Ce que tu devrais faire, c'est d'enlever le malloc & sizeof de ta ligne 15. Pourquoi ?

Car actuellement, ce que tu fais, tu créer un pointeur de type int d'une longueur de longueurChaine * taille de char.

Ensuite tu remplaces tailleChaine par longueurChaine dans ton main.c

Venons à ton problème :

Tu voudrais passer des chaînes de caractères à ta fonction MAIS dans les prototypes tu ne permets que des types chars (valeur représentant un symbole). Pour régler ce problème, tu devrais recevoir des pointeurs de char -> char*. Mais tu veux retourner ton nouveau mot, mais puisque tu le passes par pointeur (il sera directement modifier) tu ne dois rien retourner ton tu peux mettre comme retourn de fonction "void".

Dernier problème, dans ta boucle while, tu fais : while(copieMot != mot), ce que tu fais réellement c'est de comparer leurs adresses et non leur contenu ! Pour ça, dans la librairie string.h, tu as la fonction strcmp (de tête) qui te permet de faire ça.

Revenons à ta fonction verifierMot, tu as la ligne suivante :

for(i = 0; i > nombreLettres; i++)

Je te laisse en déduire le problème.

Sinon ta conditions dans la même fonction :

if(copieMot[i] == lettre)
{
copieMot[i] == lettre;
}

copieMot vaut "xxxxxxx" comment veux-tu deviner la lettre ? Je te laisse trouver la correction. Sinon tu ne modifies pas ta chaîne si la lettre est bonne ...

Voilà, j'étais dans une bonne humeure, et la ton programme fonctionne. Si tu as des questions, n'hésite pas

shinigota
shinigota
Niveau 10
12 février 2013 à 21:32:23

En fait, je devrais tout simplement faire
tailleChaine = strlen(mot);
char copieMot[tailleChaine];
Et donc sans passer par le malloc ?
Il me semblait que mettre une variable pour taille de tableau était formellement interdit (sauf quand c'est dans les préprocesseurs ou via l'utilisation du malloc)

Et donc pour le while, je dois faire ça si j'ai bien compris :
while(strcmp(mot, copieMot) == 0)
{
...
}

D'ailleurs je m'en suis pas rendu compte, mais ce que je voulais mettre dans le if c'est :
if(mot[i] == lettre)
{
copieMot[i] == lettre;
}
Car sinon, tu as raison ça sert strictement à rien !

Alors pour ma fonction, j'ai donc ça:
void verifierMot(char lettre, char *copieMot, char *mot, int nombreLettres)
{
int i = 0;

for(i = 0; i > nombreLettres; i++)
{
if(mot[i] == lettre)
{
copieMot[i] == lettre;
}
}
}
Mais quand je démarre, donc sans passer par le malloc, ça fonctionne, mais ma fonction ne semble pas modifier copieMot, j'suis un assez perdu et je sais plus s'il faut utiliser les pointeurs dans la fonction...

Merci beaucoup de ton aide, et désolé du dérangement !

vive_cod4
vive_cod4
Niveau 9
12 février 2013 à 22:01:59

En fait, je devrais tout simplement faire
tailleChaine = strlen(mot);
char copieMot[tailleChaine];
Et donc sans passer par le malloc ?

Oui

Il me semblait que mettre une variable pour taille de tableau était formellement interdit (sauf quand c'est dans les préprocesseurs ou via l'utilisation du malloc)

Dans certaines vieilles version du C, c'était interdit, c'est comme le fait de devoir déclarer les variables au début de la fonction. Maintenant c'est autorisé (à partir du C99)

Et donc pour le while, je dois faire ça si j'ai bien compris :
while(strcmp(mot, copieMot) == 0)
{
...
}

Nope, dans ce cas tu ne rentreras jamais dans la boucle, à moins que le mot mystère soit aussi égal à xxxxxx

D'ailleurs je m'en suis pas rendu compte, mais ce que je voulais mettre dans le if c'est :
if(mot[i] == lettre)
{
copieMot[i] == lettre;
}
Car sinon, tu as raison ça sert strictement à rien !

En effet, faute de logique

Alors pour ma fonction, j'ai donc ça:
void verifierMot(char lettre, char *copieMot, char *mot, int nombreLettres)
{
int i = 0;

for(i = 0; i > nombreLettres; i++)
{
if(mot[i] == lettre)
{
copieMot[i] == lettre;
}
}
}
Mais quand je démarre, donc sans passer par le malloc, ça fonctionne, mais ma fonction ne semble pas modifier copieMot, j'suis un assez perdu et je sais plus s'il faut utiliser les pointeurs dans la fonction...

Oui le prototype est juste.
La réponse est donnée dans mon poste au dessus, mais je te remets la ligne causant le problème : for(i = 0; i > nombreLettres; i++)

shinigota
shinigota
Niveau 10
12 février 2013 à 22:09:59

Ah oui, pour le strcomp, ça doit être "!=" !
Je viens de voir où été le problème dont tu parlait :
for(i = 0; i < nombreLettres; i++)
{
if(mot[i] == lettre)
{
copieMot[i] == lettre;
}
}

J'ai mis i > au lieu de i < en fait.

Et à l'intérieur du if j'avais mis mot au lieu de copie mot.

Sauf que je comprend pas trop j'ai refais un test, ça ne change pas copieMot, j'ai dû me planter dans les pointeurs ou avec "lettre"...

Désolé encore du dérangement, je doit être un peu chiant :peur:
Mais merci :oui:

vive_cod4
vive_cod4
Niveau 9
12 février 2013 à 22:13:04

En effet, j'ai pas vu que tu avais pas corrigé la ligne suivante : (cité dans mon premier poste)

copieMot[i] == lettre;

Je te laisse corriger.

shinigota
shinigota
Niveau 10
12 février 2013 à 22:14:59

Ah je vois !
Mais c'est pas possible, je suis vraiment bête ...
Même après avoir relu plein de fois le code j'avais pas fait attention au double égal !

Ca fonctionne parfaitement, merci énormément pour tes explications ! :D

vive_cod4
vive_cod4
Niveau 9
12 février 2013 à 22:16:15

De rien, parfois la meilleure solution de correction et l'oeil externe :o))

shinigota
shinigota
Niveau 10
13 février 2013 à 20:34:54

Décidément, j'ai encore un problème ...
En fait quand j'entre un mot, le pendu marche, mais si le mot comporte un E, c'est la catastrophe et quand copieMot s'affiche ça me rajoute tout un tas de symbole bizarre ...

http://pastebin.com/MUycPpHR

Le problème c'est que j'ai pas l'impression que ça vient de mon code, mais plutôt que j'ai fais une manipulation "impropre", mais je vois pas vraiment quoi...

PocoIo
PocoIo
Niveau 10
13 février 2013 à 22:04:12

" mais si le mot comporte un E, c'est la catastrophe et quand copieMot s'affiche ça me rajoute tout un tas de symbole bizarre ... "

Que quand il y a un E dans le mot? Je ne vois pas trop pourquoi ça merderais que dans ce cas si particulier.

Ace_Attorney
Ace_Attorney
Niveau 10
13 février 2013 à 22:12:25

Les "caractères" bizarres doivent apparaître car tu n'as pas de '\0' à la fin de ta chaîne de caractère qui permet à printf de savoir la longueur de la chaîne de caractère à afficher.

vive_cod4
vive_cod4
Niveau 9
13 février 2013 à 22:18:47

Le problème vient du manque de \0 comme dit Ace_Attorney. Ton programme ne marche pas avec 2 caractères par exemple.

Bref, pour corriger, il faut faire ça :

char copieMot[longueurChaine+1];

Et après ta boucle for avec les 'x'

copieMot[longueurChaine] = '\0';

shinigota
shinigota
Niveau 10
16 février 2013 à 11:49:27

Je vois !
Ca a marché, merci encore :-)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment