[3][7] Comment affecter une valeur à une chaîne de caractères ?
Il n'est pas préciser dans cette réponse que les fonctions strcpy et strncpy sont définies dans le fichier d'en-tête string.h . Même si cela est préciser pour strcmp à la question [3][5], il serait peut-être judicieux de le préciser dans cette question.
Citation : minirop
La fonction strcmp est définie dans le fichier d'en-tête string.h. Pensez bien à l'inclure si vous l'utilisez !
Ce n'est que du chipotage, mais il faut bien que la FAQ soit précise, non ?
perimgui : j'ai ajouté un vague début de réponse, mais pas en utilisant system. Les raisons de cette non-utilisation de system ont bien été détaillées par les autres zéros.
florent m : ce que tu donnes est une partie de la solution. Je veux dire que le membre ne cherche généralement pas à renommer main.cpp en main.c. Ce qui se passe, c'est qu'il a un problème dont la solution est « il faut remplacer .cpp par .c ».
J'aimerais donc que la question soit quelque chose de la forme : « J'ai le message d'erreur X avec code::blocks. Que faire ? - réponse - il faut renommer main.cpp en main.c. Pour cela, faites telle manipulation ... ».
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
Il n'est pas préciser dans cette réponse que les fonctions strcpy et strncpy sont définies dans le fichier d'en-tête string.h . Même si cela est préciser pour strcmp à la question [3][5], il serait peut-être judicieux de le préciser dans cette question.
Citation : minirop
La fonction strcmp est définie dans le fichier d'en-tête string.h. Pensez bien à l'inclure si vous l'utilisez !
Pendant qu'on y est, les fonctions ne sont pas définies dans les fichiers d'en-tête (les .h) mais elles y sont déclarées. Là sont deux notions distinctes et à ne pas confondre.
Pour les fonctions : Déclaration : ce qu'on appelle le prototype. Définition : le corps de la fonction.
Bonjour,
Après un (très) rapide survol du sommaire de la FAQ, j'ai l'impression qu'un sujet très important n'est pas abordé: la documentation des fonctions.
La "msdn" et les pages "man" sont en effet une source importante de renseignement et apprendre à lire le descriptif d'une fonction permettrais de limiter l'usage folklorique par certains de certaines fonctions, en plus de développer/encourager une certaine autonomie dans la recherche d'erreurs!
On peut éventuellement étendre cela à la description/implémentation de certains algorithmes dans wikipédia.
(bref apprendre à se servir des outils d'aide? déjà les recenser ca serait bien)
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
la FAQ a pour vocation de reprendre les questions les plus fréquemment posées sur le forum. Mais tu tombes à point nommé, car il y a une heure à peine est sorti un post-it qui explique aux débutants où trouver de l'aide. Il y est donné un paquet de liens concernant le langage C. Il pourrait être intéressant de parler davantage du man et des autres documentations de référence.
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
Une proposition de rajout dans la FAQ, à propos des IDE, ceci après avoir répondu dans un n-ième topic d'aller voir la FAQ, toussi-toussa, mais m'étant par la suite rendu compte qu'il n'y avait pas d'entrée :
[5][9] Mon programme en console se ferme tout seul sans que je puisse rien faire (parce que la console de Windows se ferme après l'exécution).
Je ne l'ai pas rédigé mais je peux le faire si vous êtes d'accord.
Oui mais le problème viens du fais que le titre de cette section n'est pas très explicite pour quelqu'un qui souhaite résoudre le problème montrer par Maëlan.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
La question que tu pointes ne répond pas vraiment à la question du débutant "Eh mais, mon programme se ferme tout seul".
Je voyais plutôt quelque chose du genre "C'est parce que ton programme est fini, Windows ferme automatiquement la fenêtre. Pour y remédier, tu dois faire une pause. <comment faire, ou lien vers la question qu'a pointé Adroneus>"
Cette question mériterait plus de précisions d'ailleurs. getchar toute seule ne met pas toujours le programme en pause, il faut aussi distinguer le cas où un scanf a été appelé dans le programme. si GuilOooo veut bien intervenir pour régler ça .
Hum, que voulez-vous régler exactement ? Préciser qu'il faut vider le buffer pour faire effectivement une pause ?
Il faut rajouter que si un scanf a été utilisé dans le programme, le getchar à la fin n'aura pas d'effet visible, et qu'il faut vider stdin puis mettre le getchar qui met en pause le programme. Voilà brièvement.
Edit : et je suis d'avis que le titre devrait être reformulé.
Quelque chose comme "Votre programme se ferme instantanément et vous n'avez pas le temps de le voir ?" serait plus parlant.
D'un autre côté, ça mériterait que les explications concernant le buffer d'entrée et le comportement de scanf avec soient écrites quelque part une bonne fois pour toutes. Ça n'a pas trop sa place dans la FAQ, mais pas mal de réponses de celle-ci en bénéficieraient.
J'ai modifié un petit peu en attendant, mais ça ne corrige pas le problème.
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
[5][9] Mon programme en console se ferme tout seul sans que je puisse rien faire.
C'est probablement dû au fait que la console de Windows est programmée pour se fermer automatiquement à la fin de l'exécution du programme qui l'avait sollicitée.
Plusieurs solutions sont envisageables :
Effectuer une pause à la fin de votre programme, voir ici <lien vers [2][2]>.
Cependant, comme le souligne Kevin Leonhard :
Citation : Kevin Leonhart
La plupart des systèmes disposant d'une vraie console n'ont pas besoin et n'apprécient pas les pauses en fin de programme ; la console étant un environnement persistant et qui ne se ferme pas comme sous Windows.
Lancer votre programme (fichier *.exe si vous êtes sous Windows) depuis une console que vous avez ouverte préalablement ; si vous ne savez pas comment faire, suivez cette procédure :
dans la petite fenêtre qui s'ouvre, tapez « cmd » et validez ;
vous avez ouvert une console ! Maintenant, rendez-vous dans le dossier où se trouve le fichier exécutable (*.exe) de votre programme en tapant la commande cd /d chemin\du\dossier\de\votre\projet\ (pressez Entrée pour valider) ;
il ne vous reste plus qu'à lancer votre programme avec la commande monProgamme.exe (si vous utilisez Code::Blocks, la commande est bin\Debug\monProgamme.exe ou bin\Release\monProgamme.exe, selon votre mode de compilation).
Vous pouvez l'exécuter ainsi autant de fois que vous voulez sans que la fenêtre ne se ferme. Il vous suffit, pour le relancer, de taper à nouveau la commande (ou de la rappeler avec la touche ↑ (flèche haut), si vous êtes paresseux).
Configurer votre IDE pour qu'il attende votre accord pour fermer la console après la fin de votre programme (cette manipulation ne modifie en rien votre programme lui-même, si vous le lancer en dehors de votre IDE, il n'y aura pas de pause à la fin). <Manipulations pour différents IDEs>. Voici la marche à suivre pour Code::Blocks :
Project > Properties… > onglet Build targets ;
dans la zone de gauche, sélectionnez le mode de compilation qui vous intéresse (« Debug » ou « Release ») ;
dans la zone de droite, cochez la case « Pause when execution ends ». Il ne vous reste plus qu'à valider (bouton OK).
Désormais (vous n'avez pas besoin de recompiler), une pause se produira après la fin de l'exécution de votre programme, avec le message suivant :
Process returned 0 (0x0) execution time : 0.219 s
Press any key to continue.
Ce message vous indique la valeur retournée par main et le temps d'exécution de votre programme. Il vous suffit d'appuyer sur une touche pour fermer la console.
Pour les manipulations avec les IDEs, je ne peux pas le faire, n'en utilisant plus depuis un moment. Je sais que sous Code::Blocks, le programme était lancé par un autre programme qui à la fin, affichait certaines informations comme des temps, et attendait l'appui d'une touche pour terminer ; donc c'est possible, mais désactivable puisqu'on voit souvent des sujets "Mon programme se ferme" sous C::B.
EDIT: J'ai réussi à remettre la main sur un Code::Blocks donc j'ai pu indiquer les manipulations à faire pour cet IDE (+ des précisions à propos du chemin pour lancer l'exécutable : bin\Release\ ou bin\Debug\).
Je veux bien toutefois des informations pour d'autres IDEs. A vot'bon cœur !
Citation : GuilOooo
J'ai modifié un petit peu en attendant, mais ça ne corrige pas le problème.
Je pense que le mieux serait de fusionner les deux entrées. Au final, mettre le texte que Maelan propose à la suite de l'entrée [2][2] complète bien ses propos. On donne une astuce pour faire une pause portable et puis on explique d'autres solutions, dépendante de l'IDE utilisé. La seule chose, c'est qu'il faudrait changer le titre "Comment faire une pause de façon portable (sur tous les systèmes) ?" par "Mon programme en console se ferme tout seul sans que je puisse rien faire, que faire?" qui est plus explicite pour un débutant.
En fait, ce qu'il faut fusionner, ce ne sont pas les entrées ce sont les contenus : les débutants auront plusieurs façon de poser la question a laquelle on répond, en fonction de leurs connaissances.
Je pense que le mieux serait de fusionner les deux entrées. Au final, mettre le texte que Maelan propose à la suite de l'entrée [2][2] complète bien ses propos. On donne une astuce pour faire une pause portable et puis on explique d'autres solutions, dépendante de l'IDE utilisé. La seule chose, c'est qu'il faudrait changer le titre "Comment faire une pause de façon portable (sur tous les systèmes) ?" par "Mon programme en console se ferme tout seul sans que je puisse rien faire, que faire?" qui est plus explicite pour un débutant.
Oui, mais la [2][2] et ma proposition répondent à des questions différentes. Par exemple, un Zéro pourrait se demander comment faire une pause dans son programme indépendamment du fait que traite ma proposition (en clair : pas pour régler le "problème de la console qui se ferme"). Et inversement : il pourrait se demander comment régler ce fameux problème, sans penser forcément "Ah, il me faut une pause dans mon programme" (même s'il sera très vite redirigé vers cette solution), d'autant plus que comme je le souligne dans ma rédaction, ce n'est pas la seule solution.
Citation : Nathalya
En fait, ce qu'il faut fusionner, ce ne sont pas les entrées ce sont les contenus : les débutants auront plusieurs façon de poser la question a laquelle on répond, en fonction de leurs connaissances.
Tu veux dire, mettre plusieurs liens différents dans le sommaire, correspondant à plusieurs questions formulées, et qui pointeraient vers la même réponse ?
Par ailleurs, je répète ma question :
Citation : Maëlan
Citation : GuilOooo
J'ai modifié un petit peu en attendant, mais ça ne corrige pas le problème.
Je ne vois pas d'ajouts à la question [2][2]. De quoi parlais-tu ?
Je me permet de faire remonter le topic. J'aimerais participer aussi à propos d'une question qui revient assez souvent :
[8][11] Faut-il caster le retour des fonctions d'allocation dynamique ?
On voit beaucoup de programmeurs qui castent la valeur de retour de malloc/calloc/realloc, pourtant en C ce n'est pas nécessaire. En effet, les fonctions d'allocation dynamique retournent une valeur de type void*, ce qui fait qu'elle peut être convertie implicitement dans n'importe quel type : il n'est donc pas nécessaire de caster.
Si cependant votre code refuse de compiler en vous sortant une erreur du type "invalid conversion from 'nom du type' to 'void*' c'est que vous compilez en C++, car contrairement au C les conversions implicites du type void* vers un autre type sont interdites.
C'est vrai que cela pourrait être intéressant d'ajouter cette entrée
Je reproche juste une chose c'est que l'explication est imprécise dans ses termes. Par exemple, on ne caste pas une fonction, mais sa valeur de retour. De même, une fonction a effectivement un type (ou plutôt son désignateur), mais ici tu parles du type de retour
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire