TutorielsVous débutez ? C'est ici qu'on commence !
Mon compte
Recherche
Livre d'or
PublicitéVous devez être inscrit pour pouvoir poster des messages
| Page : 1 2 3 4 5 6 7 8 Suivante | |||||||||||||||||||||||
| Auteur | Message | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 visiteur sur ce sujet (1 anonyme) | |||||||||||||||||||||||
| Page : 1 2 3 4 5 6 7 8 Suivante | |||||||||||||||||||||||
Jaloyan1
|
# Posté le 21/04/2008 à 19:45:28 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
Bonjour, c'est en lisant un livre enfin une partition intéressante je dois dire(symphonie n°9 de Dvorak 4eme mouvement)
qu'il m'est venu cette idée. Peut être que ce topic est mal placé, et qu'il serait mieux en tutoriel, si c'est le cas, merci de me le signaler. Eh oui! Un bibliothèque en C pour les nouveaux et les anciens. Ca vous évitera de coder vous même 50 fois la même fonction qui peut être très utile. -Cette bibliothèque sera faite obligatoirement en C89 ou C90 car tout le monde n'a pas la norme C99 -Un manuel sera fourni avec chaque fonction pour expliquer comment cela fonctionne. Tout le monde peut participer pour créer la bibliothèque des zeros.Il suffit juste que ca serve a quelque chose et que l'idée soit bonne. Si vous prenez une fonction sur le net et vous voudriez nous la présenter, merci de citer la source. J'actualiserai assez souvent cette bibliothèque. Je construit la première brique de cet édifice avec ces 4 fonctions + une en prime. Elles permettent de convertir une chaine en majuscules/minuscules et 2 autres pour faire la même chose en calculant le nombre de caractères convertis. La dernière initialise une chaine de caractère a 0. Code : C - zstring.h
Code : C - zstring.c
![]() Gestion de chaines de caracteres transformations de chainesstoupperCode : C - prototype
Elle s'utilise assez facilement, son nom venant de toupper qui est une fonction qui permet de transformer un seul caractère en majuscule,s voulant dire string(chaine). stoupper, prend en paramètre un pointeur qui peut être comme dit dans le tutoriel de mateo21, le nom de la chaine sans ses crochets. Elle revoit une 0 si tout s'est bien passé, et 0 si il y a un problème. On peut directement utiliser la chaine sans la stocker.Ce petit programme vous permettra surement de comprendre. Code : C
resultat : Code : Console
stolowerCode : C - prototype
C'est la même fonction que stoupper a la seule différence que au lieu de convertir en majuscules, elle convertit tout en minuscules. stouppercalcCode : C - prototype
Cette fonction, nécessite absolument la fonction stoupper. Elle renvoie un int, qui est le nombre de caractères convertis,si la chaine est invalide, elle renvoie une valeur négative. La chaine ne doit pas dépasser 50000 caractères de long. la,c'est pareil, vous envoyez un tableau de char, vous faites comme si c'était un pointeur. Je ne vous mettrai pas le tout, mais juste le main. Code : C
Code : Console - résultat
stolowercalcCode : C - prototype
Cette fonction est pareille, sauf qu'elle nécessite stolower cette fois ci. Elle transforme une chaine en minuscules et elle calcule le nombre de caractères transformés. Je ne vais pas refaire l'exemple cette fois ci. De même que pour son inverse, la chaine ne doit pas faire plus de 50000 caractères de long. Initialisation de chainessinitatzeroCode : C - prototype
Cette fonction, initialise une chaine de caractères a 0. Elle se manie comme stoupper ou stolower. Elle renvoi une valeur négative en cas d'erreur. Elle manie directement la chaine. Il n'y a aucune limite de longueur de votre chaine. Voila pour l'instant ce que contient cette bibliothèque. A vous de la remplir.De temps en temps, je mettrais une ou deux fonction. Bonne chance tout le monde et bonne lecture! N'oubliez pas de me donner vos avis sur cette idée qui est euh... Je sais pas a vous de le dire. Comme ca, on évitera de coder 100 fois la même fonction.
Édité
le 22/04/2008 à 09:50:26
par Jaloyan1
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
-ed-
|
# Posté le 21/04/2008 à 19:58:51 | ||||||||||||||||||||||
C is a sharp tool![]() Groupe : Membres |
Citation : Jaloyan1
Code : C
Attention. Les fonctions de <ctype.h> attendent une valeur non signée. Il faut donc un cast explicite, car un char peut être signé ou non : Code : C
Citation : Pas de titre Code : C
Ca c'est horrible. Pourquoi 5000 ? Pourquoi parcourir la chaine 2 fois ? Il suffit de modifier intelligemment stoupper() pour faire le boulot : Code : C
Ne pas oublier de faire un test unitaire sérieux qui passe les cas tordus en revue... Je te laisse faire la doc de la fonction (ce qui aurait du être fait avant de la coder ...)
Édité
le 21/04/2008 à 21:40:34
par -ed-
Emmanuel Delahaye. ![]() Des infos sur la programmation et le langage C: http://bien-programmer.blogspot.com/ http://mapage.noos.fr/emdel/ |
||||||||||||||||||||||
Jaloyan1
|
# Posté le 21/04/2008 à 20:19:05 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
oups petite erreur de ma part, c'est la meme chose. je voulais dire C99 je sais pas pourquoi j'ai dit ca.
Pardon ,toutes mes excuses.
Édité
le 21/04/2008 à 20:19:52
par Jaloyan1
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
The Whiplash
|
# Posté le 21/04/2008 à 20:27:02 | ||||||||||||||||||||||
![]() Groupe : Membres |
Je trouve que c'est une bonne initiative même si les fonctions que tu as codé sont pas très belles... (indentations etc...) et pas très utiles (mais bon ca peut toujours servir hein !).
Il faudrait également que les codes soient contrôlés quand même, un buffer overflow est si vite arrivé. J'essayerai d'envoyer quelque truc des que j'ai le temps (vivement le week end de 5jours...) The Whiplash "Savoir par coeur n'est pas savoir". Montaigne. ![]() |
||||||||||||||||||||||
Jaloyan1
|
# Posté le 21/04/2008 à 20:45:47 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
oui ,je sais que c'est pas très joli, mais je trouve que ce genre de fonction peut souvent venir, tout convertir en majuscules etc etc...
Je vais essayer de corriger mais je ne comprends pas en quoi il y a buffer overflow. Pour les améliorations a faire, vous pouvez aussi me contacter par mp. Perso, je sais j'explique mal, mais bon, je fais comme je peux, je suis ouvert a toute critique et suggestions. Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
tc
|
# Posté le 21/04/2008 à 20:58:50 | ||||||||||||||||||||||
Readability counts![]() Groupe : Membres |
Cette réponse a aidé l'auteur du sujetPour l'organisation de ta bibliothèque, je pense qu'il serait préférable de regrouper les fonctions ayant un lien dans des unités de compilations séparées. Utiliser zeros.h et zeros.c comme fichiers "fourre-tout" nuit à la clareté du code et pourrait, à long terme, rendre la maintenance du code difficile. Si je devais me servir des fonctions de ta bibliothèques, je m'attendrais à trouver un peu de programmation defensive (on teste les codes d'erreurs renvoyés par les fonctions standards utilisées et on teste la validité des argument (implantation sommaire de la notion de contrat)): Code : C
Pour les fonctions liées au travail sur les chaines, j'utiliserais les fichiers zstring.h et zstring.c. Pour les fonctions d'entree/sortie, zio.h et zio.c. Etc. Thierry
Édité
le 21/04/2008 à 21:08:23
par tc
"We read Knuth so you don't have to." - Tim Peters (in Python Cookbook) | FAQ-Python | FAQ-C - FAQ-c.l.c | FAQ-C++ - FAQ-Lite | |
||||||||||||||||||||||
aiii
|
# Posté le 21/04/2008 à 21:43:16 | ||||||||||||||||||||||
Je pars du 31 jui au 15 aou![]() Groupe : Membres |
Je trouve que c'est une idée très intéressante
Pourquoi ne pas commencer par les fonctions permettant la saisie sécurisée de chaînes ? Je pars du 31 juillet au 15. Désolé pour ce nouveau départ imprévu. |
||||||||||||||||||||||
noob4ever
|
# Posté le 21/04/2008 à 21:55:52 | ||||||||||||||||||||||
.NETeu boutoneu :) ![]() Groupe : Membres |
Citation : aiii
Je trouve que c'est une idée très intéressante Pourquoi ne pas commencer par les fonctions permettant la saisie sécurisée de chaînes ? Le but c'est pas de re-écrire la lib standard hein ? |
||||||||||||||||||||||
corentin1234
|
# Posté le 21/04/2008 à 22:00:34 | ||||||||||||||||||||||
![]() Groupe : Membres |
Code : C
Ce code n'est pas de moi, mais il est très facile à comprendre. Pour lire les entrées utilisateurs, il suffit de lui passer stdin comme paramètre.
Édité
le 21/04/2008 à 22:03:37
par corentin1234
|
||||||||||||||||||||||
aiii
|
# Posté le 21/04/2008 à 22:01:15 | ||||||||||||||||||||||
Je pars du 31 jui au 15 aou![]() Groupe : Membres |
Je me suis mal exprimé. Je voulais parler de fonctions permettant de "nettoyer" la saisie de texte grâce à fgets.
ex: vider stdin Je pars du 31 juillet au 15. Désolé pour ce nouveau départ imprévu. |
||||||||||||||||||||||
sharky.fr
|
# Posté le 21/04/2008 à 22:11:48 | ||||||||||||||||||||||
DIY![]() Groupe : Membres |
Cette réponse a aidé l'auteur du sujetJe trouve que c'est une idée très intéressante Pourquoi ne pas commencer par les fonctions permettant la saisie sécurisée de chaînes ? Voir ici module IO. --- Voici une fonction permettant de lire une ligne. NOTE : s_malloc s_realloc sont simplement des wrappers de malloc et realloc. Ils peuvent aisément être remplacer par une vérification du retour de ces fonctions. ES.h Code : C
ES.c Code : C
EDIT: orthographe :$ EDIT2: modification du code. `c` devient un `int` car `fgetc` renvoie un `int`... rajout d'un cast.
Édité
le 23/04/2008 à 17:17:38
par sharky.fr
![]() |
||||||||||||||||||||||
SirJulio
|
# Posté le 22/04/2008 à 04:18:05 | ||||||||||||||||||||||
|
Groupe : Membres |
@Sharky.fr
Tu ne devrais pas realloc à chaque tour de boucle, double plutot la taille quand il le faut et teste la capacité restante à chaque tour, ca serait bien plus efficace sur de grosses chaines. =) |
||||||||||||||||||||||
Jaloyan1
|
# Posté le 22/04/2008 à 08:15:36 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
Citation : tc
Si tu codes en C90, n'utilise pas les commentaires de fin de ligne à la C++. L'usage de // pour les commentaires n'est en effet défini qu'en C99. Remplace par /*...*/. Pour l'organisation de ta bibliothèque, je pense qu'il serait préférable de regrouper les fonctions ayant un lien dans des unités de compilations séparées. Utiliser zeros.h et zeros.c comme fichiers "fourre-tout" nuit à la clareté du code et pourrait, à long terme, rendre la maintenance du code difficile. Si je devais me servir des fonctions de ta bibliothèques, je m'attendrais à trouver un peu de programmation defensive (on teste les codes d'erreurs renvoyés par les fonctions standards utilisées et on teste la validité des argument (implantation sommaire de la notion de contrat)): Code : C
Pour les fonctions liées au travail sur les chaines, j'utiliserais les fichiers zstring.h et zstring.c. Pour les fonctions d'entree/sortie, zio.h et zio.c. Etc. Thierry Les commentaires fonctionnent sur code blocks qui est en C90. Bon update acceptée. Je reformule mes deux chaines. Je vais essayer de créer une doc en ligne sur un tuto peut etre ou quelque chose d'autre. Je vais formuler le début ici, pendant que je formulerai sur un big tuto. EDIT : j'ai modifié le début avec succès, j'ai même modifié un peu l'enum. Car si c'était des valeurs positives, on pouvait les confondre avec le nombre de caractères retournés. J'ai pas encore lu les autres posts, je m'y mets dès maintenant. ed : ta methode me semble beaucoup trop compliquée.
Édité
le 22/04/2008 à 08:34:54
par Jaloyan1
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
rz0
|
# Posté le 22/04/2008 à 08:30:20 | ||||||||||||||||||||||
meuh![]() Groupe : Membres |
Citation : Jaloyan1
Les commentaires fonctionnent sur code blocks qui est en C90. Code::Blocks n'est pas la norme. Si tu dis « on fait du C89 », il faut t'y tenir.
|
||||||||||||||||||||||
Jaloyan1
|
# Posté le 22/04/2008 à 08:46:27 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
Citation : sharky.fr
Citation : aiii Je trouve que c'est une idée très intéressante Pourquoi ne pas commencer par les fonctions permettant la saisie sécurisée de chaînes ? Voir ici module IO. --- Voici une fonction permettant de lire une ligne. NOTE : s_malloc s_realloc sont simplement des wrappers de malloc et realloc. Ils peuvent aisément être remplacer par une vérification du retour de ces fonctions. ES.h Code : C
ES.c Code : C
je n'ai pas très bien compris ton code, on peut très bien le faire avec fgets. Peut tu apporter plus de précisions pour que je puisse faire la doc, je n'ai pas compris a quoi elle sert cette fonction. Comment elle fonctionne? Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
1337833K
|
# Posté le 22/04/2008 à 08:51:27 | ||||||||||||||||||||||
|
fgsfds Groupe : Membres |
Citation : Jaloyan1
Peut tu apporter plus de précisions pour que je puisse faire la doc, je n'ai pas compris a quoi elle sert cette fonction. Comment elle fonctionne? Elle alloue un buffer, puis lit une ligne entière et agrandit le buffer si besoin, et renvoie un pointeur sur le buffer. En (très) très gros, c'est une lecture d'une chaine (théoriquement seulement) infinie. |
||||||||||||||||||||||
Jaloyan1
|
# Posté le 22/04/2008 à 09:05:56 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
et l'interet par rapport aux autres fonctions?
Je n'ai toujours pas compris quel est l'interet de cette fonction, elle permet de faire a peu la meme chose que fgets sauf que c'est infini sa taille ou alors c'est autre chose? Pour eviter d'inonder le sujet, vous pouvez si vous le voulez me contacter par mp. Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
-ed-
|
# Posté le 22/04/2008 à 09:11:04 | ||||||||||||||||||||||
C is a sharp tool![]() Groupe : Membres |
Citation : Jaloyan1
Citation : tc Si tu codes en C90, n'utilise pas les commentaires de fin de ligne à la C++. L'usage de // pour les commentaires n'est en effet défini qu'en C99. Remplace par /*...*/. Les commentaires fonctionnent sur code blocks qui est en C90. Euh, tu contestes la norme ? Si MinGW (peu importe l'IDE qui est au-dessus) accepte les commentaires //, c'est parce que par défaut, il fonctionne dans un mode étendu qui ajoute des fonctionnalités au C90 de base. Pour se limiter au C90 strict, il faut activer les flags -ansi et -pedantic Là, tu verras que ce style de commentaire ne passe plus. Citation : Pas de titre ed : ta methode me semble beaucoup trop compliquée. Tu parles de quoi ? Du codage de stoupper() ? En quoi est-ce compliqué ? De toutes façons, tes 'impressions' importent peu. Ce qui compte, pour une bibliothèque de fonctions, c'est que le code soit correctement codé et testé. On doit pouvoir utiliser les fonctions dans toutes les conditions sans que ça casse. Si tu as une méthode plus simple à proposer, on t'écoute. Au fait, on attend toujours la spécification précise des fonctions... Citation : Pas de titre et l'interet par rapport aux autres fonctions? C'est qu'on a plus à gérer la taille, c'est automatique. Il faut juste penser à libérer le bloc après usage (free()). COmme beaucoup qui on traité ce problème, j'ai aussi fait une fonction de ce style dans ma bibliothèque CLIB/ED, module IO, fonction get_line(). Code : C
Édité
le 22/04/2008 à 09:24:01
par -ed-
Emmanuel Delahaye. ![]() Des infos sur la programmation et le langage C: http://bien-programmer.blogspot.com/ http://mapage.noos.fr/emdel/ |
||||||||||||||||||||||
Jaloyan1
|
# Posté le 22/04/2008 à 09:22:52 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
ok mais il faut que vous m'expliquiez un peu a quoi ca sert ces fonctions, comment elles fonctionnent.
J'avais constaté un gros bug dans les fonctions, j'ai corrigé immédiatement. ed tu peux m'expliquer comment ca fonctionne ton code? De toutes manières, j'avais pensé a une idée mais bon je ne sais pas si elle peut marcher. EDIT : je suis en train de commencer a rédiger les tutos et les fichiers pour les stockers dans des dossiers de la zerolib. Une fois la zerolib terminée, il va falloir une personne qui puisse heberger tout cela sur le site du zero ou autre part. Voila. Je vais updater plus rarement ici. Car 3 trucs en meme temps, ca va etre dur mais ne vous en faites pas, je vous lacherais pas. j'ai une question, quelle est le 2eme paramètre de la fonction? Aussi, je vais la renommer car le nom a l'air un peu bizarre.
Édité
le 22/04/2008 à 13:09:04
par Jaloyan1
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. ![]() ![]() ![]() Chef du fan club de jaloyan1 |
||||||||||||||||||||||
sharky.fr
|
# Posté le 22/04/2008 à 15:15:33 | ||||||||||||||||||||||
DIY![]() Groupe : Membres |
Citation : SirJulio
@Sharky.fr Tu ne devrais pas realloc à chaque tour de boucle, double plutot la taille quand il le faut et teste la capacité restante à chaque tour, ca serait bien plus efficace sur de grosses chaines. =) Oui j'y ai pensé de nombreuses fois mais après avoir testé le code je me demande si c'est bien nécessaire :
Après.. j'avoue ne pas avoir la moindre idée de comment effectuer des tests unitaires et/ou de performance. EDIT: coquille
Édité
le 22/04/2008 à 15:23:39
par sharky.fr
![]() |
||||||||||||||||||||||
-ed-
|
# Posté le 22/04/2008 à 15:23:13 | ||||||||||||||||||||||
C is a sharp tool![]() Groupe : Membres |
Citation : Jaloyan1
ed tu peux m'expliquer comment ca fonctionne ton code? Je ne sais pas de quoi tu parles... Il faut citer sinon, on y comprend rien. Citation : sharky.fr j'avoue ne pas avoir la moindre idée de comment effectuer des tests unitaires J'ai pourtant donné un exemple avec stoupper()...
Édité
le 22/04/2008 à 15:25:55
par -ed-
Emmanuel Delahaye. ![]() Des infos sur la programmation et le langage C: http://bien-programmer.blogspot.com/ http://mapage.noos.fr/emdel/ |
||||||||||||||||||||||
Gambit2099
|
# Posté le 22/04/2008 à 15:28:21 | ||||||||||||||||||||||
|
Crow never dies... Groupe : Membres |
A quoi bon réinventer la roue si ça n'apporte rien de nouveau ?
|
||||||||||||||||||||||
Jaloyan1
|
# Posté le 22/04/2008 à 15:52:57 | ||||||||||||||||||||||
Choisir = se priver du reste.![]() Groupe : Membres |
Citation : sharky.fr Citation : aiii Je trouve que c'est une idée très intéressante Pourquoi ne pas commencer par les fonctions permettant la saisie sécurisée de chaînes ? Voir ici module IO. --- Voici une fonction permettant de lire une ligne. NOTE : s_malloc s_realloc sont simplement des wrappers de malloc et realloc. Ils peuvent aisément être remplacer par une vérification du retour de ces fonctions. ES.h Code : C
| ||||||||||||||||||||||
