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




Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.