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

apelleti 3 Messages postés mercredi 14 mai 2008Date d'inscription 31 mai 2008 Dernière intervention - 27 mai 2008 à 11:57 - Dernière réponse : Liverion 296 Messages postés mardi 22 avril 2008Date d'inscription 18 août 2008 Dernière intervention
- 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.
Afficher la suite 

7 réponses

Répondre au sujet
Liverion 296 Messages postés mardi 22 avril 2008Date d'inscription 18 août 2008 Dernière intervention - 30 mai 2008 à 13:14
+3
Utile
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 !!!!!!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Liverion
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 31 mai 2008 à 14:46
+3
Utile
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
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 31 mai 2008 à 15:59
0
Utile
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
*/
Commenter la réponse de cs_coq
apelleti 3 Messages postés mercredi 14 mai 2008Date d'inscription 31 mai 2008 Dernière intervention - 31 mai 2008 à 22:12
0
Utile
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!
Commenter la réponse de apelleti
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 juin 2008 à 01:59
0
Utile
De rien.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Liverion 296 Messages postés mardi 22 avril 2008Date d'inscription 18 août 2008 Dernière intervention - 2 juin 2008 à 09:27
0
Utile
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 !!!
~~~~~~~~~
Commenter la réponse de Liverion
apelleti 3 Messages postés mercredi 14 mai 2008Date d'inscription 31 mai 2008 Dernière intervention - 30 mai 2008 à 19:03
-2
Utile
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!! =)
Commenter la réponse de apelleti

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.