/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N E T G E S T I O N D E S L I S T E S Q U E L C O N Q U E S : */ /* */ /* */ /* Author of '$xrv/champs_5.41$I' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 1997??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D ' U N E L I S T E Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ #define GESTION_DES_LISTES_QUELCONQUES_VERSION_01 \ /* Cette facon de gerer le format des listes est statique ; les dimensions : */ \ /* */ \ /* NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES */ \ /* NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION */ \ /* */ \ /* sont fixees a la compilation, et ne peuvent etre depassees... */ #nodefine GESTION_DES_LISTES_QUELCONQUES_VERSION_02 \ /* Cette facon de gerer le format des listes est dynamique ; les dimensions : */ \ /* */ \ /* nombre_d_iterations ("iterations=") */ \ /* nombre_de_periodes_de_la_simulation ("np=") */ \ /* */ \ /* sont a priori arbitraires... */ /* Pour resoudre le probleme de l'initialisation d'une liste dont on ne connait plus le */ /* type, le 19970409140122, toutes les listes (y compris les listes 'liste_des_index' et */ /* 'liste_des_numeros') sont passees en type 'Float'... */ #ifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 # define gDEFINITION_LISTE(liste,nombre_d_elements) \ DEFV(Local,DEFV(Float,DTb1(liste,nombre_d_elements))) \ /* Definition generale d'une liste quelconque de type 'Float'... */ # define gACCES_LISTE(index,liste,numero_du_premier_element,nombre_d_elements) \ ITb1(liste,INDX(index,numero_du_premier_element)) \ /* Acces a un element d'une liste quelconque. */ # define gINITIALISATION_LISTE(liste,valeur_initiale,numero_du_premier_element,nombre_d_elements) \ Bblock \ DEFV(Int,INIT(index,UNDEF)); \ /* Index d'initialisation d'une liste de transformations particulieres. */ \ DoIn(index \ ,numero_du_premier_element \ ,LSTX(numero_du_premier_element,nombre_d_elements) \ ,I \ ) \ Bblock \ EGAL(gACCES_LISTE(index,liste,numero_du_premier_element,nombre_d_elements) \ ,valeur_initiale \ ); \ /* Et on initialise element par element... */ \ Eblock \ EDoI \ Eblock \ /* Initialisation d'une liste quelconque... */ #Aifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 #Eifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_01 #ifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02 # TestADef NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION \ /* A cause de 'v $xrc/verhulst.41$K' et 'v $xrc/zeta.01$K', il est necessaire de proceder */ \ /* a cette definition car 'NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES' n'a pas ete defini... */ # ifndef NOMBRE_D_ITERATIONS # include xrk/attractor.41.I" /* Ceci est du aux programmes : */ /* */ /* $xrq/di_elec.L0$K */ /* $xrq/meson.L0$K */ /* $xrq/nucleon.L0$K */ /* $xrq/vide.L0$K */ /* $xrr/univers.10$K */ /* $xrv/champs_5.10$K */ /* $xrv/champs_5.20$K */ /* $xrv/champs_5.30$K */ /* */ /* et d'autres peut-etre qui n'utilisent pas '$xrk/attractor.14.I'... */ # Aifndef NOMBRE_D_ITERATIONS # Eifndef NOMBRE_D_ITERATIONS # define LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE \ STATIQUE_UNDEF \ /* Pour definir une liste non encore allouee... */ # define gDEFINITION_LISTE(liste,nombre_d_elements) \ DEFV(Local,DEFV(Float,INIT(valeur_initiale_de`liste,FLOT__UNDEF))); \ DEFV(Local,DEFV(Int,INIT(numero_du_premier_element_de`liste,UNDEF))); \ DEFV(Local,DEFV(Int,INIT(nombre_d_elements_de`liste,UNDEF))); \ DEFV(Local,DEFV(Float,DdTb1(POINTERf \ ,liste \ ,nombre_d_elements \ ,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE \ ) \ ) \ ); \ /* Definition generale d'une liste quelconque de type 'Float'. */ # define aLISTE(index,liste,numero_du_premier_element,nombre_d_elements) \ IdTb1(liste \ ,INDX(index,numero_du_premier_element) \ ,nombre_d_elements \ ) \ /* Acces a un element d'une liste quelconque. */ # define gACCES_LISTE(index,liste,numero_du_premier_element,nombre_d_elements) \ aLISTE(index \ ,COND(IFNE(liste,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE) \ ,liste \ ,EGAL(liste \ ,allocation_dynamique_liste(liste \ ,valeur_initiale_de`liste \ ,numero_du_premier_element_de`liste \ ,EGAL(nombre_d_elements_de`liste \ ,COND(IFEQ(nombre_d_elements_de`liste \ ,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION \ ) \ ,nombre_de_periodes_de_la_simulation \ ,COND(IFEQ(nombre_d_elements_de`liste \ ,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ ) \ ,SE22(nombre_d_iterations \ ,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ ) \ ,MAX2(NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION \ ,NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES \ ) \ ) \ ) \ ) \ ) \ ) \ ) \ ,numero_du_premier_element \ ,nombre_d_elements \ ) \ /* Acces a un element d'une liste quelconque. On notera que lors du premier acces, il peut */ \ /* y avoir allocation de l'espace memoire necessaire ; la taille ce celui-ci est evaluee */ \ /* a partir des constantes mises initialement dans 'nombre_d_elements_de`liste' par la */ \ /* procedure 'gINITIALISATION_LISTE(...)' qui servent a determiner laquelle des deux */ \ /* variables 'nombre_de_periodes_de_la_simulation' ou 'nombre_d_iterations' est alors */ \ /* necessaires. On notera que dans l'etat actuel des choses, la detection de la valeur */ \ /* 'NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES' fait que l'allocation memmoire qui va etre */ \ /* faite, demande 'NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES' et non pas 'nombre_d_iterations' */ \ /* a cause de la notion de chaines de connexion ('v $xrv/particule.10$K') ainsi qu'a la */ \ /* possibilite de tracer les axes ; ces deux circonstances font que le nombre de points */ \ /* peut etre alors tres superieur a 'nombre_d_iterations'... */ # define gINITIALISATION_LISTE(liste,valeur_initiale,numero_du_premier_element,nombre_d_elements) \ Bblock \ Test(IFEQ(liste,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE)) \ Bblock \ EGAL(valeur_initiale_de`liste,valeur_initiale); \ EGAL(numero_du_premier_element_de`liste,numero_du_premier_element); \ EGAL(nombre_d_elements_de`liste,nombre_d_elements); \ Eblock \ ATes \ Bblock \ /* Cas ou la liste a deja ete allouee : cela signifie que l'on est ici dans un appel fait */ \ /* par 'INITIALISATION_DE_LA_LISTE_DES_POINTS(...)' pour les listes 'liste_des_index' et */ \ /* 'liste_des_numeros' alors que cela a deja ete fait au moins une fois... */ \ Eblock \ ETes \ Eblock \ /* Memorisation de ce qui sera utile a 'allocation_dynamique_liste(...)' lors du */ \ /* premier 'gACCES_LISTE(...)' d'acces a cette liste... */ # define gaINITIALISATION_LISTE_SANS_ALLOCATION(liste,valeur_initiale,numero_du_premier_element,nombre_d_elements) \ Bblock \ DEFV(Int,INIT(index,UNDEF)); \ /* Index d'initialisation d'une liste de transformations particulieres. */ \ \ DoIn(index \ ,numero_du_premier_element \ ,LSTX(numero_du_premier_element,nombre_d_elements) \ ,I \ ) \ Bblock \ EGAL(aLISTE(index,liste,numero_du_premier_element,nombre_d_elements) \ ,valeur_initiale \ ); \ /* Et on initialise element par element... */ \ Eblock \ EDoI \ Eblock \ /* Initialisation d'une liste quelconque sans allocation... */ # define gaINITIALISATION_LISTE(liste,valeur_initiale,numero_du_premier_element,nombre_d_elements) \ Bblock \ Test(IFEQ(liste,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE)) \ Bblock \ /* Cas ou la liste n'a pas encore ete allouee : il s'agit soit du passage dans la procedure */ \ /* 'lTRANSFORMAT_12(...)' lors de la lecture du fichier des valeurs, soit, lorsqu'il n'y a */ \ /* pas eu de fichier demande, de l'initialisation a priori, apres l'appel a la procedure */ \ /* 'GET_ARGUMENTSv(...)'. */ \ MdTb1(liste \ ,nombre_d_elements \ ,Float \ ,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE \ ); \ /* Allocation de la memoire necessaire a cette liste de transformation... */ \ \ gaINITIALISATION_LISTE_SANS_ALLOCATION(liste \ ,valeur_initiale \ ,numero_du_premier_element \ ,nombre_d_elements \ ) \ /* Et on initialise element par element... */ \ Eblock \ ATes \ Bblock \ /* Cas ou la liste a deja ete allouee : cela signifie que l'on est ici apres l'appel a la */ \ /* procedure 'GET_ARGUMENTSv(...)' et qu'un fichier de valeurs a donc ete lu... */ \ Eblock \ ETes \ Eblock \ /* Initialisation d'une liste quelconque... */ BFonctionF DEFV(Local,DEFV(FonctionF,POINTERf(allocation_dynamique_liste(liste_a_allouer_si_necessaire ,valeur_initiale ,numero_du_premier_element ,nombre_d_elements ) ) ) ) DEFV(Argument,DEFV(Float,POINTERf(liste_a_allouer_si_necessaire))); /* Liste a allouer si necessaire. */ DEFV(Argument,DEFV(Float,valeur_initiale)); /* Valeur initiale commune a chaque element de la liste. */ DEFV(Argument,DEFV(Int,numero_du_premier_element)); /* Numero du premier element et, */ DEFV(Argument,DEFV(Int,nombre_d_elements)); /* Nombre d'elements necessaires... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(POINTERf(liste_temporaire),liste_a_allouer_si_necessaire)); /* Liste temporaire... */ /*..............................................................................................................................*/ Test(IFEQ(liste_temporaire,LISTE_DES_VALEURS_NON_ENCORE_ALLOUEE)) Bblock EGAL(liste_temporaire,fMalo(MUL2(nombre_d_elements,size_Float))); /* Lorsque la liste n'est pas encore definie, on lui alloue la memoire necesaire... */ gaINITIALISATION_LISTE_SANS_ALLOCATION(liste_temporaire ,valeur_initiale ,numero_du_premier_element ,nombre_d_elements ); /* Et on initialise element par element... */ Eblock ATes Bblock Eblock ETes RETU(liste_temporaire); /* Ainsi, on renvoie 'liste' si elle etait deja allouee, et 'liste_temporaire' au cas ou */ /* il y a eu allocation... */ Eblock EFonctionF #Aifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02 #Eifdef GESTION_DES_LISTES_QUELCONQUES_VERSION_02