C# Buffer Circulaire (tableau circulaire)

Résolu
apelleti Messages postés 3 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 31 mai 2008 - 27 mai 2008 à 11:57
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008 - 2 juin 2008 à 09:27
Bonjour à tous,
Je souhaiterais savoir si quelqu'un pourrait valider mon buffer et/ou m'indiquer les erreurs notables.

 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace BufferCirculaire
{
    class FIFO
    {
        privatebyte[] Buffer; //tableau d'octet simulant les registres d'un module.
 
        privateint NextRead = 0; // indice qui permet de connaitre la prochaine case du tableau à lire.
        privateint NextWrite = 0; // indice qui permet de connaitre la prochaine case du tableau à écrire.
 
        publicint NbRead = 0; // indice qui permet de connaitre le nombre d'octet pouvant encore etre lus.
        publicint NbWrite = 0; // indice qui permet de connaitre le nombre d'octet pouvant encore etre ecris.
 
 
        public FIFO()
        {//Constructeur : permet de créer un tableau de taille prédéfinis.
            Buffer = newbyte[1024];
            NbRead = 0;
            NbWrite = 1024;
        }
 
        public FIFO(int n)
        {//Constructeur : permet de créer un tableau de taille choisis.
            Buffer = newbyte[n];
            NbRead = 0;
            NbWrite = n;
        }
 
        publicvoid MargeNbRead()
        {
            if(NextWrite > NextRead)
                NbRead = NextWrite - NextRead;
 
            if(NextWrite < NextRead)
                NbRead =  NextRead - NextWrite;
        }
 
        publicvoid MargeNbWrite()
        {
            if(NextWrite > NextRead)
                NbWrite = Buffer.Length - NextWrite;
 
            if(NextWrite < NextRead)
                NbWrite = Buffer.Length - NextWrite ;
        }
 
        publicbool Write(byte[] WriteBuffer)//Ecriture dans un tableau d'octect, WriteBuffer = tableau à écrire.
        {
            MargeNbRead();
            MargeNbWrite();
            //Controle si assez de place dans Buffer
            if(NbWrite >= WriteBuffer.Length)
            {
 
                for(int i = 0; i < WriteBuffer.Length; i++)
                {
                    //Ecriture
                    Buffer[NextWrite] = WriteBuffer[i];
 
                    NextWrite++;
                    if(NextWrite == Buffer.Length)
                    {
                        //Fin du Buffer, retour à 0
                        NextWrite = 0;
                    }
                }
                returntrue;
            }
            else
            {
                System.Exception ew = new System.Exception("OverRun : Vous aller écrire sur des registres non lus.");
                throw ew;
            }
        }
 
        publicbyte[] Read(refbyte[] ReadBuffer, int index, int nread)// Lecture d'un tableau d'octet, nread = nombre de cases à lire.
        {
            MargeNbRead();
            MargeNbWrite();
            byte[] ReadBuff = newbyte[nread];
            if(NbRead >= nread)
            {
                if(index != nread)
                {
                    for(int i = 0; i < nread; i++)
                    {
                        //Lecture
                        ReadBuff[i] = ReadBuffer[index];
                        index++;
                        NextRead++;
                        if(NextRead == ReadBuffer.Length)
                        {
                            //Fin du Buffer, retour à 0
                            NextRead = 0;
                        }
                    }
                }
                return ReadBuff;
            }
            else
            {
                return(null);
                System.Exception er = new System.Exception("Vous aller lire sur des registres non écris.");
                throw er;
            }
        }
    }
}



Merci pour vos réponses.

7 réponses

Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
30 mai 2008 à 13:14
Tu as un probleme quelque part dans ton code ? Je comprends pas la question ...

Les trois lois de Codes-Sources :
1) Tu lis et respecte le reglement
2) Tu pense a valider si une reponse apportée a ton probleme t'a aidé
3) Si tu ne respecte pas les 2 premières .......................... TU SORS !!!!!!
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mai 2008 à 14:46
apelleti => on se calme... il demandait des précisions..., et les 4 dernières lignes de son post font partie de sa signature, pas de sa réponse à ta question...

Liverion => tu as peut être intérêt à mettre un ptit séparateur en haut de ta signature ^^

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mai 2008 à 15:59
Rapidement, concernant le code en lui même sans rentrer dans les détails :
- NbRead et NbWrite sont des champs public (accessibles en lecture/écriture donc) là où me semble t'il un accès de l'extérieur nécessite plutôt d'être en lecture seule => propriété en lecture seule (get)
- Commentaires descriptifs des membres : n'oublies pas que tu peux utiliser des tags de documentation (/// au dessus des membres), ce qui présentent quelques avantages comme la génération de documentation et l'aide contextuelle lors de l'utilisation de la classe
- Méthodes Read/Write : Il est déconseillé de lever une exception générique de type System.Exception, au besoin crée en une
- Méthode Read : la levée d'exception derrière le return null ne sert à rien car ne sera jamais executée
- Méthode Read : utiliser à la fois un paramètre en ref et le retour de la fonction pour apparemment la même chose (vu de l'extérieur) peut être déroutant pour l'utilisateur. Surtout que dans les faits il peut y avoir une différence => les tags de documentation sont encore plus importants ici
- Tu ne vérifies pas les entrées : exemple je peux passer une valeur négative au constructeur, ou une valeur très grande.

/*
coq
MVP Visual C#
CoqBlog
*/
0
apelleti Messages postés 3 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 31 mai 2008
31 mai 2008 à 22:12
Désolé si j'ai été un peu agressif, j'en suis désolé!
Je te remercie beaucoup pour ton aider, en effet il y a quelques chose incohérent maintenant que tu me le dis!
Merci encore!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 juin 2008 à 01:59
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
2 juin 2008 à 09:27
Oui désolé si tu as mal compris ma remarque, je me demandais exactement où se situaient les soucis dans ton code en fait, et "Je souhaiterais savoir si quelqu'un pourrait valider mon buffer et/ou m'indiquer les erreurs notables" me parraissait un peu vague. Signature modifiée pour eviter toute incompréhension  :D

~~~~~~~~~
Les trois lois de Codes-Sources :
1) Tu lis et respecte le reglement
2) Tu pense a valider si une reponse apportée a ton probleme t'a aidé
3) Si tu ne respecte pas les 2 premières ....TU SORS !!!
~~~~~~~~~
0
apelleti Messages postés 3 Date d'inscription mercredi 14 mai 2008 Statut Membre Dernière intervention 31 mai 2008
30 mai 2008 à 19:03
Tu est vraiment super utile comme mec!
Si je met mon code ici, c'est peu etre parce que j'ai une erreur!
Si j'aivais eu des réponse je l'ai aurais validé mais c'était pas le cas!
Alors si tu peux m'aider merci, mais pour mettre des post comme ça, ca sert a rien!

PS : Mon code marche finalement, j'ai plus besoin d'aider! Aussi je penserais a validé ta réponse, t'inquiète!! =)
-2
Rejoignez-nous