|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() |
Qu'en pensez-vous de la FAQ C ? N'hésitez surtout pas à poster des idées d'amélioration !
Pour contribuer (proposer une nouvelle question/réponse, soumettre un rapport de relecture, etc.), ouvrez une discussion dans le forum Contribuez. |
|
|
00
|
|
|
#2 | ||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 659 ![]() |
Pour l'entrée : http://c.developpez.com/faq/?page=en...t#ENV_cmd_line , je proposerais de mettre un petit programme pour lister les variables :
Code :
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
||
|
|
10
|
|
|
#3 |
![]() ![]() |
Merci. Ton programme a été ajouté
|
|
|
00
|
|
|
#4 | ||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 659 ![]() |
Toujours pour la même entrée, il faudrait signaler l’existence de la fonction getenv pour récupérer une variable d'environnement !
Code :
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
||
|
|
00
|
|
|
#5 |
![]() ![]() |
L'entrée parle déjà de la fonction getenv et même aussi de la fonction putenv (POSIX). La bonne entrée étant d'ailleurs celle-ci, celle que tu pointes ne concerne que les arguments de la ligne de commande (argc et argv). Et personnellement, je préfère la réponse actuelle qui ne propose aucun exemple d'utilisation de getenv puisqu'il faut déjà en connaître un minimum sur son OS pour s'intéresser à cette question, ou alors il faudra changer son titre. Si ça t'intéresse, tu peux proposer le nouveau titre et la réponse, ou peut-être directement une nouvelle Q/R.
|
|
|
00
|
|
|
#6 | ||||||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 659 ![]() |
Comment récupérer une variable d'environnement
La fonction getenv() permet de lire la valeur d'une variable d'environnement. Code :
La fonction putenv(), introduite par POSIX, permet quant à elle de créer ou de modifier une variable d'environnement. Ces fonctions sont toutes déclarées dans stdlib.h. Pour avoir la liste des variables d'environnement, vous pouvez regarder l'entrée Comment récupérer la listes des variables d'environnement ? Comment récupérer la listes des variables d'environnement ? Il existe aussi, sur certains compilateurs, une forme de déclaration de la fonction main() qui donne accès aux variables d'environnement via un paramètre de main(). Code :
Code :
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
||||||
|
|
00
|
|
|
#7 |
![]() ![]() |
Merci.
Fait |
|
|
00
|
|
|
#8 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 659 ![]() |
Il manque une parenthèse à http://c.developpez.com/faq/?page=en...ment#ENV_popen
Code :
if ((pp = popen("ls -l", "r") == NULL) Code :
if ((pp = popen("ls -l", "r")) == NULL)
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Bonjour à tous,
Je viens de trouver un petit problème dans la FAQ C. Voici le mode opératoire pour le reproduire :
Résultat attendu :
Résultat obtenu :
Voilà
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
On avait parler il y a peu de l'entrée de la FAQ donnant la fonction clean_stdin() et des problèmes qu'elle posait : http://www.developpez.net/forums/d12...h/#post6637337
Vous en aviez parlé il y a un an : http://www.developpez.net/forums/d10...r/#post5982737
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Bonjour,
Je rajoute ici un autre problème de la FAQ, dont j'avais déjà parlé avec diogene. En comparant cette entrée de la FAQ : http://c.developpez.com/faq/index.ph...RINGS_numtostr à ce qu'on peut lire sur la page de man de la fonction strtol, je constate qu'il y a une condition de plus dans le man : Citation:
Il serait utile de préciser ces cas dans la FAQ, au moins pour que le lecteur ait conscience de ces cas particuliers.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#12 |
![]() ![]() |
Sur clean_stdin : la fonction est correcte, me semble t-il. C'est l'usage que certaines personnes en font qui est incorrecte. Mais on pourrait peut-être rajouter un lien vers la FAQ juste au dessus pour un exemple d'utilisation ?
Sur la conversion de chaîne en nombre : on en avait déjà en effet parlé. Je mettrai à jour dès que possible pour tenir compte de tes remarques. |
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Je suis d'accord : la fonction est correcte. Elle a néanmoins un cadre d'utilisation certains : il faut être sûr que le buffer contienne un caractère, sinon c'est boucle infinie. L'utilisation qu'on peut en faire est restreinte, on ne peut l'utiliser qu'après erreur et non en préventif pour vider le buffer clavier. Il sera bon de préciser cela, au moins.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#14 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Hello à tous,
Je voudrais rebondir à mon tour sur les entrées « À quoi sert la fonction fflush() » et « comment vider le buffer clavier », et notamment sur les messages que Bktero a eu la gentillesse d'indiquer. Pour le premier point (à quoi ça sert), la norme dit que le comportement d'un fflush() sur un flux entrant est indéfini. Je trouve qu'il serait bon d'expliquer également que fflush() a vocation à provoquer l'envoi immédiat des données en attente vers leur destinataire et pas à détruire en soi le contenu du buffer. Par conséquent, le destinataire d'un flux entrant est justement le processus qui appelle fflush() et l'opération n'a donc pas de sens. Plus précisément, si celui-ci ne lit pas les caractères à sa disposition, il n'y a aucune raison pour qu'ils bougent. Le comportement le plus « logique » à adopter dans ce cas consiste donc à ne rien faire. C'est l'attitude adoptée notamment par GNU. D'autres implémentations, elles, profitent justement du flou laissé par la norme pour implémenter justement un vidage de buffer et c'est une mauvaise chose pour deux raisons. La première, c'est que cette implémentation est basée sur la même supposition erronée que font les débutants, et que si ceux-ci prennent d'emblée l'habitude d'écrire des programmes en vidant le buffer clavier de cette façon, alors il faudra tous les reprendre un par un lorsqu'on voudra les porter. La seconde, c'est qu'en suivant cette logique, un « fflush(stdout) » ou sur n'importe quel flux de sortie devrait avoir le même comportement : détruire les données encore en attente passé un certain stade. Et ce n'est clairement pas le cas, ni l'objet de la fonction. En ce qui concerne le second point (comment vider le buffer), on ne peut pas considérer la fonction « clean_stdin() » actuelle comme correcte parce que non seulement elle impose une action particulière de l'utilisateur (l'entrée d'un retour à la ligne) mais qu'une lecture sur un buffer clavier vide ne renvoie pas EOF mais bloque. Et donc :
L'idéal serait de pouvoir agir directement sur le buffer associé au flux mais C99 (au moins) précise que setvbuf() ne peut être appelée que si aucune autre opération (autre qu'un setvbuf() échoué) n'a encore eu lieu sur le fichier concerné. Je pense que ce n'est pas faisable en C standard mais, à la fin du message en question, je proposais un programme compatible POSIX. L'idée s'appuie sur le fait qu'on considère le buffer de l'entrée standard comme vide qu'à partir du moment où la lecture d'un caractère supplémentaire serait bloquante. Et pour vérifier cela, la fonction en question acquiert les flags du flux, le passe en non-bloquant, et fait des lectures par blocs dans un buffer local jusqu'à obtenir EWOULDBLOCK, puis restaure les flags avant de sortir. Il faudrait simplement, en plus, s'assurer au préalable que l'entrée standard est associée à un flux interactif. |
|
|
20
|
|
|
#15 | ||
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
bonjour à tous,
Grace à _-Slash-_ et son sujet Comparaison de doubles, il y a une erreur dans la faq, à la question comment comparer des doubles si le premier nombre (a) est négatif, la différence b-a est positive, et le quotient (b-a)/a est négatif, donc toujours plus petit qu'un ratio sensément positif. Je suggère d'introduire soit un conditionnel (? Code :
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||
|
00
|
|
|
#16 | ||
|
Membre éprouvé
![]() ![]() Inscription : juillet 2006 Messages : 322 ![]() |
Ou peut-être indiquer les propositions de D. KNUTH (ici, double à la place de float):
Code :
|
||
|
|
00
|
|
|
#17 | ||
|
Expert Confirmé Sénior
![]() |
Ceci devrait être plus lisible avec min et max, non?
Code C :
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com