Partage
  • Partager sur Facebook
  • Partager sur Twitter

Discussions sur la FAQ du forum de C

Pas celle sur les bibliothèques tierces.

25 juin 2011 à 12:51:17

Tu peux juste éditer les options de compilation de ton fichier aussi. :)
  • Partager sur Facebook
  • Partager sur Twitter
29 juillet 2011 à 14:00:05

[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 ? ^^
  • Partager sur Facebook
  • Partager sur Twitter
29 juillet 2011 à 14:11:02

Mymimoi : corrigé.

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 ... ».
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
29 juillet 2011 à 14:19:22

Citation : Mymimoi


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.
  • Partager sur Facebook
  • Partager sur Twitter
29 juillet 2011 à 14:26:52

Tout à fait. Ça m'apprendra à lire en diagonale.
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
29 juillet 2011 à 14:44:39

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)
  • Partager sur Facebook
  • Partager sur Twitter
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
29 juillet 2011 à 15:00:36

Salut,

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.
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
10 août 2011 à 23:38:08

Bonsoir,

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.
  • Partager sur Facebook
  • Partager sur Twitter
11 août 2011 à 11:07:02

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.
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
11 août 2011 à 16:46:51

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>"
  • Partager sur Facebook
  • Partager sur Twitter
11 août 2011 à 16:50:59

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 :) .
  • Partager sur Facebook
  • Partager sur Twitter
11 août 2011 à 17:54:45

Hum, que voulez-vous régler exactement ? Préciser qu'il faut vider le buffer pour faire effectivement une pause ?
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
11 août 2011 à 19:04:53

Citation : GuilOooo

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.
  • Partager sur Facebook
  • Partager sur Twitter
11 août 2011 à 22:20:41

C'est vrai.

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.
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
12 août 2011 à 23:05:37

Je propose quelque chose comme ça.

[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 :
  1. 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.

     
  2. 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 :
    • Démarrer > Exécuter (ou raccourci clavier Windows+R) ;
    • 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).

     
  3. 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 ne vois pas d'ajouts à la question [2][2]. De quoi parlais-tu ?
  • Partager sur Facebook
  • Partager sur Twitter
14 août 2011 à 14:28:05

J'ai édité mon message précédent et la proposition d'entrée pour la FAQ.

Voyez-vous un inconvénient pour que je la rajoute à la FAQ ? Êtes-vous d'accord ?
  • Partager sur Facebook
  • Partager sur Twitter
14 août 2011 à 17:07:30

Ça commence à être redondant, mais personnellement ça ne me dérange pas. Si tu le postes, je modifierai la liste des entrées pour le rajouter. :)
  • Partager sur Facebook
  • Partager sur Twitter
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
14 août 2011 à 18:09:25

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.
  • Partager sur Facebook
  • Partager sur Twitter
14 août 2011 à 19:45:45

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.
  • Partager sur Facebook
  • Partager sur Twitter
64kB de mémoire, c'est tout ce dont j'ai besoin
14 août 2011 à 20:27:53

Citation : Taurre

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
17 août 2011 à 18:39:12

Bon, je l'ai posté sur la FAQ. Finalement, je l'ai classé dans la catégorie [2] La console.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
26 décembre 2011 à 20:45:21

Salut,

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.
  • Partager sur Facebook
  • Partager sur Twitter
26 décembre 2011 à 21:06:03

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 ;)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
26 décembre 2011 à 21:08:43

Merci de ton message. J'ai édité, c'est mieux ?
  • Partager sur Facebook
  • Partager sur Twitter
26 décembre 2011 à 21:11:19

Citation : informaticienzero


Merci de ton message. J'ai édité, c'est mieux ?



Oui, cela m'a l'air bon comme cela. Il faut juste changer le "qu'elles peuvent être converties" en "qu'elle peut être convertie" ;)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
26 décembre 2011 à 21:18:27

Merci. :)
D'autres avis ?

PS : j'ai posté mais je suis près à faire des modifications s'il le faut.
  • Partager sur Facebook
  • Partager sur Twitter
26 décembre 2011 à 21:27:29

En relisant une fois:

Citation : informaticienzero


car contrairement au C les conversions implicites d'un type vers le type void* sont interdites.



dans ce cas ci, il s'agit des conversions implicites du type void* vers un autre type et pas l'inverse. ;)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
26 décembre 2011 à 21:29:15

Effectivement je me suis trompé. :euh:
  • Partager sur Facebook
  • Partager sur Twitter