/*************************************************************************************************************************************/ /* */ /* E X T R A C T I O N D E V A L E U R S D ' U N F I C H I E R N U M E R I Q U E : */ /* */ /* */ /* Author of '$xrv/un_sur_N.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1997??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20160222 \ FAUX \ /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20160222090648... */ #define AVERTIR_SI_LA_TAILLE_DES_PAQUETS_NE_DIVISE_PAS_LA_TAILLE_DU_FICHIER \ VRAI \ /* Pour supprimer ce message ('v $xiMo/LOG_xiMc$Z avertir=', introduit le 20040728183434). */ #define TAILLE_DES_PAQUETS \ UN \ /* Nombre d'elements a regrouper pour le calcul de ce qui sera edite. */ #define NOMBRE_DE_PAQUETS \ ZERO \ /* Nombre de paquets a creer. A priori, une valeur 'ZERO' indique que c'est la taille */ \ /* des paquets qui l'emporte. Par contre une autre valeur provoque le calcul de la taille */ \ /* des paquets en tant que rapport entre la taille du fichier et le nombre de paquets. */ \ /* Ceci a ete introduit le 20160222130137... */ #define EDITER_LES_MESSAGES_D_EN_TETE \ VRAI \ /* Controle de l'edition. */ #define EDITER_LE_MINIMUM________ \ FAUX #define EDITER_LE_MAXIMUM________ \ FAUX #define EDITER_LE_PREMIER________ \ VRAI #define EDITER_LE_DERNIER________ \ FAUX #define EDITER_LA_MOYENNE________ \ FAUX #define EDITER_LE_CUMUL__________ \ FAUX #define EDITER_L_ELEMENT_VARIABLE \ FAUX #define NUMERO_DE_L_ELEMENT_VARIABLE \ PREMIER_ELEMENT_D_UN_PAQUET /* Parametres de choix de ce qui sera edite. La possibilite d'editer un element de numero */ /* donne dans un paquet a ete introduit le 20081110130005... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" /* Passage a l'allocation dynamique le 20060214194148... */ #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define VALEUR_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_des_valeurs,liste_des_valeurs); /* Definition en memoire du fichier. */ #define ELEMENT_DU_FICHIER(index) \ gELEMENT_DU_FICHIER(liste_des_valeurs,index) \ /* Acces a un element courant du fichier. */ #define PREMIER_ELEMENT_D_UN_PAQUET \ PREMIER_ELEMENT_D_UN_FICHIER \ /* Numero du premier element d'un paquet. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E D I T I O N D ' U N E V A L E U R : */ /* */ /*************************************************************************************************************************************/ #define EDITION_D_UNE_VALEUR_CALCULEE(editer_la_valeur_courante,valeur,titre,IL_FAUT_editer_une_valeur_precedente) \ Bblock \ Test(IL_FAUT(editer_la_valeur_courante)) \ Bblock \ Test(IL_FAUT_editer_une_valeur_precedente) \ Bblock \ CAL2(Prin0(" ")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(editer_les_messages_d_en_tete)) \ Bblock \ CAL2(Prin1("%s",titre)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur); \ /* La procedure 'EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(...)' a ete introduite ici le */ \ /* 20030929092314 en remplacement de la sequence de code equivalente... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition d'une valeur... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X T R A C T I O N D E V A L E U R S D ' U N F I C H I E R N U M E R I Q U E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(compatibilite_20160222,COMPATIBILITE_20160222)); /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20160222090648... */ #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Logical,INIT(avertir_si_la_taille_des_paquets_ne_divise_pas_la_taille_du_fichier ,AVERTIR_SI_LA_TAILLE_DES_PAQUETS_NE_DIVISE_PAS_LA_TAILLE_DU_FICHIER ) ); /* Pour supprimer ce message ('v $xiMo/LOG_xiMc$Z avertir=', introduit le 20040728183434). */ DEFV(Int,INIT(taille_des_paquets,TAILLE_DES_PAQUETS)); DEFV(Int,INIT(taille_effective_des_paquets,ZERO)); /* Nombre d'elements a regrouper pour le calcul de ce qui sera edite. La notion de taille */ /* effective a ete introduite le 20160222085915 afin de permettre a la taille du fichier de */ /* ne plus diviser la taille du fichier... */ DEFV(Int,INIT(nombre_de_paquets,NOMBRE_DE_PAQUETS)); /* Nombre de paquets a creer. A priori, une valeur 'INFINI' indique que c'est la taille */ /* des paquets qui l'emporte. Par contre une autre valeur provoque le calcul de la taille */ /* des paquets en tant que rapport entre la taille du fichier et le nombre de paquets. */ /* Ceci a ete introduit le 20160222130137... */ DEFV(Logical,INIT(editer_les_messages_d_en_tete,EDITER_LES_MESSAGES_D_EN_TETE)); /* Controle de l'edition. */ DEFV(Logical,INIT(editer_le_minimum________,EDITER_LE_MINIMUM________)); DEFV(Logical,INIT(editer_le_maximum________,EDITER_LE_MAXIMUM________)); DEFV(Logical,INIT(editer_le_premier________,EDITER_LE_PREMIER________)); DEFV(Logical,INIT(editer_le_dernier________,EDITER_LE_DERNIER________)); DEFV(Logical,INIT(editer_la_moyenne________,EDITER_LA_MOYENNE________)); DEFV(Logical,INIT(editer_le_cumul__________,EDITER_LE_CUMUL__________)); DEFV(Logical,INIT(editer_l_element_variable,EDITER_L_ELEMENT_VARIABLE)); DEFV(Int,INIT(numero_de_l_element_variable,NUMERO_DE_L_ELEMENT_VARIABLE)); /* Parametres de choix de ce qui sera edite. La possibilite d'editer un element de numero */ /* donne dans un paquet a ete introduit le 20081110130005... */ DEFV(Int,INIT(numero_dans_le_paquet,PREMIER_ELEMENT_D_UN_PAQUET)); /* Numero de l'element courant dans le paquet courant. */ DEFV(Float,INIT(minimum_________,F_INFINI)); DEFV(Float,INIT(maximum_________,F_MOINS_L_INFINI)); DEFV(Float,INIT(premier_________,FLOT__UNDEF)); DEFV(Float,INIT(dernier_________,FLOT__UNDEF)); DEFV(Float,INIT(cumul___________,FZERO)); DEFV(Float,INIT(element_variable,FLOT__UNDEF)); /* Valeurs courantes des elements a editer. */ DEFV(Logical,INIT(introduire_un_K_NL,FAUX)); /* Afin de ne pas introduire un saut de ligne devant la premiere ligne... */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" /* Ceci fut introduit le 20070103174400... */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20160222=",compatibilite_20160222); PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("fichier=" ,fichier_des_valeurs ,liste_des_valeurs ,VALEUR_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_L("avertir=",avertir_si_la_taille_des_paquets_ne_divise_pas_la_taille_du_fichier); GET_ARGUMENT_I("taille_paquets=""taille=""paquets=",taille_des_paquets); GET_ARGUMENT_I("nombre_paquets=""np=",nombre_de_paquets); GET_ARGUMENT_L("messages=""message=""Men_tete=",editer_les_messages_d_en_tete); /* Le 20050623172729, "en_tete=" a ete remplace par "Men_tete=" (double definition...). */ GET_ARGUMENT_L("minimum=""m=",editer_le_minimum________); GET_ARGUMENT_L("maximum=""M=",editer_le_maximum________); GET_ARGUMENT_L("premier=""p=",editer_le_premier________); GET_ARGUMENT_L("dernier=""d=",editer_le_dernier________); GET_ARGUMENT_L("moyenne=""moy=",editer_la_moyenne________); GET_ARGUMENT_L("cumul=""c=",editer_le_cumul__________); GET_ARGUMENT_L("element_variable=""ev=",editer_l_element_variable); GET_ARGUMENT_I("numero_element_variable=""nev=",numero_de_l_element_variable); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; /* Cette procedure fut introduite le 20070103174400... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; /* Cette procedure fut introduite le 20061226192830... */ ) ); Test(IFNE(nombre_de_paquets,NOMBRE_DE_PAQUETS)) Bblock EGAL(taille_des_paquets,QUOE(nombre_d_elements,nombre_de_paquets)); /* La taille des paquets est egale au rapport entre la taille du fichier et le nombre de */ /* paquets (introduit le 20160222130137 pour 'v $xiird/.ACIN.Y1.1.$U Args_Paquets'). */ Eblock ATes Bblock Eblock ETes Test(IFET(IL_FAUT(compatibilite_20160222) ,IL_FAUT(avertir_si_la_taille_des_paquets_ne_divise_pas_la_taille_du_fichier) ) ) Bblock Test(NON_DIVISIBLE(nombre_d_elements,taille_des_paquets)) Bblock PRINT_ERREUR("la taille du fichier n'est pas un multiple de la taille des paquets"); CAL1(Prer2("(elles valent respectivement %d et %d)\n" ,nombre_d_elements ,taille_des_paquets ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock DEFV(Float,INIT(valeur_courante,ELEMENT_DU_FICHIER(index))); /* Recuperation de la valeur courante dans le fichier. */ INCR(taille_effective_des_paquets,I); EGAL(minimum_________ ,MIN2(minimum_________,valeur_courante) ); EGAL(maximum_________ ,MAX2(maximum_________,valeur_courante) ); EGAL(premier_________ ,COND(IFEQ(numero_dans_le_paquet,PREMIER_ELEMENT_D_UN_PAQUET),valeur_courante,premier_________) ); EGAL(dernier_________ ,COND(IFEQ(numero_dans_le_paquet,LSTX(PREMIER_ELEMENT_D_UN_PAQUET,taille_des_paquets)),valeur_courante,dernier_________) ); INCR(cumul___________ ,valeur_courante ); EGAL(element_variable ,COND(IFEQ(numero_dans_le_paquet,numero_de_l_element_variable),valeur_courante,element_variable) ); Test(IFOU(IFEQ(numero_dans_le_paquet,LSTX(PREMIER_ELEMENT_D_UN_PAQUET,taille_des_paquets)) ,COND(IL_FAUT(compatibilite_20160222) ,TOUJOURS_FAUX ,IFEQ(index,DERNIER_ELEMENT_D_UN_FICHIER) ) ) ) Bblock /* Edition de quelques informations relatives au paquet courant (cela se fait lorsque l'on */ /* rencontre le dernier element de chaque paquet ; cela fait, au passage, que si le nombre */ /* d'elements du fichier n'est pas divisible par la taille des paquets, alors les */ /* informations relatives au dernier paquet ne sont pas editees...) : */ Test(IL_FAUT(introduire_un_K_NL)) Bblock CAL2(Prin0("\n")); /* Pas de saut de ligne devant la premiere ligne, mais uniquement sur les lignes suivantes. */ Eblock ATes Bblock EGAL(introduire_un_K_NL,VRAI); Eblock ETes EDITION_D_UNE_VALEUR_CALCULEE(editer_le_minimum________ ,NEUT(minimum_________) ,"minimum=" ,TOUJOURS_FAUX ); EDITION_D_UNE_VALEUR_CALCULEE(editer_le_maximum________ ,NEUT(maximum_________) ,"maximum=" ,IFOU(IL_FAUT(editer_le_minimum________) ,TOUJOURS_FAUX ) ); EDITION_D_UNE_VALEUR_CALCULEE(editer_le_premier________ ,NEUT(premier_________) ,"premier=" ,IFOU(IL_FAUT(editer_le_minimum________) ,IFOU(IL_FAUT(editer_le_maximum________) ,TOUJOURS_FAUX ) ) ); EDITION_D_UNE_VALEUR_CALCULEE(editer_le_dernier________ ,NEUT(dernier_________) ,"dernier=" ,IFOU(IL_FAUT(editer_le_minimum________) ,IFOU(IL_FAUT(editer_le_maximum________) ,IFOU(IL_FAUT(editer_le_premier________) ,TOUJOURS_FAUX ) ) ) ); EDITION_D_UNE_VALEUR_CALCULEE(editer_la_moyenne________ ,DIVI(cumul___________ ,COND(IL_FAUT(compatibilite_20160222) ,taille_des_paquets ,taille_effective_des_paquets ) ) ,"moyenne=" ,IFOU(IL_FAUT(editer_le_minimum________) ,IFOU(IL_FAUT(editer_le_maximum________) ,IFOU(IL_FAUT(editer_le_premier________) ,IFOU(IL_FAUT(editer_le_dernier________) ,TOUJOURS_FAUX ) ) ) ) ); EDITION_D_UNE_VALEUR_CALCULEE(editer_le_cumul__________ ,cumul___________ ,"cumul=" ,IFOU(IL_FAUT(editer_le_minimum________) ,IFOU(IL_FAUT(editer_le_maximum________) ,IFOU(IL_FAUT(editer_le_premier________) ,IFOU(IL_FAUT(editer_le_dernier________) ,IFOU(IL_FAUT(editer_la_moyenne________) ,TOUJOURS_FAUX ) ) ) ) ) ); /* Le cumul a ete introduit le 20031130165624. */ EDITION_D_UNE_VALEUR_CALCULEE(editer_l_element_variable ,element_variable ,"element_variable=" ,IFOU(IL_FAUT(editer_le_minimum________) ,IFOU(IL_FAUT(editer_le_maximum________) ,IFOU(IL_FAUT(editer_le_premier________) ,IFOU(IL_FAUT(editer_le_dernier________) ,IFOU(IL_FAUT(editer_la_moyenne________) ,IFOU(IL_FAUT(editer_le_cumul__________) ,TOUJOURS_FAUX ) ) ) ) ) ) ); /* L'element variable a ete introduit le 20081110130005. */ EGAL(numero_dans_le_paquet,PREMIER_ELEMENT_D_UN_PAQUET); /* Reinitialisation du numero de l'element courant dans le paquet courant apres edition... */ EGAL(minimum_________,F_INFINI); EGAL(maximum_________,F_MOINS_L_INFINI); EGAL(premier_________,FLOT__UNDEF); EGAL(dernier_________,FLOT__UNDEF); EGAL(cumul___________,FZERO); EGAL(element_variable,FLOT__UNDEF); /* Reinitialisation des valeurs courantes des elements a editer apres edition... */ EGAL(taille_effective_des_paquets,ZERO); Eblock ATes Bblock INCR(numero_dans_le_paquet,I); /* Progression du numero de l'element courant dans le paquet courant dans le cas ou il */ /* n'y a pas eu d'edition... */ Eblock ETes Eblock EDoI CAL2(Prin0("\n")); /* "Fermeture" du fichier resultat (c'est-a-dire la sortie standard...). */ lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_IMPLICITE); RETU_Commande; Eblock ECommande