|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Salut les programmateurs C,
Je suis un débutant (pas complètement je connais python un peu), je poste car je désire prendre contacte avec la communauté C de ce site de forums génial et parce-que j'en ai marre depuis environ une semaine de me trouver seule livré contre mon ordinateur. J'apprends le C89 et j'essaie d'écrire un programme ou l'on entre un octet sous notation majuscule hexadécimale et qui est censer renvoyer la valeur en entier convertie. et je ne comprend pas pourquoi celui-çi ne marche pas ou presque pas (sûrement du aux conversions de types): un caractère hexadécimal est correctement convertie en int mais pas deux et pas les chiffres, car le programme n'entre pas dans la structure conditionnelle destiner a traiter ceux-ci. Voici le code barbare de mon déboirs: Code :
le mieux serai que chacun fournisse une réponse didactiellement commenter a sa façon (sa version). Et si vous pourriez écrire une fonction de traitement au lieu des structures conditionnel ca serai sympa car je n'y arrive pas: j'aimerai apprendre. Merci pour vos réponses éclairé.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||
|
00
|
|
|
#2 | |||||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
Salut ! J'aime bien la démarche de compréhension ^^
Tu apprends peut-être le C avec le K&R, mais il y a justement une chose qu'ils ne "font pas bien" dans ce livre : la façon d'écrire le prototype de la fonction main. On devrait écrire : Code :
Après ces remarques, attaquons le code. Déjà, chez moi, avec gcc, il ne compile pas. J'ai des erreurs et aussi des warnings. L'erreur vient de l'absence de ; à la fin de la ligne avec l'enum. De plus, si tu ne nommes pas ton enum, tu ne pourras pas y accéder par la suite, me semble t-il. Citation:
Détail : la fonction est évaluée à chaque itération. D'un point de vue performance, cela peut-être embêtant. Si un jour tu as des problèmes de vitesse, sache que tu peux créer une variable contenant le retour de strlen() et comparer i à cette variable. En C, tout est entier. Les types int, char, short, long, size_t, intprt_t, ptrdiff_t, j'en passe et des wagons sont tous des entiers binaires. Ici, tu testes donc si la valeur contenue dans un char est supérieure à 10. Si tu connais ta table ASCII des caractères, tu sais qu'autant caractère alphanumérique ne répond à ça. Tu devrais donc comprendre pourquoi ça ne marche pas ^^ Ensuite, je pense que ta boucle est très compliquée... Les entrelacements de if /else if / if m'ont l'air hasardeuses. Comme en Python, un code bien indenté est primordiale pour la compréhension. Bref, revois un peu ton algo Perso, l'algo bête qui me vient à l'idée en premier est de parcourir la chaine de caractères et de faire un switch / case sur chaque caractère. Il y a sûrement des méthodes plus efficaces mais elle est simple pour un débutant.
__________________
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é ! |
|||||
|
10
|
|
|
#3 |
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 324 ![]() |
Sinon strtol fait cela très facilement
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
|
|
02
|
|
|
#4 | ||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour vos réponses:
j'apprends le C89 donc il faut le préciser (c'est grave l'ancienneté de la version ?) /* (C89) ? (! classe) : C99 ; */ mais ce n'est pas indispensable. A vrai dire je débute vraiment j'en suis au chapitre 3 de K/R. -Je ne comprend pas le mot clef struct de ton code et la notation pointé qui en suit me fait penser que j'ai affaire a un objet ou du moins a une structure. -Le nommage d'enum tu me l'apprend. -La base sont les int mais j'ai quand même beaucoup de mal avec les types. Mais j'ai solutionner mon problème avec le code suivant que j'aimerai améliorer afin de aussi pouvoir afficher la valeur entrer d'oû les commentaires préfixer "for futur:": Code :
Je suis ouvert a tous commentaires et conseils merci d'avance pourquoi je vous signifie ma gratitude pour ce qui a déjà été dit.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Ingénieur développement matériel électronique Inscription : juillet 2010 Messages : 142 ![]() |
Salut,
Personnellement je te conseille d'apprendre le C99 (déjà vieux 14 ans...). Le minimum pour faire une code propre et d'utilisation les options de compilation suivante : gcc -std=c99 -Wall -Werror Si tu veux pousser le vice : gcc -std=c99 -Wall -Werror -Wextra Et si tu te sent d'humeur pédante : gcc -std=c99 -Wall -Werror -Wextra -pedantic L'option -O2 va optimiser le code généré mais également lever des warnings supplémentaires. Si tu veux débuger le code avec gdb rajoute les options -O0 -g @+ |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Fred Enseignant Inscription : juillet 2006 Messages : 1 324 ![]() |
Sinon strtol, non ça le fait pas?
Code :
__________________
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein) |
||
|
|
02
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
@Fred : comme je l'ai dit, le but du jeu pour lui est sûrement de recoder une fonction équivalente à strtol() justement ^^
@mith06 : Citation:
@Luke spywoker : Tes options de compilation ne sont pas bonnes. Ton option a à voir avec les fonctions inline, je sais pas comment tu l'as trouvée d'ailleurs XD Pour compiler, sers toi de gcc -Wall -Wextra Tu peux t'amuser à mettre -Werror (ce n'est pas bête d'ailleurs, quoi que cela ne permet pas de différencier erreurs et warnings du coup). Il faut utiliser -ansi ou -std=c99 pour choisir le standard de la norme. Pour ce qui est du code..... Tu penses pas pouvoir faire plus simple ? :s
__________________
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é ! |
|
|
10
|
|
|
#8 | |||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour vos réponses,
Citation:
Mais j'ai un nouveau problème: je ne comprend pas pourquoi je ne peut copier un tableau a l'envers: Code :
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
|||
|
00
|
|
|
#9 | ||
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 437 ![]() |
Quelques recommandations :
1- Tu dois spécifier dans la déclaration le type de retour des fonctions. Utiliser un type par defaut (int) est maintenant obsolète Code :
3- Sur le problème proprement dit, la fonction reverse() : - la boucle ne marche pas : le test dit while (i <= 0)avec i initialisé à 0 puis incrémenté dans la boucle. On a toujours i>=0. La boucle sera effectuée une fois au début pour i==0 puis i passe à 1, le test devient faux et la boucle s'arrête - le test devrait porter sur la valeur de j, pas de i while(j>=0). . - une chaine de caractère doit comporter un '\0' terminal. Lorsque la chaine d'origine a été recopiée dans la chaine de destination, il faut ajouter dans cette dernière ce caractère terminal - strlen() ne compte pas le '\0' terminal. Par exemple si on a la chaine "1234", strlen() renvoie 4 bien que la chaine fasse 5 bytes. Le dernier élément de la chaine (le '4') est à l'indice 3 soit strlen()-1. Celui à l'indice strlen() est le '\0' terminal. L'initialisation de j est donc fausse : si on copie cet élement en position 0 de la chaine de destination, celle-ci sera considérée, en tant que chaine, comme vide.
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
||
|
|
10
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() |
Pour parcourir entièrement une chaîne, le plus simple est de profiter du fait qu'en C une chaîne se termine systématiquement par le caractère nul '\0'.
Ainsi tu peux faire: Code C :
Ainsi tu peux faire: 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. |
||||
|
|
11
|
|
|
#11 | ||
|
Membre Expert
![]() Développeur informatique Inscription : juin 2009 Messages : 1 040 ![]() |
Dans ce cas là, autant écrire directement:
Code C :
L'appel à toupper permet de gérer simplement les lettres hexadécimales, en passant tout en majuscule avant les comparaisons. Du coup, ça simplifie les comparaisons. Ça passera sans soucis en ASCII ou en UTF-8. |
||
|
|
02
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() |
Ça passe en ASCII, tous les ASCII étendus et EBCDIC, mais ça n'est pas garanti par le standard C et Luke le wokeur d'espions a précisé spécifiquement qu'il apprenait le C standard C89.
__________________
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. |
|
|
01
|
|
|
#13 | ||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour vos nombreuses réponses,
J'ai terminer le chapitre 4 de K&R ANSI, et je galère venant du python (qui est beaucoup plus flexible). J'ai améliorer le programme de conversion de valeurs hexadécimal en C qui prend maintenant en entré un chiffre hexadécimal qui ne soit pas limité a un octet. Par ailleurs j'ai réussi aussi a copier une chaine (tableau de caractères) avec '\0' à la fin mais j'arrive pas a l'afficher avce printf(). Mais j'ai beaucoup de difficultés avec mes nouvelles idées de bout de code pour apprendre le langage, notamment pour les entrées gets() et getchar(), je cherche a créer un programme de calcule de solution d'opération de base seulement je n'arrive pas a obtenir une valeur True quand je compare l'entrer avec l'opération soumise: Voici un bout de code qui ne fonctionne pas du tout: Code :
PS: Je sais car j'ai lu, que beaucoup de gens ont abandonner la voix du C en cours de route débouter par la difficultés: heureusement que j'ai commencer avec python.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
Ah ! La souplesse de Python ^^
Moi aussi j'ai été perturbé quand je suis passé de C à Python mais le sens inverse : j'aurais aimé qui ne me laisse pas faire ce que je veux. http://man.developpez.com/man3/rand.3.php --> il faut appeler srand() avant d'utiliser rand(), ça te permet d'avoir des résultats différents d'une exécution du programme à l'autre. Tu ne peux pas modifier RAND_MAX ainsi. Les #define sont définies par unité de compilation. Ici, tu modifies la valeur dans main.c et non dans le fichier où regarde rand() pour faire son calcul. La page de manuel te montre comment obtenir un nombre dans l'intervalle souhaité. Donc après cette boucle, c contient \n. Connais-tu le caractère donc le code ASCII est 5 ? Citation:
Tu vois où je veux en venir ? PS : encore une fois, il ne faut pas utiliser gets() ! Il faut lui préférer fgets().
__________________
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é ! |
|
|
10
|
|
|
#15 | ||||||||
|
Membre éclairé
![]() Etudiant informatique autodidacte Inscription : juin 2010 Messages : 591 ![]() |
Merci pour la réponse,
Citation:
N'existe t il pas a l'image de python un site officiel ("site officiel du C ANSI" dans google fait choux blanc !) ou l'on peut trouver de la doc. car essayer de comprendre les fichiers sources en tant que débutant n'est pas facile et mêne à des erreurs comme: Code :
Je ne connait pas la table ASCII par cœur (quel honte !!!) mais je m'en m'excuse car python fournis une primitive chr(int) qui renvoie le caractères correspondant a l'argument donnée. Code :
Je comprend que 'i' désigne le code ASCII (ANSI ?) et que "i" désigne le caractère i mais avec les retours de fonctions ( gets(char s[]), getchar() ) ça s'embrouille un peu dans mon esprit. Par contre j'ai réussi a obtenir une entrée comparable avec scanf() pour mon problème de calcule qui fait: Code :
Citation:
Merci beaucoup pour vos réponses: j'ai bien été reçu dans la communauté C du site de forums de programmation francophone le plus génial qu'il soit.
__________________
Pour faire tes armes: Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant. Et sois toujours bien armé avant de te lancer. Le hasard ne sourit qu'aux gens préparés... Blog: http://3dcyberspace.unblog.fr/ Site: Sanctuaire cybernétique |
||||||||
|
00
|
|
|
#16 | |||||||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
__________________
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
|
|
|
#17 | |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 437 ![]() |
Citation:
Tu trouveras la description de la bibliothèque standard dans le chapitre 7
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
|
|
|
20
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() |
Plus d'infos à propos de RAND_MAX: Ce n'est pas modifiable. rand() retourne systématiquement une valeur compris entre 0 et le RAND_MAX du compilo, et c'est à toi qu'il appartient ensuite de la faire rentrer dans le moule que tu veux.
__________________
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. |
|
|
10
|
|
|
#19 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 220 ![]() |
oh, et pour la table ascii, il y a la classique "man ascii", qui est dans nos pages man
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
Copyright © 2000-2013 - www.developpez.com