C# Buffer Circulaire (tableau circulaire) [Résolu]

Signaler
Messages postés
3
Date d'inscription
mercredi 14 mai 2008
Statut
Membre
Dernière intervention
31 mai 2008
-
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
-
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

Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

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 !!!!!!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
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
*/
Messages postés
3
Date d'inscription
mercredi 14 mai 2008
Statut
Membre
Dernière intervention
31 mai 2008

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!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

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 !!!
~~~~~~~~~
Messages postés
3
Date d'inscription
mercredi 14 mai 2008
Statut
Membre
Dernière intervention
31 mai 2008

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!! =)