Пример #1
0
int main() {

	unsigned int germe ;	/* pour le generateur aleatoire */
	unsigned int nb_evenements ;
	unsigned int ratio ;
 	unsigned int x ;	/* valeur aleatoire */
	unsigned int i ; 	/* compteur d'evenements */
	unsigned int r, s ; 	/* numeros de requete */ 
	unsigned int p ;	/* numero d'imprimante */

	/* initialisation du generateur aleatoire */
	printf (" germe : ") ;
	scanf ("%d", &germe) ;
	init_alea(germe, 99) ; /* valeurs aleatoires entre 0 et 99 */

	/* lecture des parametres de la simulation */
	printf("\n nombre d'evenements a generer : ") ;
	scanf("%d", &nb_evenements) ;
	printf("\n Pourcentage de \"Requete d'impression\" (entre 0 et 100) : ") ;
	scanf("%d", &ratio) ;
	printf("\n") ;

	/* simulation */
	Initialiser() ;
	r = 0 ;

	for (i=0 ; i<nb_evenements ; i++) {
		x = suivant_alea() ;
		if (x+1>ratio) {
			if (! EstVide()) {
				p = suivant_alea() % P ;
				Extraire (&s, p) ;
				if (s!=-1)
					printf("traitement de la requete %d par l'imprimante %d\n", s, p) ;
			} else
				printf("\t file vide !\n") ;
		} else {
			if (! EstPlein()) {
				p = suivant_alea() % P ;
				printf("insertion de la requete %d pour l'imprimante %d\n", r, p) ;
				Inserer (r, p) ;
				r = r+1 ;
			} else
				printf("\t file pleine !\n") ;
		} ;
	} ;

	return 0 ;

}
/** **********************************************************************
* \fn void Decode_Trame_Brute (char *tab_recu_brut,char *Motdetat, char *Adeco,char *Optarif,
*    char *Isousc, char *Base, char *Hchc, char *Hchp,char *Ptec, char *Iinst, char *Imax,
*    char *Papp, char *Hhphc, char *Checksum, short *Statu_chcksm)
* \brief Décode et interprète l'étiquette \n
*   Retourne les valeurs des étiquettes correspondantes, le Cheksum
*    et la validité de la donnée
* \param [in] tab_recu_brut  Pointeur vers un tableau contenant la trame brute reçue du compteur
* \param [out] Motdetat   Pointeur vers un tableau contenant la valeur de Motdetat
* \param [out] Adeco   Pointeur vers un tableau contenant la valeur de Adeco
* \param [out] Optarif   Pointeur vers un tableau contenant la valeur de Optarif
* \param [out] Isousc   Pointeur vers un tableau contenant la valeur de Isousc
* \param [out] Base   Pointeur vers un tableau contenant la valeur de Base
* \param [out] Hchc   Pointeur vers un tableau contenant la valeur de Hchc
* \param [out] Hchp   Pointeur vers un tableau contenant la valeur de Hchp
* \param [out] Ptec   Pointeur vers un tableau contenant la valeur de Ptec
* \param [out] Iinst  Pointeur vers un tableau contenant la valeur de Iinst
* \param [out] Imax   Pointeur vers un tableau contenant la valeur de Imax
* \param [out] Papp   Pointeur vers un tableau contenant la valeur de Papp
* \param [out] Hhphc  Pointeur vers un tableau contenant la valeur de Hhphc
* \param [out] Checksum   Pointeur vers un tableau contenant la valeur de Checksum
* \param [out] Statu_chcksm   Pointeur vers un tableau contenant la valeur de Statu_chcksm
*************************************************************************/
void Decode_Trame_Brute (char *tab_recu_brut,char *Motdetat, char *Adeco,char *Optarif,char *Isousc,
                         char *Base, char *Hchc, char *Hchp,char *Ptec, char *Iinst, char *Imax,
                         char *Papp, char *Hhphc, char *Checksum, short *Statu_chcksm){
    int indice =0;
    int indice_deb=0;

    // Parcour du tab_recu_brut jusqu'à la fin
    while(tab_recu_brut[indice] != '\0'){
        // Identification de l'étiquette puis sauvegarde de la valeur
        indice_deb = indice;
        // MOTDETAT
        if (tab_recu_brut[indice] == 'M' && tab_recu_brut[indice+1] == 'O'){
            indice = Extraire (tab_recu_brut, indice, 9, Motdetat);
            Checksum[IND_MOTDETAT] = tab_recu_brut[indice];
            Statu_chcksm[IND_MOTDETAT] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
        }
        // ADECO
        else if (tab_recu_brut[indice] == 'A' && tab_recu_brut[indice+1] == 'D'){
            indice = Extraire (tab_recu_brut, indice, 5, Adeco);
            Checksum[IND_ADECO] = tab_recu_brut[indice];
            Statu_chcksm[IND_ADECO] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
        }
        // OPTARIF
        else if (tab_recu_brut[indice] == 'O' && tab_recu_brut[indice+1] == 'P'){
            indice = Extraire (tab_recu_brut, indice, 8, Optarif);
            Checksum[IND_OPTARIF] = tab_recu_brut[indice];
            Statu_chcksm[IND_OPTARIF] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
        }
        // BASE
        else if (tab_recu_brut[indice] == 'B' &&
                 tab_recu_brut[indice+1] == 'A'){
//&&             tab_recu_brut[indice+6] == '0'){
	    /** ****
	    * \bug	Suppression de la condition 
	    *	tab_recu_brut[indice+6] == '0'
	    *
	    ***********/
            indice = Extraire (tab_recu_brut, indice, 5, Base);
            Checksum[IND_BASE] = tab_recu_brut[indice];
            Statu_chcksm[IND_BASE] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
        }

        else if (tab_recu_brut[indice] == 'I'){
            switch (tab_recu_brut[indice+1]){
                // ISOUSC
                case 'S':
                    indice = Extraire (tab_recu_brut, indice, 7, Isousc);
                    Checksum[IND_ISOUSC] = tab_recu_brut[indice];
                    Statu_chcksm[IND_ISOUSC] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                // IINST
                case 'I':
                    indice = Extraire (tab_recu_brut, indice, 6, Iinst);
                    Checksum[IND_IINST] = tab_recu_brut[indice];
                    Statu_chcksm[IND_IINST] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                // IMAX
                case 'M':
                    indice = Extraire (tab_recu_brut, indice, 5, Imax);
                    Checksum[IND_IMAX] = tab_recu_brut[indice];
                    Statu_chcksm[IND_IMAX] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                default:
                    indice++;
            }
        }
        else if (tab_recu_brut[indice] == 'H'){
             switch (tab_recu_brut[indice+3]){
                 // HCHC
                 case 'C':
                    indice = Extraire (tab_recu_brut, indice, 5, Hchc);
                    Checksum[IND_HCHC] = tab_recu_brut[indice];
                    Statu_chcksm[IND_HCHC] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                 // HCHP
                 case 'P':
                    indice = Extraire (tab_recu_brut, indice, 5, Hchp);
                    Checksum[IND_HCHP] = tab_recu_brut[indice];
                    Statu_chcksm[IND_HCHP] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                // HHPHC
                case 'H':
                    indice = Extraire (tab_recu_brut, indice, 6, Hhphc);
                    Checksum[IND_HHPHC] = tab_recu_brut[indice];
                    Statu_chcksm[IND_HHPHC] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                default:
                    indice++;
             }
        }
        else if (tab_recu_brut[indice] == 'P'){
            switch (tab_recu_brut[indice+1]){
                // PTEC
                case 'T':
                    indice = Extraire (tab_recu_brut, indice, 5, Ptec);
                    Checksum[IND_PTEC] = tab_recu_brut[indice];
                    Statu_chcksm[IND_PTEC] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                // PAPP
                case 'A':
                    indice = Extraire (tab_recu_brut, indice, 5, Papp);
                    Checksum[IND_PAPP] = tab_recu_brut[indice];
                    Statu_chcksm[IND_PAPP] = Statu_Checksum(tab_recu_brut,indice_deb, indice);
                    break;
                default:
                    indice++;
            }
        }
        else{
            indice++;
        }
    }
}