BUFFER CIRCULAIRE

cs_erazor Messages postés 85 Date d'inscription jeudi 7 février 2002 Statut Membre Dernière intervention 8 février 2007 - 8 févr. 2007 à 08:22
alex2229 Messages postés 4 Date d'inscription mercredi 16 juin 2010 Statut Membre Dernière intervention 10 janvier 2012 - 29 juin 2010 à 10:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41402-buffer-circulaire

alex2229 Messages postés 4 Date d'inscription mercredi 16 juin 2010 Statut Membre Dernière intervention 10 janvier 2012
29 juin 2010 à 10:38
Bonjour,
je dois également réaliser un buffer circulaire pour transférer des échantillons sonores
Je vais essayer de tester ton code et surtout de le modifier pour mon application mais je ne promets rien.
Tcho.
Utilisateur anonyme
21 déc. 2007 à 19:40
En fait cette source a surtout pour effet de démontrer l'utilisation des pointeurs. Vu que les pointeurs ne sont pas simples d'utilisation.
diabolo38 Messages postés 1 Date d'inscription vendredi 12 octobre 2007 Statut Membre Dernière intervention 21 décembre 2007
21 déc. 2007 à 14:02
Pas intuitif les params pour open de CIRC la taille alouee n'est pas le nombre d'element dans ton buffer circulaire qui est taille - sizeof(CRIC)
Tu as en plus un petit bug si taile est < sizeof(CRIC).
Danc ce dernier cas tu n'as pas de place pour le stockage des donnees, tes pointeur de control vont aussi se telescper pour ne pas dire se mordre la queues :)
Autre detail sur l'open circ elle devrais retourner NULL en cas d'ehec pas EOF qui est un pointeur valid.

Perso je preffere gere un buffer circulaire via index (ou offset c'est idem) plutot que les pointeurs c'est surtourt pour eliminer les if dans la manipulation des pointeur sur entree sortie de donnes et le test de rebouclage typiquement
Buffer[In]=Data
In= (In+1)%TailleBufer
Si tu choisi TailleBuffer 2^N alors le modulo se limite a un '&'(2^N -1) encore plus rapide que les modulo ... ex N8
Buffer[In++]=Data;
In&=0xFF;

Dans un souci de perf comme la gestion d'une fifo sur interrupt cela peu avoir son importance...
Utilisateur anonyme
12 févr. 2007 à 14:50
Pas mal ton analyse. Je pense que tu as l'habitude d'en faire. Je veux juste préciser quelques choses. La fin du buffer est marqué par le pointeur fin. On positionne le pointeur debut au debut, le nom me semble assez explicite, et le pointeur fin ben à la fin.

Aussi, le buffer est un buffer circulaire, ceux qui veut dire en d'autre terme qu'il n'as pas de fin, en fait le pointeur fin sert à indiquer à la fonction qu'il faut retourner au debut et en aucun cas de lui indiquer que le buffer est plein. le buffer est plein que quand le consommateur une mémoire avant le producteur. Le mot circulaire est très important dans l'interprétation de la source.

Merci de critiquer ma source. Si elle te plait pas personne ne t'interdit de créer la tienne et de la poster sur le site. Cette source et la comme exemple, si une personne veut l'utiliser pour gérer du son c'est son droit. Elle aura déjà les base. Je le répète encore une fois cette source est là pour montrer le fonctionnement des buffer circulaire. La personne qui est interessé la récupère et la modifie à sa convenance. Toi si t'en a pas besoin va voir ailleur. Si ton but est de rabaisser les autres je crois que tu n'a rien a foutre ici. Ha oui en fait les .h j'en déclare plusieurs pour la simple raison que si j'ai besoin d'autre fonction je me fais pas chier à les déclarer.

A oui pour finir ton int get_circ(CIRC *B, int * dest); est inutile dans cette source. Ca compliquerait la compréhension des buffers.
cs_Clem Messages postés 282 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 12 février 2007
12 févr. 2007 à 11:41
juste les deux choses qui m'ont parues les plus gênantes dans l'introduction :
"Etonnant pourtant" le lecteur n'est pas tenu de savoir qu'il faut une pause entre ces deux mots quand il lit.
"mais en le principe" il semble manquer le mot "fait"

mais après tout on est pas là pour juger ton Français, plus le code.
j'ai d'ailleurs une chose de plus à noter à ce niveau, puisque je viens seulement de remarquer que tu utilise ton consommateur et ton producteur pour déterminer la 'fin' du buffer, mais pourtant tu utilise la valeur EOF dans tes fonctions pour laisser à l'utilisateur la possibilité de savoir quand le buffer est finit.
Mais et si jamais l'utilisateur voulait créer un buffer circulaire, pour gérer du son comme c'est souvent le cas dans ce type de tampons ? La donnée du son et bien souvent une valeur arbitraire, pouvant contenir la valeur de EOF justement!
En résumé, quelqu'un utilisant ce code tel quel et gérant un tampon de son, peut de façon aléatoire voir son programme déconner puisque il pourrait croire que le tampon serait finit sans qu'il le soit, soit une perte de données.
Pourquoi n'utilise pas plutôt un modèle de fonction get, dont l'entête serait plutôt :
int get_circ(CIRC *B, int * dest);

Et à la place de renvoyer la valeur, renverrait le status (0 en cas de réussite, 1 en cas d'echec par exemple), et prendrait en argument de sortie 'dest', l'octet à lire.
Rien ne changerait du côté de la fonction put, juste ses valeurs de retour, et ce n'est pas plus compliqué puisque la structure s'y prête déjà. Et après tout cela tu pourras commencer à juger le code source comme de niveau "intermédiaire" (il est très éloigné des codes experts que l'on peut trouver sur ce site)

Pour les commentaires, si je le reproche c'est parce que j'ai moi aussi la mauvaise habitude de ne pas en faire, mais comme tout programmeur, on sait que "plus-tard" se résume bien souvent à jamais.
Ah et les .h, évites aussi d'inclure sans savoir ceux que tu connais, ça fait un peu "tâche" dans un code source. Normalement, stdio.h et stdlib.h devraient te suffirent.

En espérant pouvoir noter en remontant la moyenne de cette source.
Utilisateur anonyme
11 févr. 2007 à 22:34
Je sais quil manque des commentaires, mais par contre je vois pas ou il manque des points ni des points virgules. en plus ma source a été compilé sans erreur. le malloc je l'avoue c'est une mauvaise habitude. Et pour conclur je n'ai pas eu le temps de faire les commentaires je comptais les faire par la suite mais j'ai pas que ça à faire. désolé
cs_Clem Messages postés 282 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 12 février 2007
11 févr. 2007 à 17:32
Je confirme ce que erazor dit, les commentaires sont clairement trop peux nombreux surtout qu'il n'est pas difficile de commenter un code aussi court. Tu aurais pu expliquer au moins le principe, ce que tu entends par consommateur et par producteur. Sans parler du fait que la description est à relire avant de poster une news, car ici elle ne comporte pas que des fautes, mais des manques de virgules, des points et le pire des mots.

Et puis, c'est bien beau le malloc, mais les free ils sont passés où ? Le C n'a jamais eu de garbage collector et je ne sais vraiment pas d'où vient cette mauvaise manie de ne jamais désallouer la mémoire allouée!
cs_erazor Messages postés 85 Date d'inscription jeudi 7 février 2002 Statut Membre Dernière intervention 8 février 2007
8 févr. 2007 à 08:22
Un peu léger en commentaires je trouve, cela rend encore moins simple la comprehension.
Rejoignez-nous