J'ai commencé à m'amuser sur le TP qui consiste à réaliser le jeu du pendu.
J'aimerais utiliser la fonction strcpy que nous avons vu dans le cours. Pour cela j'utilise le prototype suivant (que j'ai copié depuis le cours et collé dans mon fichier headers.h):
Malheureusement, mon éditeur de code (VS Code) m'affiche une erreur que je n'arrive pas à comprendre (voir photo). Est-ce que quelqu'un aurait une idée pour résoudre ce problème ?
Merci d'avance !
P.S. : Je ne pense pas que cela ait une grande importance mais sait-on jamais : je travaille actuellement avec mon MacBook. Lorsque j'avais simplement testé la fonction en suivant le cours, j'étais sur mon PC qui tourne avec Windows 10 et je n'avais pas rencontré de problème particulier.
Zoom sur le message d'erreur :
- Edité par LucasLethuillier 4 juin 2021 à 2:12:05
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Pour utiliser une fonction d'une bibliothèque, il ne faut pas écrire le prototype mais utiliser l'include correspondant. Ici il faut faire:
#include <string.h>
Le problème ici est que ton prototype est en conflit avec celui de la bibliothèque standard. Il dit la même chose mais avec des optimisations, et les 2 à fois deviennent une séquence incompréhensible. Pour certains compilateurs ça passe, sur d'autre non; tu es dans ce cas.
En fait, tu ne dois pas faire de prototype. juste appeler la fonction comme le dit @Dalfab. Le prototypage est utilisé uniquement pour les fonctions que tu codes toi-même. Si elle existe déjà tu dois juste include le fichier .h qui possède le prototype.
Note aussi que VS Code est loin d'être le meilleur éditeur pour du C et C++. Si tu es sous macOS tu peux utiliser Xcode (gratuit) et qui a l'avantage de ne pas être écrit en electron et support très bien le C, C++, Objective-C (et swift) en plus d'avoir un très bon tooling.
git is great because Linus did it, mercurial is better because he didn't.
Donc si j'ai bien compris il suffit d'inclure une bibliothèque standard dans mon fichier main.c pour pouvoir y appeler directement les fonctions correspondantes car le fait de rappeler le prototype de ces fonctions "toutes faites" dans mon fichier .h crée un conflit ?
C'est étrange car plus j'avais fait la même erreur avec un strcmp et un strchr, mais je n'avais aucun problème .
En tout cas merci, je m'en souviendrai ! C'est vrai que c'est plutôt logique puisque c'est à cela que sert le include que j'ai mis dans mon main.c ...
markand :
J'ai également Xcode sur mon mac mais je ne savais pas qu'il était meilleur que VS Code pour le C/C++. Je débute complètement donc c'est bon à savoir ! Merci :)
Donc si j'ai bien compris il suffit d'inclure une bibliothèque standard dans mon fichier main.c pour pouvoir y appeler directement les fonctions correspondantes car le fait de rappeler le prototype de ces fonctions "toutes faites" dans mon fichier .h crée un conflit ?
C'est étrange car plus j'avais fait la même erreur avec un strcmp et un strchr, mais je n'avais aucun problème .
En tout cas merci, je m'en souviendrai ! C'est vrai que c'est plutôt logique puisque c'est à cela que sert le include que j'ai mis dans mon main.c ...
markand :
J'ai également Xcode sur mon mac mais je ne savais pas qu'il était meilleur que VS Code pour le C/C++. Je débute complètement donc c'est bon à savoir ! Merci :)
Exactement, en général les fichiers .h servent à mettre tous les prototypes de fonctions.
Si tu crées tes propres fonctions tu mettras soit le prototype dans le fichier C dont tu as besoin ou alors (la meilleure technique) est de mettre les prototypes dans un fichier .h que tu inclues dans ton fichier c.
Le strlen existe déja donc dans ton fichier c tu rajouteras uniquement la ligne suivante :
#include <string.h>
après si je code des fonctions dans un fichier et le main dans un autre fichier je vais faire comme ça:
le fichier où il y a ma fonction :
ce fichier va s'appeler print.c
#include <stdio.h>
//une fonction basique pour faire un exemple
void print(char *str) {
printf("%s", str);
}
le fichier où je vais mettre mes prototypes, ce fichier va s'appeler print.h
Ce qui est mêlant pour les débutants est que certains compilateurs sont tolérants et d'autres pas. J'ai fait un test sur Windows 10 avec Mingw-w64 Je met le prototype de strcpy mais sans le <string.h> et ça fonctionne nickel.
Le Tout est souvent plus grand que la somme de ses parties.
Ce qui est mêlant pour les débutants est que certains compilateurs sont tolérants et d'autres pas. J'ai fait un test sur Windows 10 avec Mingw-w64 Je met le prototype de strcpy mais sans le <string.h> et ça fonctionne nickel.
j'utilise également gcc de mingw-64 et je n'ai pas à faire de prototype ni d'inclure string.h pour strlen.
j'utilise également gcc de mingw-64 et je n'ai pas à faire de prototype ni d'inclure string.h pour strlen.
Et bien active les Warning !
En effet c'est bien mieux en rajoutant -Werror -Wextra -Wall.
-Werror est un peu overkill … un warning est un warning et non une erreur.
En revanche ce qui est très très utile est pour les dernières version de gcc de rajouter l'option -fanalyzer qui effectue une analyse statique du code.
-g est évidemment indispensable car on finit toujours par utiliser un debuger ou un mem profiler pour débusquer les erreurs et autres fuites mémnoires.
clang dispose d'une option -Weverything qui à mon sens n'est pas super utile.
Problème avec un prototype dans VS Code
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
git is great because Linus did it, mercurial is better because he didn't.
Le Tout est souvent plus grand que la somme de ses parties.