/*************************************************************************************************************************************/ /* */ /* H I S T O G R A M M E D ' U N F I C H I E R N U M E R I Q U E : */ /* */ /* */ /* Author of '$xrv/histogram.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20000229121128). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 NOMBRE_D_ELEMENTS_DE_L_HISTOGRAMME \ SEIZE \ /* Nombre d'elements de l'histogramme. */ #define FORCER_LES_EXTREMA \ FAUX #define MINIMUM_A_FORCER \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define MAXIMUM_A_FORCER \ COORDONNEE_BARYCENTRIQUE_MAXIMALE /* Faut-il utiliser les extrema du fichier ('FAUX') ou bien forcer des valeurs a priori */ /* ('VRAI') ? */ #define EDITER_LES_EXTREMA_DE_CHAQUE_SEGMENT_DU_FICHIER \ FAUX \ /* Faut-il editer les extrema de chaque segment du fichier ('VRAI') ou pas ('FAUX') ? */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20060214191036... */ #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. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O U T I L S D E G E N E R A T I O N D E L ' H I S T O G R A M M E : */ /* */ /*************************************************************************************************************************************/ #define PREMIER_ELEMENT_DE_L_HISTOGRAMME \ PREMIER_ELEMENT_D_UN_FICHIER \ /* Premier element de l'histogramme. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* H I S T O G R A M M E 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 #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Int,INIT(nombre_d_elements_de_l_histogramme,NOMBRE_D_ELEMENTS_DE_L_HISTOGRAMME)); /* Nombre d'elements de l'histogramme. */ DEFV(Logical,INIT(forcer_les_extrema,FORCER_LES_EXTREMA)); DEFV(Float,INIT(minimum_a_forcer,MINIMUM_A_FORCER)); DEFV(Float,INIT(maximum_a_forcer,MAXIMUM_A_FORCER)); /* Faut-il utiliser les extrema du fichier ('FAUX') ou bien forcer des valeurs a priori */ /* ('VRAI') ? */ DEFV(Logical,INIT(editer_les_extrema_de_chaque_segment_du_fichier,EDITER_LES_EXTREMA_DE_CHAQUE_SEGMENT_DU_FICHIER)); /* Faut-il editer les extrema de chaque segment du fichier ('VRAI') ou pas ('FAUX') ? */ DEFV(Float,INIT(minimum_courant,F_INFINI)); DEFV(Float,INIT(maximum_courant,F_MOINS_L_INFINI)); /* Extrema courants. */ DEFV(Int,INIT(index_de_l_histogramme,UNDEF)); /* Index de l'histogramme. */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" EGAL(nombre_de_chiffres_des_editions_flottantes,NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES); /* Afin de garantir la compatibilite anterieure au 20180606144333... */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(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_I("nombre=""histogramme=""elements=",nombre_d_elements_de_l_histogramme); GET_ARGUMENT_L("forcer=",forcer_les_extrema); GET_ARGUMENT_F("minimum=""m=",minimum_a_forcer); GET_ARGUMENT_F("maximum=""M=",maximum_a_forcer); GET_ARGUMENT_L("editer=",editer_les_extrema_de_chaque_segment_du_fichier); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; ) ); Test(IZLE(nombre_d_elements_de_l_histogramme)) Bblock PRINT_ERREUR("le nombre d'elements de l'histogramme doit etre strictement positif"); CAL1(Prer1("la valeur par defaut (%d) est forcee\n\n",NOMBRE_D_ELEMENTS_DE_L_HISTOGRAMME)); EGAL(nombre_d_elements_de_l_histogramme,NOMBRE_D_ELEMENTS_DE_L_HISTOGRAMME); Eblock ATes Bblock Eblock ETes Test(IL_FAUT(forcer_les_extrema)) Bblock EGAL(minimum_courant,minimum_a_forcer); EGAL(maximum_courant,maximum_a_forcer); /* Forcage des extrema. */ Eblock ATes Bblock 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. */ EGAL(minimum_courant,MIN2(valeur_courante,minimum_courant)); EGAL(maximum_courant,MAX2(valeur_courante,maximum_courant)); /* Recherche des extrema. */ Eblock EDoI Eblock ETes Test(IFET(IFNE(minimum_courant,maximum_courant) ,IFNE(PREMIER_ELEMENT_DE_L_HISTOGRAMME,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme)) ) ) Bblock DEFV(Int,DdTb1(POINTERi ,histogramme ,nombre_d_elements_de_l_histogramme ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(Float,DdTb1(POINTERf ,minimum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(Float,DdTb1(POINTERf ,maximum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'histogramme et des listes des extrema de chaque segment du fichier. */ MdTb1(histogramme ,nombre_d_elements_de_l_histogramme ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(minimum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(maximum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); /* Allocation de l'histogramme et des listes des extrema de chaque segment du fichier. */ DoIn(index_de_l_histogramme ,PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ,I ) Bblock CLIR(IdTb1(histogramme,index_de_l_histogramme,nombre_d_elements_de_l_histogramme)); /* Nettoyage de l'histogramme. */ EGAL(IdTb1(minimum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ,F_INFINI ); EGAL(IdTb1(maximum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ,F_MOINS_L_INFINI ); /* Nettoyage des extrema de chaque segment du fichier. */ Eblock EDoI 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. */ EGAL(index_de_l_histogramme ,TRON(INTE(HOMO(valeur_courante ,minimum_courant ,maximum_courant ,FLOT(PREMIER_ELEMENT_DE_L_HISTOGRAMME) ,ADD2(FLOT(LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme)) ,UN_MOINS_EPSILON ) ) ) ,PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ) ); /* Generation de l'index d'acces a l'histogramme. L'ajout de 'COMP(GRAND_EPSILON)' au */ /* maximum de l'index de l'histogramme a ete effectue afin de garantir un decoupage */ /* equitable, par exemple, dans le cas : */ /* */ /* {1,2,3,4,5,6,7,8,9} */ /* */ /* ou l'histogramme a 3 elements doit etre : */ /* */ /* {3,3,3} */ /* */ /* ce que 'ARRI(...)' ne donnait pas... */ /* */ /* Le 20110420152518, 'UN_MOINS_EPSILON' a remplace 'COMP(GRAND_EPSILON)'... */ Test(IFINff(index_de_l_histogramme ,PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ) ) /* Ce test est devenu redondant le 20000314121005 apres avoir mis un 'TRON(...)' ci-dessus */ /* dans le calcul de 'index_de_l_histogramme', mais on ne sait jamais... */ Bblock INCR(IdTb1(histogramme,index_de_l_histogramme,nombre_d_elements_de_l_histogramme),I); /* Incrementation de l'histogramme. */ EGAL(IdTb1(minimum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ,MIN2(valeur_courante ,IdTb1(minimum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ) ); EGAL(IdTb1(maximum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ,MAX2(valeur_courante ,IdTb1(maximum_de_chaque_segment_du_fichier,index_de_l_histogramme,nombre_d_elements_de_l_histogramme) ) ); /* Recherche des extrema de chaque segment du fichier. */ Eblock ATes Bblock PRINT_ERREUR("un index d'acces a l'histogramme est incorrect"); CAL1(Prer3("%d n'est pas dans [%d,%d]\n\n" ,index_de_l_histogramme ,PINTE(PREMIER_ELEMENT_DE_L_HISTOGRAMME) ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ) ); Eblock ETes Eblock EDoI DoIn(index_de_l_histogramme ,PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ,I ) Bblock Test(IL_FAUT(editer_les_extrema_de_chaque_segment_du_fichier)) Bblock Test(IZGT(IdTb1(histogramme,index_de_l_histogramme,nombre_d_elements_de_l_histogramme))) /* Test introduit le 20180523094540 afin de ne pas editer {F_MOINS_L_INFINI,F_INFINI} */ /* lorsqu'un segment du fichier est vide... */ Bblock DEFV(Float,INIT(minimum_courant ,IdTb1(minimum_de_chaque_segment_du_fichier ,index_de_l_histogramme ,nombre_d_elements_de_l_histogramme ) ) ); DEFV(Float,INIT(maximum_courant ,IdTb1(maximum_de_chaque_segment_du_fichier ,index_de_l_histogramme ,nombre_d_elements_de_l_histogramme ) ) ); CAL2(Prin0("minimum=")); EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(minimum_courant); CAL2(Prin0(" maximum=")); EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(maximum_courant); CAL2(Prin0(" moyenne=")); EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(MOYE(maximum_courant,minimum_courant)); CAL2(Prin0(" amplitude=")); EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(SOUS(maximum_courant,minimum_courant)); /* Edition des extrema de chaque segment du fichier. */ /* */ /* Le 20060105161252, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123555, le format "^^g" est passe a "^^^" pour plus de souplesse... */ /* */ /* Le 20180604180349 a ete introduit l'edition de l'amplitude... */ /* */ /* Le 20180605072142 a ete introduit l'edition de la moyenne... */ CAL2(Prin1(" nombre=%d\n",IdTb1(histogramme,index_de_l_histogramme,nombre_d_elements_de_l_histogramme))); /* Edition de l'histogramme lorsqu'il y a plus d'un element. */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock CAL2(Prin1("%d\n",IdTb1(histogramme,index_de_l_histogramme,nombre_d_elements_de_l_histogramme))); /* Edition de l'histogramme lorsqu'il y a plus d'un element. */ Eblock ETes Eblock EDoI FdTb1(maximum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(minimum_de_chaque_segment_du_fichier ,nombre_d_elements_de_l_histogramme ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(histogramme ,nombre_d_elements_de_l_histogramme ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); /* Liberation des espaces alloues... */ /* */ /* Les 'ADRESSE_NON_ENCORE_DEFINIE's ont ete introduits le 20050221173525... */ Eblock ATes Bblock DoIn(index_de_l_histogramme ,PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ,I ) Bblock Test(IFEQ(index_de_l_histogramme ,MOYE(PREMIER_ELEMENT_DE_L_HISTOGRAMME ,LSTX(PREMIER_ELEMENT_DE_L_HISTOGRAMME,nombre_d_elements_de_l_histogramme) ) ) ) Bblock CAL2(Prin1("%d\n",nombre_d_elements)); /* Edition de l'histogramme lorsqu'il n'y a qu'un seul element. */ Eblock ATes Bblock CAL2(Prin1("%d\n",PINTE(ZERO))); /* Edition de l'histogramme lorsqu'il n'y a qu'un seul element. */ Eblock ETes Eblock EDoI Eblock ETes lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_IMPLICITE); RETU_Commande; Eblock ECommande