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