Outils pour utilisateurs

Outils du site


fifo_objet

Ceci est une ancienne révision du document !


FIFOs et Programmation Orientée Objet

Programme à base de variables globales

main.cpp
#include <stdio.h>
 
#include <iostream>
using namespace std;
 
#include <QCoreApplication>
 
//initialisation faite directement
#define FIFO_SIZE 3
unsigned int fifo_size = FIFO_SIZE ;
unsigned int write_index = 0 ;
unsigned int read_index = 0 ;
unsigned int nb_available = 0 ;
char data[FIFO_SIZE] ;
 
//////////////////////////////////////////////////
////
/// \brief write_char_fifo
/// \param token : jeton a écrire dans la FIFO
/// \return 1 si valeur écrite dans la FIFO, 0 sinon
///
char write_char_fifo(const char token){
    if(nb_available >= fifo_size)
        return 0 ;  //FIFO PLEINE
    data[write_index] = token ;
    write_index++;
    if( write_index >= fifo_size)
        write_index = 0 ;
    nb_available++;
    return 1; //OK
}
//////////////////////////////////////////////////
///
/// \brief read_char_fifo
/// \param ptr_token : pointeur vers la zone mémoire dans laquelle ranger le jeton lu depuis la FIFO
/// \return  1 si valeur lue dans la FIFO, 0 sinon
///
char read_char_fifo( char * ptr_token){
    if( nb_available == 0)
        return 0; //FIFO VIDE
    *ptr_token=data[read_index];
    read_index ++;
    if( read_index >=  fifo_size)
        read_index = 0 ;
    nb_available--;
    return 1; //OK
}
//////////////////////////////////////////////////
int main(int argc, char *argv[])
{
 
    printf("salut les APP\r\n");
 
    cout << "Hello World!" << endl;
    /*write_char_fifo(5);
    write_char_fifo(1);
    write_char_fifo(7);*/
    for (int i=0;i<10;i++)
        if (write_char_fifo(i)==0)
           cout << "fifo pleine "<< endl;
 
    for (int i=0;i<10;i++){
        //rien n'empêche un utilisateur d'écrire
        //nb_available=5; //grosse bétise!
 
        char c;
        if (read_char_fifo(&c)!=0)
            cout << "donnée lue dans la fifo: " << +c << endl;
        else
            cout << "fifo vide "<< endl;
    }
    printf("fin\r\n");
}

Programme à base de structures

main2.cpp
#include <stdio.h>
 
#include <iostream>
using namespace std;
 
#include <QCoreApplication>
 
//initialisation faite directement
 
 
struct charFifo{
  char * data ;
  unsigned int fifo_size ;
  unsigned int write_index ;
  unsigned int read_index ;
  unsigned int nb_available ;
};
 
#define FIFO_SIZE1 3
char FifoBuffer[FIFO_SIZE1];
struct charFifo myFifo;    // la variable FIFO à utiliser
 
#define FIFO_SIZE2 4
char FifoBuffer2[FIFO_SIZE2];
struct charFifo myFifo2;
////////////////////////////////////////
////
/// \brief init_char_fifo
/// \param pf
/// \param buf
/// \param f_size
///
void init_char_fifo(struct charFifo * ptr_fif, char * buf, unsigned int f_size){
//(*ptr_fif).fifo_size=f_size;
ptr_fif->fifo_size=f_size;
ptr_fif->nb_available=0;
ptr_fif->write_index=0;
ptr_fif->read_index=0;
ptr_fif->data=buf;
 
}
 
//////////////////////////////////////////////////
////
/// \brief write_char_fifo
/// \ptr_fif : pointeur vers la fifo dans laquelle écrire
/// \param token : jeton a écrire dans la FIFO
/// \return 1 si valeur écrite dans la FIFO, 0 sinon
///
char write_char_fifo(struct charFifo * ptr_fif, const char token){
    if(ptr_fif->nb_available >= ptr_fif->fifo_size)
        return 0 ;  //FIFO PLEINE
    ptr_fif->data[ptr_fif->write_index] = token ;
    (ptr_fif->write_index)++;
    if( ptr_fif->write_index >= ptr_fif->fifo_size)
        ptr_fif->write_index = 0 ;
    ptr_fif->nb_available++;
    return 1; //OK
}
 
//////////////////////////////////////////////////
///
/// \brief read_char_fifo
/// \ptr_fif : pointeur vers la fifo dans laquelle écrire
/// \param ptr_token : pointeur vers la zone mémoire dans laquelle ranger le jeton lu depuis la FIFO
/// \return  1 si valeur lue dans la FIFO, 0 sinon
///
char read_char_fifo(struct charFifo * ptr_fif, char * ptr_token){
    if( ptr_fif->nb_available == 0)
        return 0; //FIFO VIDE
    *ptr_token=ptr_fif->data[ptr_fif->read_index];
    (ptr_fif->read_index )++;
    if( ptr_fif->read_index >=  ptr_fif->fifo_size)
        ptr_fif->read_index = 0 ;
    ptr_fif->nb_available--;
    return 1; //OK
}
//////////////////////////////////////////////////
int main(int argc, char *argv[])
{
 
    printf("salut les APP\r\n");
 
    char lu;
    init_char_fifo(&myFifo, FifoBuffer,  FIFO_SIZE1);
    read_char_fifo(&myFifo, &lu) ;
    write_char_fifo(&myFifo, 5) ;
    write_char_fifo(&myFifo, 8) ;
    read_char_fifo(&myFifo, &lu) ;
    write_char_fifo(&myFifo, 12) ;
    write_char_fifo(&myFifo, 1) ;
    write_char_fifo(&myFifo, 7) ;
    read_char_fifo(&myFifo, &lu) ;
    read_char_fifo(&myFifo, &lu) ;
    read_char_fifo(&myFifo, &lu) ;
    read_char_fifo(&myFifo, &lu) ;
 
}

Solution Question 2.5 du TD:

fifo_objet.1585237085.txt.gz · Dernière modification : 2020/03/26 16:38 de bvandepo