/*************************************************************************************************************************************/
/* */
/* 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