/*************************************************************************************************************************************/ /* */ /* S E C O N D E P A R T I E D E S D E F I N I T I O N S D U L A N G A G E ' K ' */ /* I N D E P E N D A N T E S D U L A N G A G E S O U R C E ( ' C ' ) : */ /* */ /* */ /* Definition : */ /* */ /* Dans ce fichier, se trouvent toutes les */ /* constantes, les definitions et les macros */ /* utiles a la definition du langage 'K' et */ /* qui sont independantes du langage source */ /* (le 'C'). */ /* */ /* */ /* Author of '$xil/defi_K2$vv$DEF' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19940000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U S Y S T E M E U T I L I S E : */ /* */ /* */ /* Nota : */ /* */ /* on definit ici le systeme utilise */ /* pour compiler les modules, et ce sous */ /* la forme : ORDINATEUR/OS/COMPILATEUR, */ /* ou 'OS' designe le systeme d'exploitation. */ /* Les noms suivants sont reconnus pour */ /* la variable-shell 'SYSTEME' : */ /* */ /* SYSTEME_APC_LinuxDebian_GCC, */ /* SYSTEME_APC_LinuxMandrake_GCC, */ /* SYSTEME_APC_LinuxRedHat_GCC, */ /* SYSTEME_APC_LinuxUbuntu_GCC, */ /* SYSTEME_APC_LinuxUbuntu_ICC, */ /* SYSTEME_APC_LinuxUlmint_GCC, */ /* SYSTEME_APC_LinuxUlmint_ICC, */ /* SYSTEME_CRAY2_UNICOS_CC, */ /* SYSTEME_CRAY2_UNICOS_SCC, */ /* SYSTEME_CRAYC98_UNICOS_CC, */ /* SYSTEME_CRAYC98_UNICOS_SCC, */ /* SYSTEME_CRAYC916_UNICOS_CC, */ /* SYSTEME_CRAYC916_UNICOS_SCC, */ /* SYSTEME_CRAYYMP1_UNICOS_CC, */ /* SYSTEME_CRAYYMP1_UNICOS_SCC, */ /* SYSTEME_CRAYYMP2_UNICOS_CC, */ /* SYSTEME_CRAYYMP2_UNICOS_SCC, */ /* SYSTEME_CRAYYMP4_UNICOS_CC, */ /* SYSTEME_CRAYYMP4_UNICOS_SCC, */ /* SYSTEME_DECALPHA340_OSF1_CC, */ /* SYSTEME_DECALPHA340_OSF1_GCC, */ /* SYSTEME_DECALPHA350_OSF1_CC, */ /* SYSTEME_DECALPHA350_OSF1_GCC, */ /* SYSTEME_DECALPHA464_OSF1_CC, */ /* SYSTEME_DPX2000_SPIX_CC, */ /* SYSTEME_DPX5000_SPIX_CC, */ /* SYSTEME_ES9000_AIX_CC, */ /* SYSTEME_FX2800_CONCENTRIX_FXC, */ /* SYSTEME_FX2800_CONCENTRIX_PCC, */ /* SYSTEME_FX2800_CONCENTRIX_SCC, */ /* SYSTEME_FX40_CONCENTRIX_CC, */ /* SYSTEME_FX40_CONCENTRIX_FXC, */ /* SYSTEME_HP705_HPUX_CC, */ /* SYSTEME_HP710_HPUX_CC, */ /* SYSTEME_HP720_HPUX_CC, */ /* SYSTEME_HP750_HPUX_CC, */ /* SYSTEME_HP755_HPUX_CC, */ /* SYSTEME_HP819_HPUX_CC, */ /* SYSTEME_NWS3000_NEWSOS_CC, */ /* SYSTEME_NWS3000_NEWSOS_2CC, */ /* SYSTEME_RS6000_AIX_CC, */ /* SYSTEME_SG4D20G_IRIX_CC, */ /* SYSTEME_SG4D25TG_IRIX_CC, */ /* SYSTEME_SG4D310VGX_IRIX_CC, */ /* SYSTEME_SG4D35TG_IRIX_CC, */ /* SYSTEME_SG4D85GT_IRIX_CC, */ /* SYSTEME_SGIND308_IRIX_CC, */ /* SYSTEME_SGIND324_IRIX_CC, */ /* SYSTEME_SGIND3GA_IRIX_CC, */ /* SYSTEME_SGIND408_IRIX_CC, */ /* SYSTEME_SGIND424_IRIX_CC, */ /* SYSTEME_SGIND4GA_IRIX_CC, */ /* SYSTEME_SGIND508_IRIX_CC, */ /* SYSTEME_SGIND524_IRIX_CC, */ /* SYSTEME_SGIND5GA_IRIX_CC, */ /* SYSTEME_SGIND808_IRIX_CC, */ /* SYSTEME_SGIND824_IRIX_CC, */ /* SYSTEME_SGIND8GA_IRIX_CC, */ /* SYSTEME_SGINDA08_IRIX_CC, */ /* SYSTEME_SGINDA24_IRIX_CC, */ /* SYSTEME_SGINDAGA_IRIX_CC, */ /* SYSTEME_SGO200A1_IRIX_CC, */ /* SYSTEME_SGO200A2_IRIX_CC, */ /* SYSTEME_SGO200A4_IRIX_CC, */ /* SYSTEME_SGO25224_IRIX_CC, */ /* SYSTEME_SGO252VA_IRIX_CC, */ /* SYSTEME_SGO252VN_IRIX_CC, */ /* SYSTEME_SGPCM801_IRIX_CC, */ /* SYSTEME_SGPCMA01_IRIX_CC, */ /* SYSTEME_SPS9_ROS_CC, */ /* SYSTEME_SPS9_ROS_RC, */ /* SYSTEME_SUN3_SUNOS_CC, */ /* SYSTEME_SUN4_SUNOS_CC, */ /* SYSTEME_SUN4NCUBE2S_SUNOS_CC, */ /* SYSTEME_SUN4NCUBE2S_SUNOS_NCC, */ /* SYSTEME_VAX8600_ULTRIX_CC, */ /* SYSTEME_VAX8600_ULTRIX_VCC, */ /* SYSTEME_VAX9000_ULTRIX_CC, */ /* SYSTEME_VAX9000_ULTRIX_GCC, */ /* SYSTEME_VAX9000_ULTRIX_VCC. */ /* */ /* La variable 'SYSTEME' est definie par un */ /* "#define" implicite lors de la phase de */ /* pre-processing par 'cpp' (option "-D"). */ /* */ /* Mais ATTENTION, actuellement, l'ensemble */ /* des logiciels n'a ete teste que pour (le */ /* symbole "-->" indiquant le compilateur qui est */ /* effectivement utilise lorsqu'il y a le choix */ /* entre plusieurs) : */ /* */ /* --> SYSTEME_APC_LinuxDebian_GCC, */ /* --> SYSTEME_APC_LinuxMandrake_GCC, */ /* --> SYSTEME_APC_LinuxRedHat_GCC, */ /* --> SYSTEME_APC_LinuxUbuntu_GCC, */ /* --> SYSTEME_APC_LinuxUlmint_GCC, */ /* --> SYSTEME_APC_LinuxUlmint_ICC, */ /* --> SYSTEME_CRAY2_UNICOS_SCC, */ /* --> SYSTEME_CRAYC98_UNICOS_SCC, */ /* --> SYSTEME_CRAYC916_UNICOS_SCC, */ /* --> SYSTEME_CRAYYMP1_UNICOS_SCC, */ /* --> SYSTEME_CRAYYMP2_UNICOS_SCC, */ /* --> SYSTEME_CRAYYMP4_UNICOS_SCC, */ /* --> SYSTEME_DECALPHA340_OSF1_CC, */ /* --> SYSTEME_DECALPHA340_OSF1_GCC, */ /* --> SYSTEME_DECALPHA350_OSF1_CC, */ /* --> SYSTEME_DECALPHA350_OSF1_GCC, */ /* --> SYSTEME_DECALPHA464_OSF1_CC, */ /* --> SYSTEME_DPX5000_SPIX_CC, */ /* --> SYSTEME_ES9000_AIX_CC, */ /* SYSTEME_FX2800_CONCENTRIX_FXC, */ /* --> SYSTEME_FX2800_CONCENTRIX_SCC, */ /* --> SYSTEME_HP705_HPUX_CC, */ /* --> SYSTEME_HP710_HPUX_CC, */ /* --> SYSTEME_HP720_HPUX_CC, */ /* --> SYSTEME_HP750_HPUX_CC, */ /* --> SYSTEME_HP755_HPUX_CC, */ /* --> SYSTEME_HP819_HPUX_CC, */ /* SYSTEME_NWS3000_NEWSOS_CC, */ /* --> SYSTEME_NWS3000_NEWSOS_2CC, */ /* --> SYSTEME_RS6000_AIX_CC, */ /* --> SYSTEME_SG4D20G_IRIX_CC, */ /* --> SYSTEME_SG4D25TG_IRIX_CC, */ /* --> SYSTEME_SG4D310VGX_IRIX_CC, */ /* --> SYSTEME_SG4D35TG_IRIX_CC, */ /* --> SYSTEME_SG4D85GT_IRIX_CC, */ /* --> SYSTEME_SGIND308_IRIX_CC, */ /* --> SYSTEME_SGIND324_IRIX_CC, */ /* --> SYSTEME_SGIND3GA_IRIX_CC, */ /* --> SYSTEME_SGIND408_IRIX_CC, */ /* --> SYSTEME_SGIND424_IRIX_CC, */ /* --> SYSTEME_SGIND4GA_IRIX_CC, */ /* --> SYSTEME_SGIND508_IRIX_CC, */ /* --> SYSTEME_SGIND524_IRIX_CC, */ /* --> SYSTEME_SGIND5GA_IRIX_CC, */ /* --> SYSTEME_SGIND808_IRIX_CC, */ /* --> SYSTEME_SGIND824_IRIX_CC, */ /* --> SYSTEME_SGIND8GA_IRIX_CC, */ /* --> SYSTEME_SGINDA08_IRIX_CC, */ /* --> SYSTEME_SGINDA24_IRIX_CC, */ /* --> SYSTEME_SGINDAGA_IRIX_CC, */ /* --> SYSTEME_SGO200A1_IRIX_CC, */ /* --> SYSTEME_SGO200A2_IRIX_CC, */ /* --> SYSTEME_SGO200A4_IRIX_CC, */ /* --> SYSTEME_SGO25224_IRIX_CC, */ /* --> SYSTEME_SGO252VA_IRIX_CC, */ /* --> SYSTEME_SGO252VN_IRIX_CC, */ /* --> SYSTEME_SGPCM801_IRIX_CC, */ /* --> SYSTEME_SGPCMA01_IRIX_CC, */ /* SYSTEME_SPS9_ROS_CC, */ /* --> SYSTEME_SPS9_ROS_RC, */ /* --> SYSTEME_SUN3_SUNOS_CC, */ /* --> SYSTEME_SUN4_SUNOS_CC, */ /* --> SYSTEME_SUN4NCUBE2S_SUNOS_CC, */ /* --> SYSTEME_SUN4NCUBE2S_SUNOS_NCC, */ /* --> SYSTEME_VAX9000_ULTRIX_GCC. */ /* */ /* et avec une bonne probabilite de reussite */ /* pour : */ /* */ /* SYSTEME_CRAY2_UNICOS_CC, */ /* SYSTEME_CRAYC98_UNICOS_CC, */ /* SYSTEME_CRAYC916_UNICOS_CC, */ /* SYSTEME_CRAYYMP1_UNICOS_CC, */ /* SYSTEME_CRAYYMP2_UNICOS_CC, */ /* SYSTEME_CRAYYMP4_UNICOS_CC, */ /* SYSTEME_FX40_CONCENTRIX_CC, */ /* SYSTEME_FX40_CONCENTRIX_FXC, */ /* SYSTEME_VAX8600_ULTRIX_CC, */ /* SYSTEME_VAX9000_ULTRIX_CC. */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O R D R E D E S P A S S E S D E P R E - P R O C E S S I N G : */ /* */ /* */ /* Nota important : */ /* */ /* Il y a une, cinq ou trois passes de */ /* pre-processing suivant la version : */ /* */ /* VERSION_01 : */ /* */ /* PASSE 1 : # */ /* */ /* VERSION_02 : */ /* */ /* PASSE 1 : # */ /* PASSE 2 : % */ /* PASSE 3 : = */ /* PASSE 4 : @ */ /* PASSE 5 : & */ /* */ /* VERSION_03 : */ /* */ /* PASSE F : # (destinee a generer les fichiers d'includes) */ /* */ /* PASSE D : _ (destinee a traiter la derivation formelle) */ /* */ /* PASSE E : # (destinee a traiter les extensions) */ /* */ /* PASSE 1 : # */ /* PASSE A : <> (destinee a traiter les arguments des fonctions) */ /* PASSE 2 : = */ /* PASSE 3 : % */ /* PASSE 4 : & (destinee a prendre en compte les 'defines' contenues dans d'autres) */ /* */ /* PASSE 5 : @ (destinee a prendre en compte les includes systemes a la compilation) */ /* */ /* PASSE 6 : (destinee a eliminer les references 'extern' conflictuelles) */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A R I A B L E S I N T R I N S E Q U E S D U P R E - P R O C E S S I N G : */ /* */ /*************************************************************************************************************************************/ #ifndef FICHIER_COURANT_RELATIF /* Introduit le 20230125142132 suite a la remarque 'v $xcc/RecompileAll$Z 20230125133123'... */ # define FICHIER_COURANT_RELATIF \ __FILER__ \ /* Permet d'acceder au nom relatif au "home directory" (par rapport a '$x') du fichier */ \ /* courant ; ceci est du a la definition de la variable 'Includes' (dans la commande de */ \ /* compilation 'cb$Z') avec le nom relatif au "home directory" du directory general */ \ /* d'includes ; enfin ceci est aussi du a l'option '-I' du pre-processing fixant le */ \ /* "home directory" ('$x') : */ \ /* */ \ /* nous avons donc : */ \ /* */ \ /* Includes ==> "includes" */ \ /* -I ==> "$x" */ \ /* */ \ /* et donc : */ \ /* */ \ /* __FILER__ ==> "le nom du fichier courant relativement a '$x'". */ \ /* */ \ /* On notera que suite a l'introduction de 'FICHIER_COURANT_ABSOLU' le 20040924143237, */ \ /* 'FICHIER_COURANT' a ete rebaptise en 'FICHIER_COURANT_RELATIF'... */ #Aifndef FICHIER_COURANT_RELATIF #Eifndef FICHIER_COURANT_RELATIF #ifndef FICHIER_COURANT_ABSOLU /* Introduit le 20230125142132 suite a la remarque 'v $xcc/RecompileAll$Z 20230125133123'... */ # define FICHIER_COURANT_ABSOLU \ __FILE__ \ /* Permet d'acceder au nom absolu (par rapport a la racine du systeme '$Dracine') du */ \ /* fichier courant (introduit le 20040924143237). */ #Aifndef FICHIER_COURANT_ABSOLU #Eifndef FICHIER_COURANT_ABSOLU #define FICHIER_COURANT_ABSOLU_x \ "$x/" QDQD@@QDQD FICHIER_COURANT_RELATIF \ /* Permet d'acceder au nom absolu du fichier courant (introduit le 20120412091711), mais en */ \ /* se referencant a '$x', contrairement a 'FICHIER_COURANT_ABSOLU'... */ #define NOM_SYNTHETIQUE_DU_FICHIER_COURANT \ __NOM_SYNTHETIQUE__ #define NOM_SYNTHETIQUE_NON_QUOTE_DU_FICHIER_COURANT \ __NOM_SYNTHETIQUE_NON_QUOTE__ /* Permet d'acceder au nom "synthetique" du fichier courant qui est ensuite exploite dans */ /* 'v $xig/fonct$vv$DEF EN_TETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV'. La */ /* version "non quotee" a ete introduite le 20040421112538. */ #define LIGNE_COURANTE \ INTE(__LINE__) \ /* Permet d'acceder au numero de la ligne courante de la macro la plus externe qui */ \ /* reference 'LIGNE_COURANTE'. On notera la fonction 'INTE(...)' mise en place le 1995072400 */ \ /* afin d'eviter des problemes du type : */ \ /* */ \ /* ...: warning(1177): argument is incompatible with formal */ \ /* */ \ /* dans 'print_defaut(...)' sur 'SYSTEME_SGPCM801_IRIX_CC'... */ \ /* */ \ /* On notera qu'a compter du 20000720115851 cette valeur peut etre nulle dans le cas ou */ \ /* l'on n'a pu determiner sa valeur ('v $xcc/cpp$Z 20000720115851'), par exemple donc dans */ \ /* le cas de la derivation formelle... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E P R E S E N T A T I O N D E S F O R M U L E S : */ /* */ /* */ /* Nota important : */ /* */ /* Les noms des fonctions suivantes */ /* sont choisis de telle facon qu'ils */ /* fassent exactement 4 caracteres ; */ /* ainsi, en ajoutant la parenthese */ /* qui suit leur appel, on trouve 4+1=5, */ /* ce qui correspond a la tabulation */ /* choisie (5), qui elle-meme divise */ /* exactement 10... */ /* */ /* De plus, les definitions ne sont */ /* suivies d'aucun ";", afin de pouvoir */ /* les combiner sans limites... */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* B U G S T R E S G E N E R A U X : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E L I G N E S O U R C E : */ /* */ /*************************************************************************************************************************************/ #define LONGUEUR_D_UNE_LIGNE_SOURCE PARE(134) \ /* Longueur maximale des lignes de source ; elle correspond a ce qu'il faut essayer de ne */ \ /* depasser en ce qui concerne les lignes d'instructions standard (non commentaires et non */ \ /* suite de macro-procedures). */ \ /* */ \ /* ATTENTION : on notera le fait que la definition precedente tient sur une seule ligne ; */ \ /* ceci est du au fait qu'elle est recuperee pour validation par '$Fenviron'... */ #define LONGUEUR_D_UNE_LIGNE_SOURCE_ETOILE \ LONGUEUR_D_UNE_LIGNE_SOURCE \ /* Nombre de caracteres d'une ligne de commentaires jusqu'a la derniere '*' comprise. */ #define LONGUEUR_D_UNE_LIGNE_SOURCE_SLASH \ SUCC(LONGUEUR_D_UNE_LIGNE_SOURCE_ETOILE) \ /* Nombre de caracteres d'une ligne de commentaires jusqu'au dernier '/' compris. */ #define LONGUEUR_D_UNE_LIGNE_SOURCE_BLANC \ SUCC(LONGUEUR_D_UNE_LIGNE_SOURCE_SLASH) \ /* Nombre de caracteres d'une ligne suite de macro-procedure jusqu'au dernier ' ' compris ; */ \ /* elle correspond a la variable 'LONGUEUR_LIGNE' definie dans '$Fenviron'. */ #define LONGUEUR_D_UNE_LIGNE_SOURCE_ANTI_SLASH \ SUCC(LONGUEUR_D_UNE_LIGNE_SOURCE_BLANC) \ /* Nombre de caracteres d'une ligne suite de macro-procedure jusqu'au dernier '\' compris. */ #define LONGUEUR_D_UNE_LIGNE_SOURCE_LINE_FEED \ SUCC(LONGUEUR_D_UNE_LIGNE_SOURCE_ANTI_SLASH) \ /* Nombre de caracteres d'une ligne suite de macro-procedure jusqu'au caractere 'K_LF'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E D ' E V A L U A T I O N D E S A R G U M E N T S D ' U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define PARG(fonction) \ NEUT(fonction) \ /* Autorise l'evaluation parallele des arguments de la fonction 'fonction(...)'. C'est */ \ /* l'etat implicite... */ #define SARG(fonction) \ NEUT(fonction) \ /* Demande l'evaluation sequentielle des arguments de la fonction 'fonction(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I N D E F I N I L E P L U S G E N E R A L : */ /* */ /*************************************************************************************************************************************/ #define gUNDEF \ ZERO \ /* Cet 'UNDEF' a ete introduit le 19971118091526 a cause de la nouvelle procedure */ \ /* 'gLOAD_FICHIER_AVEC_CONVERSION(...)' qui doit generer la variable 'valeur_du_nom' */ \ /* dont le type est a priori inconnu. Il convient donc alors de choisir une valeur initiale */ \ /* dont la "taille" soit compatible avec tous les types possibles. Le zero est le meilleur */ \ /* candidat... */ #define gnnUNDEF \ UN \ /* Cet 'UNDEF' a ete introduit le 20030528154708 a cause, en particulier, de la definition */ \ /* 'v $xci/valeurs_alea$K NOMBRE_DE_NOMBRES_ENTIERS_DIFFERENTS'. En effet, dans ce cas, il */ \ /* est souhaitable de faire une allocation memoire minimale, mais Non Nulle... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U " V I D E " : */ /* */ /*************************************************************************************************************************************/ #ifdef DEFV_CAST_VERSION_01 # define VIDE /* Block vide... */ # define NOM_VIDE \ VIDE /* Pour caracteriser un nom absent dans un 'DstructXY()' ou un 'Dunion_XY()' par exemple... */ #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 & define VIDE /* Block vide... */ & define NOM_VIDE VIDE /* Pour caracteriser un nom absent dans un 'DstructXY()' ou un 'Dunion_XY()' par exemple... */ #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define VIDE /* Block vide... */ # define NOM_VIDE \ VIDE /* Pour caracteriser un nom absent dans un 'DstructXY()' ou un 'Dunion_XY()' par exemple... */ #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 @define SUPPRIMER(sequence) VIDE /* Pour supprimer une certaine sequence (introduit le 20050104133253). */ /* */ /* ATTENTION : on notera l'absence de ligne suite ci-dessus ('\') du a l'utilisation de la */ /* 'PASSE_5' pour la definition 'SUPPRIMER(...)'... */ /* */ /* On n'oubliera pas l'existence de 'SEQUENCE_ARCHAIQUE(...)', de 'AAAAMMJJhhmmss(...)' */ /* (ou 'AAAAMMJJhhmmss' est une date a laquelle fut supprimee une certaine sequence...) */ /* ainsi que de 'SUPPRIME_LE_AAAAMMJJhhmmss(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C T I O N S U R L E S S T R U C T U R E S : */ /* */ /*************************************************************************************************************************************/ #define OPST(nom_de_structure) \ PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(PARE(nom_de_structure)))))))))))))))) \ /* Pour permettre d'appeler une macro avec comme argument un nom de structure, sachant */ \ /* que dans cette macro certains elements de celle-ci vont etre affectes par une fonction */ \ /* dont le nom "encadre" ce nom de structure. Par exemple : */ \ /* */ \ /* 'normF3D(vectorA)' permet de calculer la norme d'un vecteur quelconque 'vectorA'. */ \ /* */ \ /* si on appelle cette macro par : */ \ /* */ \ /* normF3D(SINX(OPST(V1))) */ \ /* */ \ /* la fonction 'SINX()' sera appliquee a chaque element du vecteur 'V1'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S P A R T I C U L I E R D E S T A B L E A U X : */ /* */ /*************************************************************************************************************************************/ #ifdef DEFV_CAST_VERSION_01 # message "La version 'DEFV_CAST_VERSION_01' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 # message "La version 'DEFV_CAST_VERSION_02' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define TypedefD1(vecteur,dimension_X,type) \ = define vecteur(var) type(DTb1(var,dimension_X)) /* Definition d'un tableau a une dimension (ou vecteur). */ # define TypedefD2(matrice,dimension_Y,dimension_X,type) \ = define matrice(var) type(DTb2(var,dimension_Y,dimension_X)) /* Definition d'un tableau a deux dimensions (ou matrice). */ # define TypedefD3(tenseur3,dimension_Z,dimension_Y,dimension_X,type) \ = define tenseur3(var) type(DTb3(var,dimension_Z,dimension_Y,dimension_X)) /* Definition d'un tableau a trois dimensions (ou tenseur3). */ # define TypedefD4(tenseur4,dimension_Z,dimension_Y,dimension_X,type) \ = define tenseur4(var) type(DTb4(var,dimension_T,dimension_Z,dimension_Y,dimension_X)) /* Definition d'un tableau a quatre dimensions (ou tenseur4) introduite le 20081216141452. */ #Aifdef DEFV_CAST_VERSION_03 #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S " V I D E " : */ /* */ /*************************************************************************************************************************************/ TypedefS(A___Void,Void) TypedefS(E___Void,Void) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S C A R A C T E R E S : */ /* */ /*************************************************************************************************************************************/ TypedefS(A___Char,Char) TypedefS(E___Char,Char) TypedefS(A___CHAR,CHAR) TypedefS(E___CHAR,CHAR) /* Definition des types caracteres... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S T S T A N D A R D S ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : le 20071121130434 a cause de 'SYSTEME_APC_LinuxUbuntu_GCC' les 'CAST's */ /* 'CARA(...)' et 'ptCARA(...)' ont ete mis ici... */ #define CARA(x) \ CAST(CHAR,x) \ /* Cast "CHAR", */ #define ptCARA(x) \ ptCAST(CHAR,x) \ /* Et son pointeur associe... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " C A S T " D E P O R T A B I L I T E E T D E B O O T S T R A P P I N G : */ /* */ /*************************************************************************************************************************************/ @if ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) /* Introduit sous cette forme grace a la modification 'v $xcc/cpp$Z 20070926141449'... */ @ define Cara(x) ptCAST(Char,x) /* Cast "Cara" destine a resoudre le probleme des fonctions du type 'Print' et 'Scan' */ /* pour lesquelles, sur ces 'SYSTEME's les caracteres sont signes... */ /* */ /* ATTENTION : on notera l'absence de ligne suite ci-dessus ('\') du a l'utilisation de */ /* la 'PASSE_5' pour la definition 'Cara(...)', de plus 'ptCAST(...)' doit etre defini... */ @Aif ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) @ if ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Le SYSTEME 'SYSTEME_APC_LinuxRedHat_GCC' a ete introduit le 20090318090909 suite au */ /* remplacement de "trinite.polytechnique.fr" par "europe.polytechnique.fr" (='$CMAP28', */ /* 'v $Fmachines 20090316110150'). */ @ define Cara(x) ptCARA(x) @ Aif ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @ define Cara(x) NEUT(x) /* Cast "Cara". */ /* */ /* ATTENTION : on notera l'absence de ligne suite ci-dessus ('\') du a l'utilisation de */ /* la 'PASSE_5' pour la definition 'Cara(...)', de plus 'ptCAST(...)' doit etre defini... */ @ Eif ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) @Eif ( (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S E N T I E R : */ /* */ /*************************************************************************************************************************************/ TypedefS(A___Int,Int) TypedefS(E___Int,Int) TypedefS(A___ShortInt,ShortInt) TypedefS(E___ShortInt,ShortInt) TypedefS(A___LongInt,LongInt) TypedefS(E___LongInt,LongInt) /* Definition des types 'short' et 'long' a partir de '_Int'. */ TypedefS(A___Positive,Positive) TypedefS(E___Positive,Positive) /* Definition des types 'Positive' a partir de 'Int' (et non pas de '_int', afin qu'il */ /* soit 'Long' ou 'Short' suivant le cas...). */ /* */ /* ATTENTION : on notera le danger de l'utilisation conjointe des type 'Int' et 'Positive'. */ /* Soit l'exemple suivant : */ /* */ /* DEFV(Int,INIT(index,UNDEF)); */ /* DEFV(Positive,INIT(borne,...)); */ /* . */ /* . */ /* . */ /* DoIn(index,NEGA(borne),NEUT(borne),I) */ /* Bblock */ /* . */ /* . */ /* . */ /* Eblock */ /* EDoI */ /* */ /* la boucle 'DoIn(...)' ne sera jamais executee, car en effet 'NEGA(borne)' est considere */ /* comme etant positif et sa valeur est superieure a 'NEUT(borne)' a cause du bit de signe. */ TypedefS(A___PointerInt,PointerInt) TypedefS(E___PointerInt,PointerInt) /* Definition des types 'PointerInt'. */ TypedefS(Dummy,Int) /* Definition d'un type "bidon" destine par exemple a definir des structures qui devraient */ /* etre vide, mais ce que le compilateur du CRAY2 refuse... */ TypedefS(tI,Int) TypedefS(A___tI,Int) /* Introduits le 20040623093006 pour 'v $xig/fonct$vv$FON GENERE__FonctionI_Fload' depuis */ /* que les 'GENERE__Fonction...(...)' sont pris en compte dans les '$EXT'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S F L O T T A N T S : */ /* */ /*************************************************************************************************************************************/ TypedefS(A___Float,Float) TypedefS(E___Float,Float) TypedefS(A___Double,Double) TypedefS(E___Double,Double) /* Definition des types flottants... */ TypedefS(tF,Float) TypedefS(A___tF,Float) /* Introduits le 20040623093006 pour 'v $xig/fonct$vv$FON GENERE__FonctionI_Fload' depuis */ /* que les 'GENERE__Fonction...(...)' sont pris en compte dans les '$EXT'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S A C C E S O I R E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O T S C L E F S P O U R L E S T Y P E S : */ /* */ /*************************************************************************************************************************************/ TypedefT(Logical,Positive) TypedefS(A___Logical,Logical) TypedefS(E___Logical,Logical) /* Type logique. */ TypedefT(binaire,Positive) TypedefS(A___binaire,binaire) TypedefS(E___binaire,binaire) /* Type binaire. */ #ifdef Register_VERSION_01 TypedefT(Rchar,CONC(Register,CHAR)) /* Type "CHAR" dans un registre. */ TypedefT(Rint,CONC(Register,Int)) /* Type "Int" dans un registre. */ TypedefT(Runsigned,CONC(Register,Positive)) /* Type "Positive" dans un registre. */ TypedefT(Rfloat,CONC(Register,Float)) /* Type "Float" dans un registre. */ #Aifdef Register_VERSION_01 #Eifdef Register_VERSION_01 #ifdef Register_VERSION_02 #Aifdef Register_VERSION_02 #Eifdef Register_VERSION_02 TypedefT(Schar,CONC(Static,CHAR)) /* Type "CHAR" statique. */ TypedefT(Sint,CONC(Static,Int)) /* Type "Int" statique. */ TypedefT(Sunsigned,CONC(Static,Positive)) /* Type "Positive" statique. */ TypedefT(Sfloat,CONC(Static,Float)) /* Type "Float" statique. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O B J E T S D E D I M E N S I O N S T A T I Q U E S : */ /* */ /*************************************************************************************************************************************/ TypedefAES(Statique,S___ <><> ) /* Ce mot clef doit etre mis devant toutes les definitions des objets dont la dimension */ /* est statique : c'est le cas par exemple des images de '$xiii/Images$STR' et de */ /* '$xiii/Imagess$STR'. On notera la syntaxe tres particuliere 'S___ <><> ' destinee a */ /* obtenir la concatenation du prefixe 'S___' des objets statiques a un type quelconque */ /* ('Int', 'Float',...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T A I L L E S D E S T Y P E S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ #define size_char \ SIZP(_char) #define size_CHAR \ SIZP(KONC(_unsigned,_char)) #define size_vrai_Int_de_base \ SIZP(_int) #define size_vrai_Positive_de_base \ SIZP(KONC(_unsigned,_int)) /* Types introduits le 20100326184826... */ #if (PRECISION_DU_Int==SIMPLE_PRECISION) # define size_Int \ size_vrai_Int_de_base # define size_Positive \ size_vrai_Positive_de_base #Aif (PRECISION_DU_Int==SIMPLE_PRECISION) #Eif (PRECISION_DU_Int==SIMPLE_PRECISION) #if (PRECISION_DU_Int==DOUBLE_PRECISION) # define size_Int \ SIZP(KONC(_long,_int)) # define size_Positive \ SIZP(KONC(_unsigned,KONC(_long,_int))) #Aif (PRECISION_DU_Int==DOUBLE_PRECISION) #Eif (PRECISION_DU_Int==DOUBLE_PRECISION) /* ATTENTION, on notera que l'on ne peut ecrire : */ /* */ /* #define size_Int \ */ /* SIZP(Int) */ /* #define size_Int \ */ /* SIZP(Positive) */ /* */ /* puisque 'Int' et 'Positive' sont en fait des fonctions. Pour eviter des conflits et des */ /* incoherences, il serait bon qu'il n'y ait plus qu'un seul type d'entier... */ #define size_LPositive \ SIZP(KONC(_unsigned,KONC(_long,_int))) \ /* Ajoute le 20001102164045 car il manquait et provoquait une grosse anomalie au niveau */ \ /* des images de type 'imageU' dont la longueur (au niveau des fichiers) etait moitie de */ \ /* qu'elle devait etre... */ #if (SYSTEME_32_64_BITS==SYSTEME_32_BITS) # define ADRESSAGE_VERSION_32_BITS_DEFINI TypedefS(PointerInt,Int) # define size_PointerInt \ size_vrai_Int_de_base \ /* Cas des machines "32 bits" (introduit le 20000221094143 et modifie le 20000222085131)... */ #Aif (SYSTEME_32_64_BITS==SYSTEME_32_BITS) # if (SYSTEME_32_64_BITS==SYSTEME_64_BITS) # define ADRESSAGE_VERSION_64_BITS_DEFINI TypedefS(PointerInt,LongInt) # define size_PointerInt \ SIZP(KONC(_long,_int)) \ /* Cas des machines "64 bits" (introduit le 20000221094143 et modifie le 20000222085131)... */ # Aif (SYSTEME_32_64_BITS==SYSTEME_64_BITS) # message "ATTENTION : le type d'adressage (32/64 bits) n'a pas ete defini." # define ADRESSAGE_VERSION_64_BITS_INDEFINI TypedefS(PointerInt,LongInt) # define size_PointerInt \ SIZP(KONC(_long,_int)) \ /* Cas indetermines (introduit le 20000221094143 et modifie le 20000222085131). Il vaut */ /* mieux etre prudent... */ # Eif (SYSTEME_32_64_BITS==SYSTEME_64_BITS) #Eif (SYSTEME_32_64_BITS==SYSTEME_32_BITS) #define size_Logical \ size_Positive #define k___size_Float \ SIZP(_float) #define size_vrai_float_de_base \ k___size_Float /* Taille d'un element 'Float'. */ /* */ /* ATTENTION : la constante 'size_Float' est pre-generee dans '$xcp/Konstantes$K'. */ /* Ceci a ete introduit le 19970905140951 afin de permettre de connaitre cette valeur a */ /* l'exterieur des programmes (via '$xcp/Konstantes$K') et par exemple dans les fichiers */ /* de '$xE'. */ /* */ /* La constante 'size_vrai_float_de_base' a ete introduite le 20170406105520... */ #define size_Double \ SIZP(_double) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S A U V E G A R D E E T R E S T A U R A T I O N D E V A R I A B L E S S C A L A I R E S : */ /* */ /*************************************************************************************************************************************/ #define EnTete_de_sauvegardA \ SavA_____ #define EnTete_de_sauvegardM \ SavM_____ /* En tete precedant a priori le nom des variables scalaires de type "sauvegarde"... */ /* */ /* Le 20110418171139, 'EnTete_de_sauvegarde' a ete remplace par 'EnTete_de_sauvegardA' */ /* (pour "Automatique", c'est-a-dire via les procedures de type 'SaveVariable(...)' et */ /* par 'EnTete_de_sauvegardM' (pour "Manuel", c'est-a-dire via des 'DEFV(...)' explicites). */ #define gBSaveVariable(type,variable) \ DEFV(type,INIT(EnTete_de_sauvegardA ## variable,variable)); #define BSaveVariable(type,variable) \ BblockV \ gBSaveVariable(type,variable); /* Sauvagarde d'une variable scalaire (introduite le 20090506152409 et complete le */ /* 20090506224542 avec 'SaveVariable(...)' pour prendre en compte les cas ou il ne */ /* faut surtout pas de 'ESave...(...)', c'est-a-dire les cas ou il ne faut pas restaurer */ /* la valeur anterieure de la variable : voir 'v $xig/fonct$vv$DEF SaveVariable'). */ /* */ /* Le 20111212162652 'SaveVariable(...)' a ete rebaptise en 'gBSaveVariable(...)' afin */ /* de permettre l'introduction de 'gESaveVariable(...)'... */ #define BSaveModifyVariable(type,variable,nouvelle_valeur) \ BblockV \ BSaveVariable(type,variable); \ EGAL(variable,nouvelle_valeur); \ /* Sauvagarde et modification d'une variable scalaire (introduite le 20090506152409). */ #define ESaveModifyVariable(type,variable) \ ESaveVariable(type,variable); \ EblockV #define ESaveVariable(type,variable) \ gESaveVariable(type,variable); \ EblockV #define gESaveVariable(type,variable) \ EGAL(variable,EnTete_de_sauvegardA ## variable); \ /* Restauration d'une variable scalaire (introduite le 20090506152409). */ /* */ /* Le 20111212162652 'gBSaveVariable(...)' a ete introduit... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef size_Float \ k___size_Float /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S T S T A N D A R D S ( S U I T E ) : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : le 20071121130434 a cause de 'SYSTEME_APC_LinuxUbuntu_GCC' les 'CAST's */ /* 'CARA(...)' et 'ptCARA(...)' ont ete deplaces... */ #define LOGI(x) \ CAST(Logical,x) \ /* Cast "Logical", */ #define fLOGI(x) \ LOGI(AINT_a_peu_pres(x,tgEPSILON)) \ /* Cast "Logical" a partir d'un 'x' flottant. Cela fut introduit le 20060602094911 pour */ \ /* 'v $xrs/surfaces.12$I 20060602091942' et 'v $xrs/volumes.12$I 20060602091935'... */ #define SHOR(x) \ CAST(ShortInt,x) \ /* Cast "Short Int", */ #if ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # define INTE(x) \ CAST(Int,x) \ /* Version CRAY2, */ \ /* version CRAYC98, */ \ /* version CRAYC916, */ \ /* version CRAYYMP1, */ \ /* version CRAYYMP2, */ \ /* version CRAYYMP4, */ \ /* version DECALPHA340/OSF1/CC, */ \ /* version DECALPHA350/OSF1/CC, */ \ /* version DECALPHA464/OSF1/CC. */ \ /* */ \ /* ATTENTION, sur 'SYSTEME_DECALPHA340_OSF1_CC' et 'SYSTEME_DECALPHA350_OSF1_CC, ne pas */ \ /* faire cela conduit a des problemes lors de l'evaluation de certaines constantes, et en */ \ /* particulier 'MHEXA' (sa valeur dans '$xcp/Konstantes$X' est '0x00000001'). */ #Aif ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # if (SYSTEME_32_64_BITS==SYSTEME_32_BITS) # define INTE(x) \ CAST(LongInt,x) \ /* Cast "Long Int" (version par defaut...), */ # Aif (SYSTEME_32_64_BITS==SYSTEME_32_BITS) # Eif (SYSTEME_32_64_BITS==SYSTEME_32_BITS) # if (SYSTEME_32_64_BITS==SYSTEME_64_BITS) # define INTE(x) \ CAST(Int,x) \ /* Ceci a ete introduit le 20041208142936 pour '$LACT17' car, en effet, en utilisant la */ \ /* definition via 'LongInt', certaines constantes ('NOMBRE_D_OCTETS_DIFFERENTS' par exemple) */ \ /* se retrouvent negatives... */ # Aif (SYSTEME_32_64_BITS==SYSTEME_64_BITS) # Eif (SYSTEME_32_64_BITS==SYSTEME_64_BITS) #Eif ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ || (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) #define PINTE(x) \ INTE(x) \ /* Introduit le 20230311135805 a cause de 'v $xtc/ImpressionConstanteEntiereNegative.01$c'. */ \ /* On notera que l'on aurait pu utiliser directement 'INTE(...)' dans les impressions (voir */ \ /* par exemple 'v $xci/Ising_2D.11$K PINTE'), mais utiliser explicitement 'INTE(...)' permet */ \ /* de reperer facilement les impressions qui ont pose ce genre de probleme... */ #define POSI(x) \ CAST(Positive,x) \ /* Cast "Positive". */ -define FLOT(x) \ -_-_-_- CAST(Float,x) /* Cast "Float", */ #if ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ ) # define DPRE(x) \ CAST(Float,x) \ /* Version CRAY2, */ \ /* version CRAYC98, */ \ /* version CRAYC916, */ \ /* version CRAYYMP1, */ \ /* version CRAYYMP2, */ \ /* version CRAYYMP4. */ #Aif ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ ) # define DPRE(x) \ CAST(Double,x) \ /* Cast "Double" (version par defaut...), */ #Eif ( (defined(SYSTEME_CRAY2)) \ || (defined(SYSTEME_CRAYC98)) \ || (defined(SYSTEME_CRAYC916)) \ || (defined(SYSTEME_CRAYYMP1)) \ || (defined(SYSTEME_CRAYYMP2)) \ || (defined(SYSTEME_CRAYYMP4)) \ ) #define vbFLOT(x) \ CAST(vrai_Float_de_base,x) \ /* Cast "vrai Float de base" (introduit le 20090330121519). */ \ /* */ \ /* On notera le 20101220161611 qu'ecrire : */ \ /* */ \ /* FLOT(vbFLOT(x)) */ \ /* */ \ /* 'x' etant de type 'Float' aura en general pour effet de reduire la precision de 'x' de */ \ /* 64 a 32 bits. Cela pourrait donc etre utilise pour "simuler" des calculs effectues en */ \ /* precision reduite ('vrai_Float_de_base', au lieu de 'vrai_Double_de_base' a priori...). */ #ifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 # define ConversionEventuelle_CHAR(x) \ NEUT(x) \ /* Introduit le 20040619183253... */ # define ConversionEventuelle_Int(x) \ NEUT(x) \ /* Introduit le 20040623115231... */ # define ConversionEventuelle_Float(x) \ NEUT(x) \ /* Introduit le 20040619191221... */ #Aifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 #Eifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_01 #ifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 # define ConversionEventuelle_CHAR(x) \ ptCARA(x) \ /* Introduit le 20040619183253... */ # define ConversionEventuelle_Int(x) \ ptCAST(Int,x) \ /* Introduit le 20040623115231... */ # define ConversionEventuelle_Float(x) \ ptCAST(Float,x) \ /* Introduit le 20040619191221... */ #Aifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 #Eifdef DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02 #define DECI(x) \ bSOU(x,AINT(x)) \ /* Procedure "complementaire" de 'INTE(...)' donnant la partie decimale d'un nombre, alors */ \ /* que 'INTE(...)' donne la partie entiere (introduit le 20081222113242). On notera donc */ \ /* que : */ \ /* */ \ /* NEUT(x) == ADD2(INTE(x),DECI(x)) */ \ /* */ \ /* theoriquement... */ \ /* */ \ /* Le 20101120092003, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ \ /* */ \ /* Avant le 20151210133045, il y avait ici : */ \ /* */ \ /* #define DECI(x) \ */ \ /* bSOU(x,INTE(x)) */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* H O R R E U R S P O U R A C C E L E R E R L E */ /* P R E - P R O C E S S I N G E T L A C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : les constantes {DEUX,TROIS,...,VINGT_QUATRE,VINGT_CINQ} sont pre-generees */ /* avec '$xcp/Konstantes$K'... */ #define k___DEUX \ ENUM(_2) #define k___TROIS \ ENUM(_3) #define k___QUATRE \ ENUM(_4) #define k___CINQ \ ENUM(_5) #define k___SIX \ ENUM(_6) #define k___SEPT \ ENUM(_7) #define k___HUIT \ ENUM(_8) #define k___NEUF \ ENUM(_9) #define k___DIX \ ENUM(_10) #define k___ONZE \ ENUM(_11) #define k___DOUZE \ ENUM(_12) #define k___TREIZE \ ENUM(_13) #define k___QUATORZE \ ENUM(_14) #define k___QUINZE \ ENUM(_15) #define k___SEIZE \ ENUM(_16) #define k___DIX_SEPT \ ENUM(_17) #define k___DIX_HUIT \ ENUM(_18) #define k___DIX_NEUF \ ENUM(_19) #define k___VINGT \ ENUM(_20) #define k___VINGT_ET_UN \ ENUM(_21) #define k___VINGT_DEUX \ ENUM(_22) #define k___VINGT_TROIS \ ENUM(_23) #define k___VINGT_QUATRE \ ENUM(_24) #define k___VINGT_CINQ \ ENUM(_25) /* ATTENTION : les constantes {DEUX,TROIS,...,VINGT_QUATRE,VINGT_CINQ} sont pre-generees */ /* avec '$xcp/Konstantes$K'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autres ; en particulier 'DEUX' doit etre definie */ /* avant tout '-define ...' qui l'utilise... */ #TestADef DEUX \ k___DEUX #TestADef TROIS \ k___TROIS #TestADef QUATRE \ k___QUATRE #TestADef CINQ \ k___CINQ #TestADef SIX \ k___SIX #TestADef SEPT \ k___SEPT #TestADef HUIT \ k___HUIT #TestADef NEUF \ k___NEUF #TestADef DIX \ k___DIX #TestADef ONZE \ k___ONZE #TestADef DOUZE \ k___DOUZE #TestADef TREIZE \ k___TREIZE #TestADef QUATORZE \ k___QUATORZE #TestADef QUINZE \ k___QUINZE #TestADef SEIZE \ k___SEIZE #TestADef DIX_SEPT \ k___DIX_SEPT #TestADef DIX_HUIT \ k___DIX_HUIT #TestADef DIX_NEUF \ k___DIX_NEUF #TestADef VINGT \ k___VINGT #TestADef VINGT_ET_UN \ k___VINGT_ET_UN #TestADef VINGT_DEUX \ k___VINGT_DEUX #TestADef VINGT_TROIS \ k___VINGT_TROIS #TestADef VINGT_QUATRE \ k___VINGT_QUATRE #TestADef VINGT_CINQ \ k___VINGT_CINQ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S F L O T T A N T E S G E N E R A L E S : */ /* */ /*************************************************************************************************************************************/ /* Les definitions relatives aux constantes flottantes generales furent mises ici le */ /* 20071130225230 suite a la remarque 'v $xcc/cpp$Z 20071130220903' car, en effet, elles */ /* doivent preceder la la definition des operateurs derivables... */ #define k___FZERO \ FLOT(ZERO) \ /* Constante nulle en flottant. */ \ /* */ \ /* ATTENTION : la constante 'FZERO' est pre-generee dans '$xcp/Konstantes$K'. */ #define tgEPSILON \ PARE(1.0E-3) \ /* "Grand" petit nombre flottant... */ #define igEPSILON \ PARE(1.0E-6) \ /* "Intermediaire" petit nombre flottant (introduit le 20120524104144)... */ #define mgEPSILON \ PARE(1.0E-9) \ /* "Moyen" petit nombre flottant... */ #define gEPSILON \ PARE(1.0E-15) \ /* Petit nombre flottant... */ #define pEPSILON \ PARE(1.0E-30) \ /* Tres petit nombre flottant... */ #define UN_MOINS_tgEPSILON \ SOUS(FU,tgEPSILON) #define UN_MOINS_igEPSILON \ SOUS(FU,igEPSILON) #define UN_MOINS_mgEPSILON \ SOUS(FU,mgEPSILON) #define UN_MOINS_gEPSILON \ SOUS(FU,gEPSILON) #define UN_MOINS_pEPSILON \ SOUS(FU,pEPSILON) /* Quelques '1-epsilon' introduits le 20150307093000... */ #define W \ UN \ /* Element unique. */ #define UNITE \ UN \ /* Pour calculer par exemple des expressions du type 1-(a/b)... */ #define NEUTRE \ UN #define FLOT__NEUTRE \ FLOT(NEUTRE) /* Element neutre de la multiplication, 'FLOT__NEUTRE' ayant ete introduit le 20040229174106 */ /* pour 'v $xiii/tri_image$FON FLOT__NEUTRE'. */ #define k___FU \ FLOT(UN) \ /* Unite flottante. */ \ /* */ \ /* ATTENTION : la constante 'FU' est pre-generee dans '$xcp/Konstantes$K'. */ #define FU___ \ FU \ /* Introduit le 20120520122554 afin d'ameliorer la presentation de la valeur par defaut de */ \ /* certaines matrices. Avant cette date, cette definition figurait etrangement (et de facon */ \ /* non "optimisee") a deux endroits differents : 'v $xiii/di_image$FON 20120520122707' et */ \ /* 'v $xiipf/fonction.2$FON 20120520122602'... */ #define k___FDU \ MOIT(FU) \ /* Demi-unite flottante. */ \ /* */ \ /* ATTENTION : la constante 'FDU' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___FDEUX \ FLOT(DEUX) \ /* Double-unite flottante. */ \ /* */ \ /* ATTENTION : la constante 'FDEUX' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___FTROIS \ FLOT(TROIS) \ /* Triple-unite flottante. */ \ /* */ \ /* ATTENTION : la constante 'FTROIS' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___FQUATRE \ FLOT(QUATRE) \ /* Quadruple-unite flottante. */ \ /* */ \ /* ATTENTION : la constante 'FQUATRE' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___FCINQ \ FLOT(CINQ) #define k___FSIX \ FLOT(SIX) #define k___FSEPT \ FLOT(SEPT) #define k___FHUIT \ FLOT(HUIT) /* Constantes introduites le 20220425111738 pour 'v $xci/valeurs_TransformationPeano3D$K'... */ #define FQU \ MOIT(FDU) \ /* Quart-unite flottante. */ #define k___BEGIN_AT_0 \ SUCC(ZERO) \ /* Pour ce qui commence a 0. ATTENTION : autrefois cette valeur s'appelait ' Z ', mais */ \ /* afin de permettre d'utiliser la lettre 'Z' pour les troisiemes coordonnees, ce */ \ /* changement a ete opere... */ \ /* */ \ /* Le 20101119160847, 'BEGIN_AT_0' est devenue une constante fondamentale... */ #define CONSTANTE_DE_MOYENNE \ DEUX \ /* Pour faire des moyennes... */ #define B \ BEGIN_AT_0 \ /* Parce que le premier bit d'un mot a le rang 0... */ #define MAGIK \ SEPT \ /* Constante magique de "shuffling". */ #define MASK2 \ BIT \ /* Pour generer un masque a partir d'une puissance de 2, suivant les deux procedures */ \ /* suivantes : */ #define MASK_TO_P2(masque) \ bADD(masque,MASK2) \ /* Passage d'un masque a une puissance de 2... */ #define P2_TO_MASK(puissance_de_2) \ bSOU(puissance_de_2,MASK2) \ /* Passage d'une puissance de 2 a un masque... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef FZERO \ k___FZERO #TestADef FU \ k___FU #TestADef FDU \ k___FDU #TestADef FDEUX \ k___FDEUX #TestADef FTROIS \ k___FTROIS #TestADef FQUATRE \ k___FQUATRE #TestADef FCINQ \ k___FCINQ #TestADef FSIX \ k___FSIX #TestADef FSEPT \ k___FSEPT #TestADef FHUIT \ k___FHUIT /* Constantes introduites le 20220425111738 pour 'v $xci/valeurs_TransformationPeano3D$K'... */ #TestADef BEGIN_AT_0 \ k___BEGIN_AT_0 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S M A S Q U E S F O N D A M E N T A U X ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ /* Les definitions relatives a certains masques furent mises ici le */ /* 20071201093658 suite a la remarque 'v $xcc/cpp$Z 20071130220903' car, en effet, elles */ /* doivent preceder la la definition des operateurs derivables... */ #define gMASQUE(nombre_de_bits) \ SCLS(SARS(SBIT(MASQUE_VIDE,BITSIG),TRMU(nombre_de_bits)),nombre_de_bits) \ /* Definition du masque quelconque cadre a droite a partir de son 'nombre_de_bits'... */ #define MASQUE_VIDE \ ZERO \ /* Definition du masque vide... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N F I N I : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, depuis l'introduction de la derivation formelle, et etant donne le bug */ /* 'BUG_SYSTEME_SGIND_C_log', la definition de 'F_MOINS_L_INFINI' (et donc de */ /* 'F_INFINI') doit preceder la definition de 'LOGX(...)'... */ /* Les definitions relatives a l'infini furent mises ici le 20071130225230 suite a la */ /* remarque 'v $xcc/cpp$Z 20071130220903' car, en effet, elles doivent preceder la */ /* la definition des operateurs derivables... */ #if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) # TestADef BUG_SYSTEME_CRAY_C_INFINI \ /* Malheureusement, sur les CRAYs, il y a un probleme lors de l'initialisation d'une */ \ /* variable flottante avec une valeur entiere signee occupant plus de 48 bits : le bit de */ \ /* signe est alors perdu... */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) #Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ ) #define k___INFINI \ gMASQUE(TRMU(NBITMO)) \ /* Definition de l'infini entier positif. */ \ /* */ \ /* ATTENTION : la constante 'INFINI' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* On notera qu'aux environs du 20071202113349 et dans les jours suivants, il fut tenter */ \ /* de definir {k___MOINS_L_INFINI,k___INFINI} a l'aide de {INTPTR_MIN,INTPTR_MAX} qui sont */ \ /* definis dans '<stdint.h>', puis a l'aide de {INT_MIN,INT_MAX} qui eux sont definis dans */ \ /* '<limits.h>'. Or cela a conduit a des anomalies considerables dans '$xcc/cpp$Z' au */ \ /* niveau de la '$PASSE_1' ; ainsi, par exemple, la derivation formelle ne fonctionnait */ \ /* plus dans 'v $xrs/sphere.11$K' et 'VISUALISATION_DE_LA_SURFACE_AVEC_DIFFERENCES____(...)' */ \ /* donnait le message : */ \ /* */ \ /* argument mismatch (pas assez d'arguments a l'appel) */ \ /* */ \ /* dans 'v $xrs/CalabiYau.21$K'. Ces problemes disparaissant en supprimant l'include */ \ /* correspondant, sans que je puisse comprendre pourquoi... */ \ /* */ \ /* Ceci avait ete tente le 20071202113349 pour permettre de compiler '$xcp/Konstantes$K' */ \ /* avec 'GET_ARGUMENTSi(...)' a la place de 'GET_ARGUMENTS_(...)'. En effet, dans ce cas, */ \ /* 'SUPER_ECHELLE_GRAND_CARRE' et 'SUPER_ECHELLE_PETIT_CARRE' sont references via */ \ /* 'v $xig/fonct$vv$DEF CHOIX_DE_LA_SUPER_ECHELLE', or l'un comme l'autre font des */ \ /* 'DIVZ(...)'. Or cet operateur est derivable et sa definition lors de '$PASSE_1' de */ \ /* '$xcc/cpp$Z' ne contient plus le symbole 'INFINI', mais la definition a l'aide des */ \ /* operateurs 'RBIT(SARS(SBIT(...)))' qui n'ont pas pu etre remplaces par leur definition, */ \ /* puisque celles-ci n'apparaissent que plus loin (et il semble impossible de les placer */ \ /* au-dessus de ces lignes...). On notera au passage que le traitement de 'INFINI' dans */ \ /* 'v $xcp/Konstantes$K DEFINEX..INFINI..k___INFINI...INFINI....' ne pose pas de probleme */ \ /* puisqu'elle apparait apres la definition des operateurs 'RBIT(SARS(SBIT(...)))'... */ \ /* */ \ /* On notera qu'une solution plus simple fu trouvee le 20071203093149 et qui a consiste */ \ /* simplement a remplacer les 'DIVZ(...)'s par des 'fDIVZ(...)'s dans le fichier */ \ /* 'v $xiii/vecteurs$DEF 20071203093149'... */ #define k___MOINS_L_INFINI \ NEGA(INFINI) \ /* Definition de l'infini entier negatif. ATTENTION, on notera que pendant presqu'une */ \ /* eternite, il y a eu : */ \ /* */ \ /* #define k___MOINS_L_INFINI \ */ \ /* SBIT(MASQUE_VIDE,BITSIG) */ \ /* */ \ /* or, ainsi qu'on peut le voir grace au programme 'v $xtc/infini.02$c', les valeurs ainsi */ \ /* calculees pour 'k___MOINS_L_INFINI' et 'k___INFINI' ne sont pas compatibles : */ \ /* */ \ /* k___MOINS_L_INFINI = 0x80000000 = -2147483648 */ \ /* */ \ /* et : */ \ /* */ \ /* k___INFINI = 0x7fffffff = +2147483647 */ \ /* */ \ /* Ces deux constantes ne sont donc pas egales en valeur absolueR ; d'ou cette nouvelle */ \ /* definition pour 'k___MOINS_L_INFINI' ou l'on ajoute 1 a partir du 1994033000. Comme */ \ /* quoi, on peut vivre longtemps dans l'erreur. Une des consequences, est la modification */ \ /* correlative de la primitive 'VINTE(...)'. On notera au passage que : */ \ /* */ \ /* -0x80000000 = 0x80000000 */ \ /* */ \ /* ce qui est bizarre, mais valable sur tous les SYSTEMEs apparemment... */ \ /* */ \ /* ATTENTION : la constante 'MOINS_L_INFINI' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* Avant le 20100318095202 la definition etait : */ \ /* */ \ /* bADD(SBIT(MASQUE_VIDE,BITSIG),UN) */ \ /* */ \ /* et donc a cette date a ete simplifiee... */ #define k___PETIT_INFINI \ INTE(EXPX(MOIT(LOGX(FLOT(INFINI))))) \ /* Definition d'un "petit" infini positif (utile pour prevenir des debordements */ \ /* ulterieurs...). */ #if ( (defined(BUG_SYSTEME_CRAY_C_INFINI)) \ ) # undef k___MOINS_L_INFINI # define k___MOINS_L_INFINI \ NEGA(INFINI) \ /* On choisit des nombres entiers sur 48 (64-8-8) bits pour les CRAYs... */ \ /* */ \ /* Version CRAY.../UNICOS (rappelons que les decalages Arithmetiques n'existent pas...). */ \ /* */ \ /* ATTENTION : la constante 'MOINS_L_INFINI' est pre-generee dans '$xcp/Konstantes$K'. */ # if ( (defined(BUG_SYSTEME_C_SARS)) \ ) # undef k___INFINI # define k___INFINI \ TRMU(MOINS_L_INFINI) \ /* Version CRAY.../UNICOS (rappelons que les decalages Arithmetiques n'existent pas...). */ \ /* */ \ /* ATTENTION : voir le commentaire associe a la definition de 'SIZE_GENERAL(...)'. */ \ /* */ \ /* ATTENTION : la constante 'INFINI' est pre-generee dans '$xcp/Konstantes$K'. */ # Aif ( (defined(BUG_SYSTEME_C_SARS)) \ ) # undef k___INFINI # define k___INFINI \ TRMU(SLLS(BIT,bSOU(NBITMO,DOUB(NBITOC)))) \ /* On choisit des nombres entiers sur 48 (64-8-8) bits pour les CRAYs... */ \ /* */ \ /* Version CRAY.../UNICOS (rappelons que les decalages Arithmetiques n'existent pas...). */ \ /* */ \ /* ATTENTION : la constante 'INFINI' est pre-generee dans '$xcp/Konstantes$K'. */ # Eif ( (defined(BUG_SYSTEME_C_SARS)) \ ) #Aif ( (defined(BUG_SYSTEME_CRAY_C_INFINI)) \ ) #Eif ( (defined(BUG_SYSTEME_CRAY_C_INFINI)) \ ) #TestADef MOINS_L_INFINI \ k___MOINS_L_INFINI #TestADef INFINI \ k___INFINI #define SEPARATEUR_DE_LISTES_DE_COORDONNEES \ FLOT(PETIT_INFINI) \ /* Pour 'v $xrs/surfaces.51$I SEPARATEUR_DE_LISTE_DE_COORDONNEES' en particulier, cela fut */ \ /* introduit le 20230219110412... */ #TestADef PETIT_INFINI \ k___PETIT_INFINI #define D_INFINI \ PARE(1.0e308) \ /* Definition de l'infini double-precision positif. */ #define D_EPSILON \ PARE(5.0e-308) \ /* Definition de l'epsilon double-precision. Jusqu'au 20000929101624, c'est la valeur */ \ /* 'PARE(1.0e-308)' qui a ete utilisee ; mais en fait elle est trop petite par rapport */ \ /* a ce que sait faire la norme "IEEE 754". En fait, le 20000929180952, j'ai considere */ \ /* en etudiant le probleme de 'v $xiii/conversion$FON 20000929102058' qu'il etait plus */ \ /* astucieux de majore legerement la constante 2.225073858507201383e-308 ; 4.0e-308 */ \ /* me semble une valeur utile. Le 20001010145551 je l'ai augmentee (5.0e-308). */ #if ( (defined(SYSTEME_ES9000_AIX_CC)) \ ) # TestADef BUG_SYSTEME_ES9000_AIX_CC_EPSILON_ET_INFINI_double_precision \ /* Le compilateur 'cc' ne supporte pas les constantes 'double' trop grandes... */ #Aif ( (defined(SYSTEME_ES9000_AIX_CC)) \ ) #Eif ( (defined(SYSTEME_ES9000_AIX_CC)) \ ) #if ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) /* Le test 'nSYSTEM_RELEASE < 503000000' a ete ajoute le 20000929103523 car d'une part il */ /* semble que ce probleme soit tres ancien (et ne produise plus aujourd'hui) et d'autre */ /* part a cause de la modification 'v $xiii/conversion$FON 20000929102058'... */ # TestADef BUG_SYSTEME_SGIND_CC_EPSILON_double_precision \ /* Le compilateur 'cc' ne supporte pas les constantes 'double' trop petites... */ #Aif ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) #Eif ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) #if ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) # TestADef BUG_SYSTEME_VAX_C_EPSILON_ET_INFINI_double_precision \ /* Le compilateur 'gcc' ne supporte pas les constantes 'double' trop grandes... */ #Aif ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) #Eif ( (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_VCC)) \ ) #if ( (defined(BUG_SYSTEME_ES9000_AIX_CC_EPSILON_ET_INFINI_double_precision)) \ ) # undef D_INFINI # define D_INFINI \ PARE(1.0e75) \ /* Definition de l'infini double-precision positif. */ # undef D_EPSILON # define D_EPSILON \ PARE(1.0e-75) \ /* Definition de l'epsilon double-precision. */ #Aif ( (defined(BUG_SYSTEME_ES9000_AIX_CC_EPSILON_ET_INFINI_double_precision)) \ ) #Eif ( (defined(BUG_SYSTEME_ES9000_AIX_CC_EPSILON_ET_INFINI_double_precision)) \ ) #if ( (defined(BUG_SYSTEME_SGIND_CC_EPSILON_double_precision)) \ ) # undef D_EPSILON # define D_EPSILON \ PARE(1.0e-307) \ /* Definition de l'epsilon double-precision. */ #Aif ( (defined(BUG_SYSTEME_SGIND_CC_EPSILON_double_precision)) \ ) #Eif ( (defined(BUG_SYSTEME_SGIND_CC_EPSILON_double_precision)) \ ) #if ( (defined(BUG_SYSTEME_VAX_C_EPSILON_ET_INFINI_double_precision)) \ ) # undef D_INFINI # define D_INFINI \ PARE(1.0e38) \ /* Definition de l'infini double-precision positif. */ # undef D_EPSILON # define D_EPSILON \ PARE(1.0e-38) \ /* Definition de l'epsilon double-precision. */ #Aif ( (defined(BUG_SYSTEME_VAX_C_EPSILON_ET_INFINI_double_precision)) \ ) #Eif ( (defined(BUG_SYSTEME_VAX_C_EPSILON_ET_INFINI_double_precision)) \ ) #define D_MOINS_L_INFINI \ NEGA(D_INFINI) \ /* Definition de l'infini double-precision negatif. */ #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define k___F_INFINI \ PARE(1.0e38) \ /* Definition de l'infini flottant positif. */ # define F_EPSILON \ PARE(1.0e-38) \ /* Definition de l'epsilon flottant. */ # define GRAND_EPSILON \ PARE(1.0e-06) \ /* Definition du plus petit nombre encore significatif devant 'FU', c'est-a-dire pour */ \ /* lequel cela a un sens d'ecrire : */ \ /* */ \ /* SOUS(FU,GRAND_EPSILON) */ \ /* */ \ /* sans donc retomber sur 'FU'. Cette valeur est calculee grace a 'v $xtc/epsilon.01$c'... */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define k___F_INFINI \ D_INFINI \ /* Definition de l'infini flottant positif. */ # define F_EPSILON \ D_EPSILON \ /* Definition de l'epsilon flottant. */ # define GRAND_EPSILON \ PARE(1.0e-15) \ /* Definition du plus petit nombre encore significatif devant 'FU', c'est-a-dire pour */ \ /* lequel cela a un sens d'ecrire : */ \ /* */ \ /* SOUS(FU,GRAND_EPSILON) */ \ /* */ \ /* sans donc retomber sur 'FU'. Cette valeur est calculee grace a 'v $xtc/epsilon.01$c'... */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) #define TRES_GRAND_EPSILON \ PARE(1.0e-03) \ /* Introduit le 20171113104345 pour 'v $xrf/EpongeDeMenger.01$K TRES_GRAND_EPSILON'... */ #define k___F_MOINS_L_INFINI \ NEGA(F_INFINI) \ /* Definition de l'infini flottant negatif. */ #ifdef PRE_GENERATION # define k___F_PETIT_INFINI \ EXPX(MOIT(LOGX(F_INFINI))) \ /* Definition d'un "petit" infini flottant positif (utile pour prevenir des debordements */ \ /* ulterieurs...). */ #Aifdef PRE_GENERATION # define k___F_PETIT_INFINI \ PARE(1.0e16) \ /* Definition d'un "petit" infini flottant positif (utile pour prevenir des debordements */ \ /* ulterieurs...) mais arbitraire lorsque '$xcp/Konstantes$X' n'est pas utilise (voir */ \ /* 'v $xccp/cpp$Y 20100319090856'). */ #Eifdef PRE_GENERATION #define k___F_MOINS_LE_PETIT_INFINI \ NEGA(F_PETIT_INFINI) \ /* Definition d'un "petit" infini flottant negatif (utile pour prevenir des debordements */ \ /* ulterieurs...). */ #define UN_MOINS_EPSILON \ COMP(GRAND_EPSILON) \ /* Definition d'un nombre legerement inferieur a 1 (introduit le 20110420152113)... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R I N D E T E R M I N E E : */ /* */ /*************************************************************************************************************************************/ #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define NAN_VALEUR_INDETERMINEE \ PARE(-4194304) \ /* Introduit le 20240625142026 pour 'v $ximcf/fonction$FON NAN_VALEUR_INDETERMINEE'... */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define NAN_VALEUR_INDETERMINEE \ PARE(-2251799813685248) \ /* Introduit le 20240625142026 pour 'v $ximcf/fonction$FON NAN_VALEUR_INDETERMINEE'... */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) Dunion_02(EquivalenceIntFloat ,DEFV(Int,InT) /* Pour acceder a la valeur en entier (attention au 'T'...), */ ,DEFV(Float,FloaT) /* Pour acceder a la valeur en flottant (attention au 'T'...). */ ,NOM_VIDE ); /* L'union ainsi definie s'appelle "Equivalence_Int_Float", */ TypedefP(IntFloat,UNIO(EquivalenceIntFloat)) #define Equivalence_IntFloat_InT(argument) \ ASD1(argument,InT) #define Equivalence_IntFloat_FloaT(argument) \ ASD1(argument,FloaT) /* Procedures d'acces introduites le 20240625142026. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef F_INFINI \ k___F_INFINI #TestADef F_MOINS_L_INFINI \ k___F_MOINS_L_INFINI #TestADef F_PETIT_INFINI \ k___F_PETIT_INFINI #TestADef F_MOINS_LE_PETIT_INFINI \ k___F_MOINS_LE_PETIT_INFINI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " D E R I V E E " D E L ' I N F I N I : */ /* */ /*************************************************************************************************************************************/ #define d_F_INFINI \ d_FCONSTANTES #define d_F_PETIT_INFINI \ d_FCONSTANTES #define d_F_MOINS_L_INFINI \ d_FCONSTANTES #define d_F_MOINS_LE_PETIT_INFINI \ d_FCONSTANTES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E D E R I V A T I O N F O R M E L L E : */ /* */ /* */ /* Definition : */ /* */ /* Les derivees formelles des differents */ /* operateurs arithmetiques et des differentes */ /* fonctions mathematiques vont etre definies */ /* par la suite. Elles sont designees par : */ /* */ /* d_XXXX(...) */ /* */ /* Elles generent des symboles terminaux du type */ /* */ /* d_VARIABLE */ /* d_CONSTANTE */ /* */ /* ou 'd_VARIABLE' designe la differentielle de la */ /* variable 'VARIABLE', et 'd_CONSTANTE' celle de la */ /* constante 'CONSTANTE'. On devra donc bien entendu */ /* definir : */ /* */ /* #define d_CONSTANTE ZERO */ /* */ /* En ce qui concerne les variables, deux cas se */ /* presentent (et qui correspondent a la notion de */ /* derivee partielle). On devra donc definir : */ /* */ /* #define d_VARIABLE d_FVARIABLES_MUETTES */ /* */ /* ou : */ /* */ /* DEFV(Float,INIT(d_VARIABLE,d_FVARIABLES_MUETTES)); */ /* */ /* lorsque le derivation partielle n'a pas lieu par */ /* rapport a la variable 'VARIABLE', et : */ /* */ /* #define d_VARIABLE d_FVARIABLES_DE_DERIVATION */ /* */ /* ou : */ /* */ /* DEFV(Float,INIT(d_VARIABLE,d_FVARIABLES_DE_DERIVATION)); */ /* */ /* dans le cas contraire (ou la derivation partielle */ /* a lieu par rapport a la variable 'VARIABLE')... */ /* */ /* */ /* Un bon exemple d'utilisation est fourni par le */ /* programme 'v $xrf/recursif.11$K' qui fut le premier */ /* a tirer pleinement parti de cette possibilite, de */ /* meme que 'v $xrq/Hspherik.21$K' qui montre ce qu'il */ /* faut faire des '#undef ...' (voir aussi a ce propos */ /* 'v $xcc/cpp$Z'). */ /* */ /* On notera, que la derivee soit pre-definie dans ce */ /* fichier ('$xil/defi_K2$vv$DEF') ou pas (et doive donc */ /* etre calculee formellement), on ecrira systematiquement : */ /* */ /* d#FONCTION(...) */ /* */ /* et par exemple : */ /* */ /* d#MUL2(x1,x2) */ /* */ /* et : */ /* */ /* d#MUL3(x1,x2,x3) */ /* */ /* (voir 'v $xtKg/derivees.11$K'). */ /* */ /* */ /* Le 20101210222213 j'ai fait des tests afin de pouvoir */ /* utiliser : */ /* */ /* d#INTERPOLATION_CUBIQUE(...) */ /* */ /* dans '$ximf/courbes.1$FON d_INTERPOLATION_CUBIQUE_D_UN_ARC_DE_CUBIQUE'. */ /* En fait, si la derivation formelle est referencee directement (au premier */ /* niveau) dans 'v $xbmf/courbes.1$K', cela marche tres bien, a condition */ /* evidemment d'y mettre : */ /* */ /* @define PRAGMA_CPP_____MODULE_DERIVABLE */ /* */ /* Par contre dans '$ximf/courbes.1$FON' (donc au deuxieme niveau des */ /* 'include's) cela ne marche pas, or c'est evidemment la qu'il faudrait */ /* que cela soit implemente... */ /* */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E D E S C O N S T A N T E S : */ /* */ /*************************************************************************************************************************************/ #define d_CONSTANTES \ ZERO #define d_FCONSTANTES \ FZERO /* Elles sont nulles bien entendu ('d_FCONSTANTES' fut introduite le 20101222105716). */ #define d_ZERO \ d_CONSTANTES #define d_UN \ d_CONSTANTES #define d_DEUX \ d_CONSTANTES #define d_TROIS \ d_CONSTANTES #define d_QUATRE \ d_CONSTANTES #define d_CINQ \ d_CONSTANTES #define d_SIX \ d_CONSTANTES #define d_SEPT \ d_CONSTANTES #define d_HUIT \ d_CONSTANTES #define d_NEUF \ d_CONSTANTES #define d_DIX \ d_CONSTANTES #define d_ONZE \ d_CONSTANTES #define d_DOUZE \ d_CONSTANTES #define d_TREIZE \ d_CONSTANTES #define d_QUATORZE \ d_CONSTANTES #define d_QUINZE \ d_CONSTANTES #define d_SEIZE \ d_CONSTANTES #define d_I \ d_CONSTANTES #define d_SIGNE_MOINS \ d_CONSTANTES #define d_SIGNE_PLUS \ d_CONSTANTES #define d_INFINI \ d_CONSTANTES #define d_FZERO \ d_FCONSTANTES #define d_FDU \ d_FCONSTANTES #define d_FU \ d_FCONSTANTES #define d_FDEUX \ d_FCONSTANTES #define d_FTROIS \ d_FCONSTANTES #define d_FQUATRE \ d_FCONSTANTES /* ATTENTION, on notera que l'on definit explicitement les derivees des constantes 'FZERO' */ /* et 'FU' a cause de la pre-generation des constantes par '$xcp/Konstantes$K' ; il s'agit */ /* tout simplement de se simplifier la vie. L'introduction de 'd_FQUATRE' a eu lieu le */ /* 20030309103020 a cause de 'v $xrs/bKlein.51$I d_FQUATRE'. */ #define d_EN \ d_FCONSTANTES #define d_PI \ d_FCONSTANTES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E D E S V A R I A B L E S : */ /* */ /*************************************************************************************************************************************/ #define d_VARIABLES_DE_DERIVATION \ UN #define d_FVARIABLES_DE_DERIVATION \ FU #define d_VARIABLES_MUETTES \ ZERO #define d_FVARIABLES_MUETTES \ FZERO /* Elles sont egales a 1 ou a 0 suivant que l'on derive ou non par rapport a elles */ /* (introduites le 20101222105716). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E S D E S O P E R A T E U R S D E B A S E : */ /* */ /*************************************************************************************************************************************/ #define d_PARE(x) \ PARE(d#x) \ /* Derivee de la fonction de parenthesage : */ \ /* */ \ /* d(parenthese(x)) = parenthese(d(x)) */ \ /* */ #define d_NEUT(x) \ NEUT(d#x) \ /* Derivee de la fonction neutre : */ \ /* */ \ /* d(neutre(x)) = neutre(d(x)) */ \ /* */ #define d_CAST(type,x) \ CAST(type,d#x) \ /* Derivee des diverses fonction de conversion : */ \ /* */ \ /* d(cast(x)) = cast(d(x)) */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S U N I T E S D ' I N F O R M A T I O N : */ /* */ /*************************************************************************************************************************************/ #define BIT0 \ ZERO \ /* Numero du premier bit d'un mot. */ #define BIT7 \ LSTX(BIT0,NBITOC) \ /* Numero du dernier bit d'un octet (introduit le 20130707102427). */ #define BITSIG \ BIT0 \ /* Bit de signe d'un mot. */ #define k___NBITHX \ QUATRE \ /* Nombre de bits dans un chiffre hexa-decimal. */ \ /* */ \ /* ATTENTION : la constante 'NBITHX' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___NHXOC \ DEUX \ /* Nombre de chifres hexa-decimaux par octet (introduit le 20130705131934...). */ #define k___NBITOC \ bMUL(NHXOC,NBITHX) \ /* Nombre de bits contenus dans un octet (un octet contient 2 chiffres hexa-decimaux). */ \ /* */ \ /* ATTENTION : la constante 'NBITOC' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* Le 'bDOU(...)' a remplace 'DOUB(...)' le 20100319080932 lors de la mise en place de */ \ /* 'DOUBLE_PRECISION' en ce qui concerne 'PRECISION_DU_Int' car, en effet, la constante */ \ /* 'NBITOC' doit etre absolue, ce qui n'etait plus le cas lors de l'utilisation de */ \ /* 'USs_GooF______CONDITIONNEL(...)' (voir la fonction 'v $xiii/mono_image$FON Ftrefle')... */ @if ( (! defined(SYSTEME_CRAY2_UNICOS)) \ && (! defined(SYSTEME_CRAYC98_UNICOS)) \ && (! defined(SYSTEME_CRAYC916_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) @ if (PRECISION_DU_Int==SIMPLE_PRECISION) @ define NOCMO QUATRE /* Nombre d'octets par mot. ATTENTION : pas de '\' ci dessus a cause du '@'... */ /* */ /* Introduit sous cette forme le 20100317161407... */ @ Aif (PRECISION_DU_Int==SIMPLE_PRECISION) @ if (PRECISION_DU_Int==DOUBLE_PRECISION) @ define NOCMO HUIT /* Nombre d'octets par mot. ATTENTION : pas de '\' ci dessus a cause du '@'... */ /* */ /* Introduit sous cette forme le 20100317161407... */ @ Aif (PRECISION_DU_Int==DOUBLE_PRECISION) @ message "ATTENTION : le nombre d'octets par mot va etre defini arbitrairement." @ define NOCMO QUATRE /* Nombre d'octets par mot. ATTENTION : pas de '\' ci dessus a cause du '@'... */ @ Eif (PRECISION_DU_Int==DOUBLE_PRECISION) @ Eif (PRECISION_DU_Int==SIMPLE_PRECISION) @Aif ( (! defined(SYSTEME_CRAY2_UNICOS)) \ && (! defined(SYSTEME_CRAYC98_UNICOS)) \ && (! defined(SYSTEME_CRAYC916_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) @ define NOCMO HUIT /* Introduit sous cette forme le 20100317161407... */ @Eif ( (! defined(SYSTEME_CRAY2_UNICOS)) \ && (! defined(SYSTEME_CRAYC98_UNICOS)) \ && (! defined(SYSTEME_CRAYC916_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ ) #if ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) Dunion_02(PERMUTATION_2_A_2_DES_OCTETS_D_UN_MOT ,DEFV(Positive,nombre_entier) ,DEFV(CHAR,gDTb1(octets,NOCMO)) ,NOM_VIDE ); Typedef(permutation_2_a_2_des_octets_d_un_mot,UNIO(PERMUTATION_2_A_2_DES_OCTETS_D_UN_MOT)) /* Structure mettant en parallele un 'Int' et les 'CHAR's qui le composent. On notera */ /* l'utilisation de 'gDTb1(...)' et non pas de 'DTb1(...)' car sinon, cela pose des */ /* problemes de compilation a cause de la procedure 'DIME(...)' appelee par 'DTb1(...)'... */ #Aif ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) #Eif ( (defined(BUG_SYSTEME_SYSTEME_APC_LinuxDebian_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxMandrake_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxRedHat_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUbuntu_ICC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_GCC_numero_de_port)) \ || (defined(BUG_SYSTEME_SYSTEME_APC_LinuxUlmint_ICC_numero_de_port)) \ ) #define k___NOCHW \ bMOI(NOCMO) \ /* Nombre d'octets par demi-mot. */ \ /* */ \ /* ATTENTION : la constante 'NOCHW' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* Le 'bMOI(...)' a remplace 'MOIT(...)' le 20100319080932 lors de la mise en place de */ \ /* 'DOUBLE_PRECISION' en ce qui concerne 'PRECISION_DU_Int' car, en effet, la constante */ \ /* 'NOCHW' doit etre absolue, ce qui n'etait plus le cas lors de l'utilisation de */ \ /* 'USs_GooF______CONDITIONNEL(...)' (voir la fonction 'v $xiii/mono_image$FON Ftrefle')... */ #define k___NBITHW \ bMUL(NBITOC,NOCHW) \ /* Nombre de bits dans un demi-mot. */ \ /* */ \ /* ATTENTION : la constante 'NBITHW' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___NBITMO \ bMUL(NBITOC,NOCMO) \ /* Nombre de bits dans un mot. */ \ /* */ \ /* ATTENTION : la constante 'NBITMO' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___NCHXOC \ bDIV(NBITOC,NBITHX) \ /* Nombre de chiffres hexa-decimaux par octet (introduit le 20120329135054)... */ \ /* */ \ /* ATTENTION : la constante 'NCHXOC' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___NCHXMO \ bDIV(NBITMO,NBITHX) \ /* Nombre de chiffres hexa-decimaux par mot (introduit le 20051210174645)... */ \ /* */ \ /* ATTENTION : la constante 'NCHXMO' est pre-generee dans '$xcp/Konstantes$K'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef NOCHW \ k___NOCHW #TestADef NBITHX \ k___NBITHX #TestADef NHXOC \ k___NHXOC #TestADef NBITOC \ k___NBITOC #TestADef NBITHW \ k___NBITHW #TestADef NBITMO \ k___NBITMO #TestADef NCHXOC \ k___NCHXOC #TestADef NCHXMO \ k___NCHXMO /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O R M A T S E N M E M O I R E : */ /* */ /*************************************************************************************************************************************/ #define Format_char \ ZERO \ /* Format "CHAR". */ #define Format_int \ (Format_char+I) \ /* Format "Int". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference... */ #define Format_float \ (Format_int+I) \ /* Format "Float". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference... */ #define Format_double \ (Format_float+I) \ /* Format "Double". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference... */ #define Format_complexe \ (Format_double+I) \ /* Format "complexe". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference... */ #define Format_hyper_complexe \ (Format_complexe+I) \ /* Format "hyper-complexe". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference... */ #define Format_hyper_hyper_complexe \ (Format_hyper_complexe+I) \ /* Format "hyper-hyper-complexe". ATTENTION : on ne peut utiliser ni 'Enum', ni 'ADD2', */ \ /* ni 'PARE' pour le definir, et ce a cause des "#if" qui le reference (introduit */ \ /* le 20150227105517). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E G L E S D ' I N D E X A T I O N : */ /* */ /*************************************************************************************************************************************/ #define INDX(index,minimum_de_l_index) \ INTE(bADD(INDEX0,bSOU(index,minimum_de_l_index))) \ /* Cette fonction permet de calculer un index de type "C" dans un */ \ /* vecteur que l'on considere comme etant [minimum_de_l_index,...] ; on a : */ \ /* */ \ /* INDX(x,min) = x-min */ \ /* */ #define INVX(index,minimum_de_l_index,maximum_de_l_index) \ bADD(minimum_de_l_index,bSOU(maximum_de_l_index,index)) \ /* "Inversion" d'un index : */ \ /* */ \ /* INVX(x,min,max) = min + (max - x) */ \ /* */ \ /* Cette procedure a ete introduite le 20000204172501 pour 'v $xrv/tri.11$K INVX'. */ #define TRMU(nombre_d_elements) \ INDX(nombre_d_elements,BEGIN_AT_0) \ /* Cette fonction est la fonction "piquet" --> "intervalle" ; elle permet de passer */ \ /* d'un nombre d'elements (qui peut etre considere comme un index commencant a Z=1) */ \ /* a un index commencant a INDEX0=0 ; on a : */ \ /* */ \ /* TRMU(n) = n-1 */ \ /* */ #define TRPU(index) \ bADD(index,BEGIN_AT_0) \ /* Fonction inverse de 'TRMU' ; on a : */ \ /* */ \ /* TRPU(x) = x+1 */ \ /* */ #define LSTX(minimum_de_l_index,nombre_d_elements) \ bADD(minimum_de_l_index,TRMU(nombre_d_elements)) \ /* Cette fonction permet de calculer l'indice logique du dernier element */ \ /* d'un vecteur dont on se donne l'indice logique du premier element */ \ /* et le nombre d'elements (ou longueur) ; on a : */ \ /* */ \ /* LSTX(min,n) = min+n-1 */ \ /* = max (de 'NBRE(max,min)' ci-apres) */ \ /* */ #define NBRE(minimum_de_l_index,maximum_de_l_index) \ TRPU(bSOU(maximum_de_l_index,minimum_de_l_index)) \ /* Cette fonction permet de compter le nombre d'elements d'un vecteur dont on se donne */ \ /* les indices logiques du premier et du dernier element ; on a : */ \ /* */ \ /* NBRE(max,min) = (max-min)+1 */ \ /* = n (de 'LSTX(min,n)' ci-dessus) */ \ /* */ #define CONX(index,ancien_minimum_de_l_index,nouveau_minimum_de_l_index) \ bADD(bSOU(index,ancien_minimum_de_l_index),nouveau_minimum_de_l_index) \ /* Pour passer d'une indexation [ancien,...] a une indexation [nouveau,...]. */ #define LENG(origine,extremite) \ TRPU(SOUA(extremite,origine)) \ /* Afin de calculer la longueur du segment [origine,extremite] bornes incluses, */ \ /* */ \ /* LENG(max,min) = |(max-min)|+1 */ \ /* */ \ /* mais ATTENTION a la valeur absolue 'ABSO'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S L O G I Q U E S B I N A I R E S ( B I T A B I T ) : */ /* */ /*************************************************************************************************************************************/ #define OUI03(a,b,c) \ OUIN(OUIN(a,b),c) #define OUI04(a,b,c,d) \ OUIN(OUI03(a,b,c),d) #define OUI05(a,b,c,d,e) \ OUIN(OUI04(a,b,c,d),e) #define OUI06(a,b,c,d,e,f) \ OUIN(OUI05(a,b,c,d,e),f) #define OUI07(a,b,c,d,e,f,g) \ OUIN(OUI06(a,b,c,d,e,f),g) #define OUI08(a,b,c,d,e,f,g,h) \ OUIN(OUI07(a,b,c,d,e,f,g),h) #define OUI09(a,b,c,d,e,f,g,h,i) \ OUIN(OUI08(a,b,c,d,e,f,g,h),i) #define OUI10(a,b,c,d,e,f,g,h,i,j) \ OUIN(OUI09(a,b,c,d,e,f,g,h,i),j) #define OUI11(a,b,c,d,e,f,g,h,i,j,k) \ OUIN(OUI10(a,b,c,d,e,f,g,h,i,j),k) #define OUI12(a,b,c,d,e,f,g,h,i,j,k,l) \ OUIN(OUI11(a,b,c,d,e,f,g,h,i,j,k),l) #define OUI13(a,b,c,d,e,f,g,h,i,j,k,l,m) \ OUIN(OUI12(a,b,c,d,e,f,g,h,i,j,k,l),m) #define OUI14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) \ OUIN(OUI13(a,b,c,d,e,f,g,h,i,j,k,l,m),n) #define OUI15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \ OUIN(OUI14(a,b,c,d,e,f,g,h,i,j,k,l,m,n),o) #define OUI16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ OUIN(OUI15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o),p) #define OUI17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) \ OUIN(OUI16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p),q) #define OUI18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) \ OUIN(OUI17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q),r) #define OUI19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) \ OUIN(OUI18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r),s) /* La fonction 'OUI03(...)' est introduite afin de "symetriser" les ou inclusifs a 3 */ /* facteurs. Et cela fut etendu le 20170621181337 avec 'OUI4(...)', 'OUI5(...)',... */ /* */ /* Le 20170722143225, les noms 'OUIi(...)' ont ete etendus en 'OUI0i(...)' afin de */ /* permettre l'introduction des procedures 'OUI1i(...)' le 20170723083840... */ #define OUE03(a,b,c) \ OUEX(OUEX(a,b),c) #define OUE04(a,b,c,d) \ OUEX(OUE03(a,b,c),d) #define OUE05(a,b,c,d,e) \ OUEX(OUE04(a,b,c,d),e) #define OUE06(a,b,c,d,e,f) \ OUEX(OUE05(a,b,c,d,e),f) #define OUE07(a,b,c,d,e,f,g) \ OUEX(OUE06(a,b,c,d,e,f),g) #define OUE08(a,b,c,d,e,f,g,h) \ OUEX(OUE07(a,b,c,d,e,f,g),h) #define OUE09(a,b,c,d,e,f,g,h,i) \ OUEX(OUE08(a,b,c,d,e,f,g,h),i) #define OUE10(a,b,c,d,e,f,g,h,i,j) \ OUEX(OUE09(a,b,c,d,e,f,g,h,i),j) #define OUE11(a,b,c,d,e,f,g,h,i,j,k) \ OUEX(OUE10(a,b,c,d,e,f,g,h,i,j),k) #define OUE12(a,b,c,d,e,f,g,h,i,j,k,l) \ OUEX(OUE11(a,b,c,d,e,f,g,h,i,j,k),l) #define OUE13(a,b,c,d,e,f,g,h,i,j,k,l,m) \ OUEX(OUE12(a,b,c,d,e,f,g,h,i,j,k,l),m) #define OUE14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) \ OUEX(OUE13(a,b,c,d,e,f,g,h,i,j,k,l,m),n) #define OUE15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \ OUEX(OUE14(a,b,c,d,e,f,g,h,i,j,k,l,m,n),o) #define OUE16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ OUEX(OUE15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o),p) #define OUE17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) \ OUEX(OUE16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p),q) #define OUE18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) \ OUEX(OUE17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q),r) #define OUE19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) \ OUEX(OUE18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r),s) /* Les fonctions 'OUEi(...)' ont ete introduites le 20170621181337 par symetrie avec */ /* les fonctions 'OUIi(...)'... */ /* */ /* Le 20170722143225, les noms 'OUEi(...)' ont ete etendus en 'OUE0i(...)' afin de */ /* permettre l'introduction des procedures 'OUE1i(...)' le 20170723083840... */ #define ETL03(a,b,c) \ ETLO(ETLO(a,b),c) #define ETL04(a,b,c,d) \ ETLO(ETL03(a,b,c),d) #define ETL05(a,b,c,d,e) \ ETLO(ETL04(a,b,c,d),e) #define ETL06(a,b,c,d,e,f) \ ETLO(ETL05(a,b,c,d,e),f) #define ETL07(a,b,c,d,e,f,g) \ ETLO(ETL06(a,b,c,d,e,f),g) #define ETL08(a,b,c,d,e,f,g,h) \ ETLO(ETL07(a,b,c,d,e,f,g),h) #define ETL09(a,b,c,d,e,f,g,h,i) \ ETLO(ETL08(a,b,c,d,e,f,g,h),i) #define ETL10(a,b,c,d,e,f,g,h,i,j) \ ETLO(ETL09(a,b,c,d,e,f,g,h,i),j) #define ETL11(a,b,c,d,e,f,g,h,i,j,k) \ ETLO(ETL10(a,b,c,d,e,f,g,h,i,j),k) #define ETL12(a,b,c,d,e,f,g,h,i,j,k,l) \ ETLO(ETL11(a,b,c,d,e,f,g,h,i,j,k),l) #define ETL13(a,b,c,d,e,f,g,h,i,j,k,l,m) \ ETLO(ETL12(a,b,c,d,e,f,g,h,i,j,k,l),m) #define ETL14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) \ ETLO(ETL13(a,b,c,d,e,f,g,h,i,j,k,l,m),n) #define ETL15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \ ETLO(ETL14(a,b,c,d,e,f,g,h,i,j,k,l,m,n),o) #define ETL16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \ ETLO(ETL15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o),p) #define ETL17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) \ ETLO(ETL16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p),q) #define ETL18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) \ ETLO(ETL17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q),r) #define ETL19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) \ ETLO(ETL18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r),s) /* Les fonctions 'ETLi(...)' ont ete introduites le 20170621181337 par symetrie avec */ /* les fonctions 'OUIi(...)'... */ /* */ /* Le 20170722143225, les noms 'ETLi(...)' ont ete etendus en 'ETL0i(...)' afin de */ /* permettre l'introduction des procedures 'ETL1i(...)' le 20170723083840... */ #define COMK(masque) \ OUEX(masque,MMOT) \ /* Obtention du masque complementaire du masque "masque" ; cette fonction */ \ /* vaut en fait pour toute valeur logique. */ #define PARI(x) \ ETLO(x,BIT) \ /* Donne la parite de 'x'. */ #define MASQUE___SET_BIT(masque,bit) \ OUIN(masque,bit) \ /* Mise a 1 d'un bit dans un masque (introduit le 20021109231715 pour des raisons de */ \ /* symetrie avec 'MASQUE_RESET_BIT(...)'. */ #define MASQUE_RESET_BIT(masque,bit) \ OUEX(MASQUE___SET_BIT(masque,bit),bit) \ /* Mise a 0 d'un bit dans un masque (introduit le 20021109231715 pour resoudre un probleme */ \ /* dans 'v $xcp/substitue.01$K MASQUE_RESET_BIT'). */ #define MASQUE__TEST_BIT(masque,bit) \ IFEQ(ETLO(masque,bit),bit) \ /* Test d'un bit a 1 dans un masque (introduit le 20021205134215 pour etre utilise dans */ \ /* 'v $xcp/substitue.01$K MASQUE__TEST_BIT'). */ #define MASQUE_NTEST_BIT(masque,bit) \ IFNE(ETLO(masque,bit),bit) \ /* Test d'un bit a 0 dans un masque (introduit le 20021206095002 pour etre utilise dans */ \ /* 'v $xcp/substitue.01$K MASQUE__TEST_BIT'). */ #define AMPLITUDE_DE_CADRAGE_A_DROITE_D_UN_MASQUE(masque) \ INTE(LO2X(bADD(OUEX(OUIN(bADD(OUEX(masque,MMOT),BIT),masque),MMOT),BIT))) \ /* Permet de connaitre le decalage cadrant a droite un masque (c'est-a-dire de facon a ce */ \ /* qu'il n'y ait plus de bits '0' a droite). Ceci a ete introduit le 20030105105120 pour */ \ /* 'v $xiidX/fonct$vv$FON AMPLITUDE_DE_CADRAGE_A_DROITE_D_UN_MASQUE'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S D E D E C A L A G E : */ /* */ /*************************************************************************************************************************************/ #define gDecalage_bit(numero_de_bit,nombre_de_bits) \ bSOU(bSOU(nombre_de_bits,B),REST(numero_de_bit,nombre_de_bits)) #define Decalage_bit_octet(numero_de_bit) \ gDecalage_bit(numero_de_bit,NBITOC) #define Decalage_bit_mot(numero_de_bit) \ gDecalage_bit(numero_de_bit,NBITMO) /* Cette fonction convertit un numero de bit (le bit 0 etant le bit de */ /* gauche) en une amplitude de decalage a droite. */ #if ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_HP705_HPUX_CC))) \ || ((defined(SYSTEME_HP710_HPUX_CC))) \ || ((defined(SYSTEME_HP720_HPUX_CC))) \ || ((defined(SYSTEME_HP750_HPUX_CC))) \ || ((defined(SYSTEME_HP755_HPUX_CC))) \ || ((defined(SYSTEME_HP819_HPUX_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ ) # TestADef BUG_SYSTEME_C_SARS \ /* Les decalages hardwares a droite et a gauche sont 'zero fill', et ne sont pas simules */ \ /* par le compilateur ; ils doivent donc l'etre par l'utilisateur... */ \ /* */ \ /* ATTENTION : on notera que ce defaut n'apparait pas sur les 'SYSTEME_SG4D..._IRIX_CC' */ \ /* alors qu'il apparait sur 'SYSTEME_NWS3000_NEWSOS', ce qui est paradoxal, puisque */ \ /* theoriquement, il s'agit la du meme compilateur ('Mips'). */ \ /* */ \ /* ATTENTION : voir le commentaire associe a la definition de 'SIZE_GENERAL(...)'. */ #Aif ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_HP705_HPUX_CC))) \ || ((defined(SYSTEME_HP710_HPUX_CC))) \ || ((defined(SYSTEME_HP720_HPUX_CC))) \ || ((defined(SYSTEME_HP750_HPUX_CC))) \ || ((defined(SYSTEME_HP755_HPUX_CC))) \ || ((defined(SYSTEME_HP819_HPUX_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ ) #Eif ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_HP705_HPUX_CC))) \ || ((defined(SYSTEME_HP710_HPUX_CC))) \ || ((defined(SYSTEME_HP720_HPUX_CC))) \ || ((defined(SYSTEME_HP750_HPUX_CC))) \ || ((defined(SYSTEME_HP755_HPUX_CC))) \ || ((defined(SYSTEME_HP819_HPUX_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ ) #define SARS(champ,amplitude) \ DECD(INTE(champ),amplitude) \ /* Decalage arithmetique a droite. */ #if ( (defined(BUG_SYSTEME_C_SARS)) \ ) # undef SARS # define SARS(champ,amplitude) \ COND(IZGE(champ) \ ,SLRS(champ,amplitude) \ ,COMK(SLRS(COMK(champ),amplitude)) \ ) \ /* Decalage arithmetique a droite sur les SYSTEMEs 'zero fill'... */ \ /* */ \ /* ATTENTION : voir le commentaire associe a la definition de 'SIZE_GENERAL(...)'. */ #Aif ( (defined(BUG_SYSTEME_C_SARS)) \ ) #Eif ( (defined(BUG_SYSTEME_C_SARS)) \ ) #define SALS(champ,amplitude) \ DECG(INTE(champ),amplitude) \ /* Decalage arithmetique a gauche. */ #define SLRS(champ,amplitude) \ DECD(POSI(champ),amplitude) \ /* Decalage logique a droite. */ #define SLLS(champ,amplitude) \ DECG(POSI(champ),amplitude) \ /* Decalage logique a gauche ; pour etre logique et consistant avec la definition de */ \ /* 'SLRS(...)', il conviendrait de definir 'SLLS(...)' par : */ \ /* */ \ /* #define SLLS(champ,amplitude) \ */ \ /* DECG(POSI(champ),amplitude) */ \ /* */ \ /* En fait, tous les systemes, sauf 'SYSTEME_SG4D..._IRIX_CC' permettent l'utilisation de */ \ /* 'POSI(...)'. Mais dans la mesure ou l'on souhaite generer parfois des fichiers */ \ /* "bootstrapables" de type '$c' qui soient portables sur des machines arbitraires, il faut */ \ /* choisir la solution qui soit compatible avec le maximum de systemes, et comme le systeme */ \ /* REFERENCE 'SYSTEME_DPX5000_SPIX_CC' autorise 'INTE(...)', on adopte cette solution */ \ /* partout... */ \ /* */ \ /* Le 20200501110041, j'ai remplace (tres tardivement, certainement plus de dix ans, mais */ \ /* cela prouve que ces operations servent tres tres tres peu...) le 'INTE(...)' par un */ \ /* 'POSI(...)' car, en effet, a cette date, lors de la compilation de 'v $xtKg/gMASQUE$K', */ \ /* je decouvre par accident que 'v $xil/defi_K2$vv$DEF gMASQUE' de meme que */ \ /* 'v '$xiiD/definit.1$DEF DEMULTIPLEXAGE_BVR_888_' ne fonctionnaient pas correctement */ \ /* sur '$CMAP28', '$LACT19', '$LACT1A',... */ #define SCRS(champ,amplitude) \ OUIN(SLRS(champ,amplitude) \ ,SLLS(champ,bSOU(NBITMO,amplitude)) \ ) \ /* Decalage circulaire a droite. */ #define SCLS(champ,amplitude) \ OUIN(SLLS(champ,amplitude) \ ,SLRS(champ,bSOU(NBITMO,amplitude)) \ ) \ /* Decalage circulaire a gauche. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S S U R B I T S D A N S U N E C H A I N E D E B I T S : */ /* */ /*************************************************************************************************************************************/ /* Ces procedures Generales ont ete introduites le 20130703110203... */ #define gTBIT(chaine,numero_de_bit,decalage) \ COND(IFEQ(ETLO(SLRS(chaine,decalage(numero_de_bit)),BIT),BIT),EXIST,NEXIST) \ /* Test d'un bit dans une chaine contenue dans un mot. */ #define gSBIT(chaine,numero_de_bit,decalage) \ OUIN(chaine,SLLS(BIT,decalage(numero_de_bit))) \ /* Mise d'un bit a 1 dans une chaine contenue dans un mot. */ #define gIBIT(chaine,numero_de_bit,decalage) \ OUEX(chaine,SLLS(BIT,decalage(numero_de_bit))) \ /* Inversion d'un bit dans une chaine contenue dans un mot. */ #define gRBIT(chaine,numero_de_bit,decalage) \ gIBIT(gSBIT(chaine,numero_de_bit,decalage),numero_de_bit,decalage) \ /* Mise d'un bit a 0 dans une chaine contenue dans un mot. */ #define gCBIT(chaine,numero_de_bit,decalage,condition_d_existence) \ COND(PRESENT(condition_d_existence) \ ,gSBIT(chaine,numero_de_bit,decalage) \ ,COND(PAS_PRESENT(condition_d_existence) \ ,gRBIT(chaine,numero_de_bit,decalage) \ ,chaine \ ) \ ) \ /* Mise d'un bit a 0/1 dans une chaine contenue dans un mot suivant que la condition est */ \ /* NEXIST/EXIST, valeurs obtenues par exemple par 'TBIT'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S S U R B I T S D A N S U N O C T E T : */ /* */ /*************************************************************************************************************************************/ #define TBITo(octet,numero_de_bit) \ gTBIT(octet,numero_de_bit,Decalage_bit_octet) \ /* Test d'un bit dans une chaine contenue dans un octet (introduit le 20130702092445). */ #define SBITo(octet,numero_de_bit) \ gSBIT(octet,numero_de_bit,Decalage_bit_octet) \ /* Mise d'un bit a 1 dans une chaine contenue dans un octet (introduit le 20130702092445). */ #define IBITo(octet,numero_de_bit) \ gIBIT(octet,numero_de_bit,Decalage_bit_octet) \ /* Inversion d'un bit dans une chaine contenue dans un octet (introduit le 20130702092445). */ #define RBITo(octet,numero_de_bit) \ gRBIT(octet,numero_de_bit,Decalage_bit_octet) \ /* Mise d'un bit a 0 dans une chaine contenue dans un octet (introduit le 20130702092445). */ #define CBITo(octet,numero_de_bit,condition_d_existence) \ gCBIT(octet,numero_de_bit,Decalage_bit_octet,condition_d_existence) \ /* Mise d'un bit a 0/1 dans une chaine contenue dans un mot suivant que la condition est */ \ /* NEXIST/EXIST, valeurs obtenues par exemple par 'TBIT' (introduit le 20130703110203). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S S U R B I T S D A N S U N M O T : */ /* */ /*************************************************************************************************************************************/ #define TBIT(mot,numero_de_bit) \ gTBIT(mot,numero_de_bit,Decalage_bit_mot) \ /* Test d'un bit dans une chaine contenue dans un mot. */ #define SBIT(mot,numero_de_bit) \ gSBIT(mot,numero_de_bit,Decalage_bit_mot) \ /* Mise d'un bit a 1 dans une chaine contenue dans un mot. */ #define IBIT(mot,numero_de_bit) \ gIBIT(mot,numero_de_bit,Decalage_bit_mot) \ /* Inversion d'un bit dans une chaine contenue dans un mot. */ #define RBIT(mot,numero_de_bit) \ gRBIT(mot,numero_de_bit,Decalage_bit_mot) \ /* Mise d'un bit a 0 dans une chaine contenue dans un mot. */ #define CBIT(mot,numero_de_bit,condition_d_existence) \ gCBIT(mot,numero_de_bit,Decalage_bit_mot,condition_d_existence) \ /* Mise d'un bit a 0/1 dans une chaine contenue dans un mot suivant que la condition est */ \ /* NEXIST/EXIST, valeurs obtenues par exemple par 'TBIT'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S B L O C S : */ /* */ /*************************************************************************************************************************************/ #define Bblock \ BEGIN #define Eblock \ END #define begin_nouveau_block \ Bblock #define end_nouveau_block \ Eblock /* Ceci a ete introduit le 20030124092944 pour 'v $xiii/di_image$FON begin_nouveau_block', */ /* et ce afin de faciliter la creation de variables locales... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E " P S E U D O - B L O C S " D E V A L I D A T I O N */ /* D E S T R U C T U R A T I O N D E S P R O G R A M M E S : */ /* */ /*************************************************************************************************************************************/ #if ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC))) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC))) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC))) \ || ((defined(SYSTEME_SGIND308_IRIX_CC))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC))) \ || ((defined(SYSTEME_VAX9000_ULTRIX_CC))) \ ) # TestADef BUG_SYSTEME_C_blockV \ /* Cas ou le compilateur associe ne supporte pas assez de blocs de Validation imbriques... */ \ /* */ \ /* 1-cas 'SYSTEME_NWS3000_NEWSOS' : */ \ /* */ \ /* le compilateur 'cc' ne supporte pas assez de blocs imbriques. Ainsi, on evite le message */ \ /* */ \ /* yacc stack overflow */ \ /* */ \ /* auquel on ne peut rien (il faudrait pouvoir recompiler 'yacc'...). */ \ /* */ \ /* 2-cas 'SYSTEME_SG...' : */ \ /* */ \ /* le compilateur 'cc' (via 'yacc') ne supporte pas assez de blocs imbriques ; d'apres un */ \ /* un rapport venant de Silicon Graphics, la version actuelle aurait ete compilee avec un */ \ /* parametre ("non user expandable") fixant a 150 "entrees" la taille de la pile : reste a */ \ /* savoir ce que contient une "entree"... */ #Aif ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC))) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC))) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC))) \ || ((defined(SYSTEME_SGIND308_IRIX_CC))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC))) \ || ((defined(SYSTEME_VAX9000_ULTRIX_CC))) \ ) #Eif ( ((defined(SYSTEME_CRAY2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAY2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC98_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYC916_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP1_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP2_UNICOS_SCC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_CC))) \ || ((defined(SYSTEME_CRAYYMP4_UNICOS_SCC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_CC))) \ || ((defined(SYSTEME_NWS3000_NEWSOS_2CC))) \ || ((defined(SYSTEME_SG4D20G_IRIX_CC))) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC))) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC))) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC))) \ || ((defined(SYSTEME_SGIND308_IRIX_CC))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 602000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC))) \ || ((defined(SYSTEME_VAX9000_ULTRIX_CC))) \ ) #define BblockV \ BEGIN #define EblockV \ END #if ( (defined(BUG_SYSTEME_C_blockV)) \ ) # undef BblockV # define BblockV \ VIDE \ /* Cas ou le compilateur associe ne supporte pas assez de blocs de Validation imbriques... */ # undef EblockV # define EblockV \ VIDE \ /* Cas ou le compilateur associe ne supporte pas assez de blocs de Validation imbriques... */ #Aif ( (defined(BUG_SYSTEME_C_blockV)) \ ) #Eif ( (defined(BUG_SYSTEME_C_blockV)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E L E C T E U R S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : la fonction 'SE11(...)' est definie dans 'v $xil/defi_K1$vv$DEF SE11', et ce */ /* a cause de la definition de 'NEUT(...)'. */ #define gSE12(x1,x2) \ x1 #define SE12(x1,x2) \ PARE(gSE12(x1,x2)) /* Selection du premier element d'une liste de 2, */ #define gSE22(x1,x2) \ x2 #define SE22(x1,x2) \ PARE(gSE22(x1,x2)) /* Selection du deuxieme element d'une liste de 2. */ #define gSE13(x1,x2,x3) \ x1 #define SE13(x1,x2,x3) \ PARE(gSE13(x1,x2,x3)) /* Selection du premier element d'une liste de 3, */ #define gSE23(x1,x2,x3) \ x2 #define SE23(x1,x2,x3) \ PARE(gSE23(x1,x2,x3)) /* Selection du deuxieme element d'une liste de 3, */ #define gSE33(x1,x2,x3) \ x3 #define SE33(x1,x2,x3) \ PARE(gSE33(x1,x2,x3)) /* Selection du troisieme element d'une liste de 3. */ #define gSE14(x1,x2,x3,x4) \ x1 #define SE14(x1,x2,x3,x4) \ PARE(gSE14(x1,x2,x3,x4)) /* Selection du premier element d'une liste de 4, */ #define gSE24(x1,x2,x3,x4) \ x2 #define SE24(x1,x2,x3,x4) \ PARE(gSE24(x1,x2,x3,x4)) /* Selection du deuxieme element d'une liste de 4, */ #define gSE34(x1,x2,x3,x4) \ x3 #define SE34(x1,x2,x3,x4) \ PARE(gSE34(x1,x2,x3,x4)) /* Selection du troisieme element d'une liste de 4, */ #define gSE44(x1,x2,x3,x4) \ x4 #define SE44(x1,x2,x3,x4) \ PARE(gSE44(x1,x2,x3,x4)) /* Selection du quatrieme element d'une liste de 4. */ #define gSE15(x1,x2,x3,x4,x5) \ x1 #define SE15(x1,x2,x3,x4,x5) \ PARE(gSE15(x1,x2,x3,x4,x5)) /* Selection du premier element d'une liste de 5 (introduit le 20100210103412), */ #define gSE25(x1,x2,x3,x4,x5) \ x2 #define SE25(x1,x2,x3,x4,x5) \ PARE(gSE25(x1,x2,x3,x4,x5)) /* Selection du deuxieme element d'une liste de 5 (introduit le 20100210103412), */ #define gSE35(x1,x2,x3,x4,x5) \ x3 #define SE35(x1,x2,x3,x4,x5) \ PARE(gSE35(x1,x2,x3,x4,x5)) /* Selection du troisieme element d'une liste de 5 (introduit le 20100210103412), */ #define gSE45(x1,x2,x3,x4,x5) \ x4 #define SE45(x1,x2,x3,x4,x5) \ PARE(gSE45(x1,x2,x3,x4,x5)) /* Selection du quatrieme element d'une liste de 5 (introduit le 20100210103412), */ #define gSE55(x1,x2,x3,x4,x5) \ x5 #define SE55(x1,x2,x3,x4,x5) \ PARE(gSE55(x1,x2,x3,x4,x5)) /* Selection du cinquieme element d'une liste de 5 (introduit le 20100210103412). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E S D E S O P E R A T E U R S D E S E L E C T I O N : */ /* */ /*************************************************************************************************************************************/ #define d_SE12(x1,x2) \ SE12(d#x1,d#x2) #define d_SE22(x1,x2) \ SE22(d#x1,d#x2) /* Derivee des operateurs de selection : */ /* */ /* d(selection(x1,x2,...)) = selection(d(x1),d(x2),...) */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P E R M U T A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define PERMUTATION_12(x1,x2) \ x1 \ x2 \ /* Permutation (1,2). */ #define PERMUTATION_21(x1,x2) \ x2 \ x1 \ /* Permutation (2,1). */ #define PERMUTATION_123(x1,x2,x3) \ x1 \ x2 \ x3 \ /* Permutation (1,2,3). */ #define PERMUTATION_132(x1,x2,x3) \ x1 \ x3 \ x2 \ /* Permutation (1,3,2). */ #define PERMUTATION_231(x1,x2,x3) \ x2 \ x3 \ x1 \ /* Permutation (2,3,1). */ #define PERMUTATION_213(x1,x2,x3) \ x2 \ x1 \ x3 \ /* Permutation (2,1,3). */ #define PERMUTATION_312(x1,x2,x3) \ x3 \ x1 \ x2 \ /* Permutation (3,1,2). */ #define PERMUTATION_321(x1,x2,x3) \ x3 \ x2 \ x1 \ /* Permutation (3,2,1). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L I S T E S A ' N ' E L E M E N T S : */ /* */ /*************************************************************************************************************************************/ #define LIS1(element1) \ element1 \ /* Liste a 1 element. */ #define LIS2(element1,element2) \ element1,element2 \ /* Liste a 2 elements. */ #define LIS3(element1,element2,element3) \ element1,element2,element3 \ /* Liste a 3 elements. */ #define LIS4(element1,element2,element3,element4) \ element1,element2,element3,element4 \ /* Liste a 4 elements. */ #define LIS5(element1,element2,element3,element4,element5) \ element1,element2,element3,element4,element5 \ /* Liste a 5 elements. */ #define LIS6(element1,element2,element3,element4,element5,element6) \ element1,element2,element3,element4,element5,element6 \ /* Liste a 6 elements. */ #define LIS7(element1,element2,element3,element4,element5,element6,element7) \ element1,element2,element3,element4,element5,element6,element7 \ /* Liste a 7 elements. */ #define LIS8(element1,element2,element3,element4,element5,element6,element7,element8) \ element1,element2,element3,element4,element5,element6,element7,element8 \ /* Liste a 8 elements. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E N U M E R A T I O N S T Y P E E S : */ /* */ /* */ /* ATTENTION : */ /* */ /* Pour des raisons evidentes liees au */ /* pre-processing, il est impossible d'appeler */ /* ces procedures en forcant des valeurs */ /* initiales pour certains arguments par */ /* 'INIS(...)' ; le '=define..." engendrerait */ /* une definition contenant le 'INIS(...)'. */ /* */ /* */ /* Nota : */ /* */ /* Les caracteres '$'s sont remplaces par */ /* des '_'s lors de la '$PASSE_1' de 'v $xcc/cpp$Z DenumeTx' */ /* (via un '$xcp/underscore$X'), */ /* ceci etant du aux '=define's qui definissent */ /* des symboles 'elementIJ' a partir donc de */ /* '_elementIJ'... */ /* */ /*************************************************************************************************************************************/ #define DenumeT01(element01,nom) \ Denumer01($element01 \ ,nom \ ); \ =define element01 ENUM($element01) #define DenumeT02(element01,element02,nom) \ Denumer02($element01 \ ,$element02 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) #define DenumeT03(element01,element02,element03,nom) \ Denumer03($element01 \ ,$element02 \ ,$element03 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) #define DenumeT04(element01,element02,element03,element04,nom) \ Denumer04($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) #define DenumeT05(element01,element02,element03,element04,element05,nom) \ Denumer05($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,$element05 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) \ =define element05 ENUM($element05) #define DenumeT06(element01,element02,element03,element04,element05,element06,nom) \ Denumer06($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,$element05 \ ,$element06 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) \ =define element05 ENUM($element05) \ =define element06 ENUM($element06) #define DenumeT07(element01,element02,element03,element04,element05,element06,element07,nom) \ Denumer07($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,$element05 \ ,$element06 \ ,$element07 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) \ =define element05 ENUM($element05) \ =define element06 ENUM($element06) \ =define element07 ENUM($element07) #define DenumeT08(element01,element02,element03,element04,element05,element06,element07,element08,nom) \ Denumer08($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,$element05 \ ,$element06 \ ,$element07 \ ,$element08 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) \ =define element05 ENUM($element05) \ =define element06 ENUM($element06) \ =define element07 ENUM($element07) \ =define element08 ENUM($element08) #define DenumeT09(element01,element02,element03,element04,element05,element06,element07,element08,element09,nom) \ Denumer09($element01 \ ,$element02 \ ,$element03 \ ,$element04 \ ,$element05 \ ,$element06 \ ,$element07 \ ,$element08 \ ,$element09 \ ,nom \ ); \ =define element01 ENUM($element01) \ =define element02 ENUM($element02) \ =define element03 ENUM($element03) \ =define element04 ENUM($element04) \ =define element05 ENUM($element05) \ =define element06 ENUM($element06) \ =define element07 ENUM($element07) \ =define element08 ENUM($element08) \ =define element09 ENUM($element09) #define DenumeT10(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,nom) \ Denumer10($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) #define DenumeT13(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,nom) \ Denumer13($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) #define DenumeT16(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,nom) \ Denumer16($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) #define DenumeT17(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,nom) \ Denumer17($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,$el17 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) \ =define el17 ENUM($el17) #define DenumeT18(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,nom) \ Denumer18($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,$el17 \ ,$el18 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) \ =define el17 ENUM($el17) \ =define el18 ENUM($el18) #define DenumeT19(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,nom) \ Denumer19($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,$el17 \ ,$el18 \ ,$el19 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) \ =define el17 ENUM($el17) \ =define el18 ENUM($el18) \ =define el19 ENUM($el19) #define DenumeT20(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20,nom) \ Denumer20($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,$el17 \ ,$el18 \ ,$el19 \ ,$el20 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) \ =define el17 ENUM($el17) \ =define el18 ENUM($el18) \ =define el19 ENUM($el19) \ =define el20 ENUM($el20) #define DenumeT22(el01,el02,el03,el04,el05,el06,el07,el08,el09,el10,el11,el12,el13,el14,el15,el16,el17,el18,el19,el20,el21,el22,nom) \ Denumer22($el01 \ ,$el02 \ ,$el03 \ ,$el04 \ ,$el05 \ ,$el06 \ ,$el07 \ ,$el08 \ ,$el09 \ ,$el10 \ ,$el11 \ ,$el12 \ ,$el13 \ ,$el14 \ ,$el15 \ ,$el16 \ ,$el17 \ ,$el18 \ ,$el19 \ ,$el20 \ ,$el21 \ ,$el22 \ ,nom \ ); \ =define el01 ENUM($el01) \ =define el02 ENUM($el02) \ =define el03 ENUM($el03) \ =define el04 ENUM($el04) \ =define el05 ENUM($el05) \ =define el06 ENUM($el06) \ =define el07 ENUM($el07) \ =define el08 ENUM($el08) \ =define el09 ENUM($el09) \ =define el10 ENUM($el10) \ =define el11 ENUM($el11) \ =define el12 ENUM($el12) \ =define el13 ENUM($el13) \ =define el14 ENUM($el14) \ =define el15 ENUM($el15) \ =define el16 ENUM($el16) \ =define el17 ENUM($el17) \ =define el18 ENUM($el18) \ =define el19 ENUM($el19) \ =define el20 ENUM($el20) \ =define el21 ENUM($el21) \ =define el22 ENUM($el22) #define DeT27(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,nom) \ Den27($e1 \ ,$e2 \ ,$e3 \ ,$e4 \ ,$e5 \ ,$e6 \ ,$e7 \ ,$e8 \ ,$e9 \ ,$eA \ ,$eB \ ,$eC \ ,$eD \ ,$eE \ ,$eF \ ,$eG \ ,$eH \ ,$eI \ ,$eJ \ ,$eK \ ,$eL \ ,$eM \ ,$eN \ ,$eO \ ,$eP \ ,$eQ \ ,$eR \ ,nom \ ); \ =define e1 ENUM($e1) \ =define e2 ENUM($e2) \ =define e3 ENUM($e3) \ =define e4 ENUM($e4) \ =define e5 ENUM($e5) \ =define e6 ENUM($e6) \ =define e7 ENUM($e7) \ =define e8 ENUM($e8) \ =define e9 ENUM($e9) \ =define eA ENUM($eA) \ =define eB ENUM($eB) \ =define eC ENUM($eC) \ =define eD ENUM($eD) \ =define eE ENUM($eE) \ =define eF ENUM($eF) \ =define eG ENUM($eG) \ =define eH ENUM($eH) \ =define eI ENUM($eI) \ =define eJ ENUM($eJ) \ =define eK ENUM($eK) \ =define eL ENUM($eL) \ =define eM ENUM($eM) \ =define eN ENUM($eN) \ =define eO ENUM($eO) \ =define eP ENUM($eP) \ =define eQ ENUM($eQ) \ =define eR ENUM($eR) #define DeT36(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,nom) \ Den36($e1 \ ,$e2 \ ,$e3 \ ,$e4 \ ,$e5 \ ,$e6 \ ,$e7 \ ,$e8 \ ,$e9 \ ,$eA \ ,$eB \ ,$eC \ ,$eD \ ,$eE \ ,$eF \ ,$eG \ ,$eH \ ,$eI \ ,$eJ \ ,$eK \ ,$eL \ ,$eM \ ,$eN \ ,$eO \ ,$eP \ ,$eQ \ ,$eR \ ,$eS \ ,$eT \ ,$eU \ ,$eV \ ,$eW \ ,$eX \ ,$eY \ ,$eZ \ ,$ea \ ,nom \ ); \ =define e1 ENUM($e1) \ =define e2 ENUM($e2) \ =define e3 ENUM($e3) \ =define e4 ENUM($e4) \ =define e5 ENUM($e5) \ =define e6 ENUM($e6) \ =define e7 ENUM($e7) \ =define e8 ENUM($e8) \ =define e9 ENUM($e9) \ =define eA ENUM($eA) \ =define eB ENUM($eB) \ =define eC ENUM($eC) \ =define eD ENUM($eD) \ =define eE ENUM($eE) \ =define eF ENUM($eF) \ =define eG ENUM($eG) \ =define eH ENUM($eH) \ =define eI ENUM($eI) \ =define eJ ENUM($eJ) \ =define eK ENUM($eK) \ =define eL ENUM($eL) \ =define eM ENUM($eM) \ =define eN ENUM($eN) \ =define eO ENUM($eO) \ =define eP ENUM($eP) \ =define eQ ENUM($eQ) \ =define eR ENUM($eR) \ =define eS ENUM($eS) \ =define eT ENUM($eT) \ =define eU ENUM($eU) \ =define eV ENUM($eV) \ =define eW ENUM($eW) \ =define eX ENUM($eX) \ =define eY ENUM($eY) \ =define eZ ENUM($eZ) \ =define ea ENUM($ea) \ /* Introduit le 20170622130733... */ #define DeT38(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,eb,ec,nom) \ Den38($e1 \ ,$e2 \ ,$e3 \ ,$e4 \ ,$e5 \ ,$e6 \ ,$e7 \ ,$e8 \ ,$e9 \ ,$eA \ ,$eB \ ,$eC \ ,$eD \ ,$eE \ ,$eF \ ,$eG \ ,$eH \ ,$eI \ ,$eJ \ ,$eK \ ,$eL \ ,$eM \ ,$eN \ ,$eO \ ,$eP \ ,$eQ \ ,$eR \ ,$eS \ ,$eT \ ,$eU \ ,$eV \ ,$eW \ ,$eX \ ,$eY \ ,$eZ \ ,$ea \ ,$eb \ ,$ec \ ,nom \ ); \ =define e1 ENUM($e1) \ =define e2 ENUM($e2) \ =define e3 ENUM($e3) \ =define e4 ENUM($e4) \ =define e5 ENUM($e5) \ =define e6 ENUM($e6) \ =define e7 ENUM($e7) \ =define e8 ENUM($e8) \ =define e9 ENUM($e9) \ =define eA ENUM($eA) \ =define eB ENUM($eB) \ =define eC ENUM($eC) \ =define eD ENUM($eD) \ =define eE ENUM($eE) \ =define eF ENUM($eF) \ =define eG ENUM($eG) \ =define eH ENUM($eH) \ =define eI ENUM($eI) \ =define eJ ENUM($eJ) \ =define eK ENUM($eK) \ =define eL ENUM($eL) \ =define eM ENUM($eM) \ =define eN ENUM($eN) \ =define eO ENUM($eO) \ =define eP ENUM($eP) \ =define eQ ENUM($eQ) \ =define eR ENUM($eR) \ =define eS ENUM($eS) \ =define eT ENUM($eT) \ =define eU ENUM($eU) \ =define eV ENUM($eV) \ =define eW ENUM($eW) \ =define eX ENUM($eX) \ =define eY ENUM($eY) \ =define eZ ENUM($eZ) \ =define ea ENUM($ea) \ =define eb ENUM($eb) \ =define ec ENUM($ec) #define DeT39(e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF,eG,eH,eI,eJ,eK,eL,eM,eN,eO,eP,eQ,eR,eS,eT,eU,eV,eW,eX,eY,eZ,ea,eb,ec,ed,n) \ Den39($e1 \ ,$e2 \ ,$e3 \ ,$e4 \ ,$e5 \ ,$e6 \ ,$e7 \ ,$e8 \ ,$e9 \ ,$eA \ ,$eB \ ,$eC \ ,$eD \ ,$eE \ ,$eF \ ,$eG \ ,$eH \ ,$eI \ ,$eJ \ ,$eK \ ,$eL \ ,$eM \ ,$eN \ ,$eO \ ,$eP \ ,$eQ \ ,$eR \ ,$eS \ ,$eT \ ,$eU \ ,$eV \ ,$eW \ ,$eX \ ,$eY \ ,$eZ \ ,$ea \ ,$eb \ ,$ec \ ,$ed \ ,nom \ ); \ =define e1 ENUM($e1) \ =define e2 ENUM($e2) \ =define e3 ENUM($e3) \ =define e4 ENUM($e4) \ =define e5 ENUM($e5) \ =define e6 ENUM($e6) \ =define e7 ENUM($e7) \ =define e8 ENUM($e8) \ =define e9 ENUM($e9) \ =define eA ENUM($eA) \ =define eB ENUM($eB) \ =define eC ENUM($eC) \ =define eD ENUM($eD) \ =define eE ENUM($eE) \ =define eF ENUM($eF) \ =define eG ENUM($eG) \ =define eH ENUM($eH) \ =define eI ENUM($eI) \ =define eJ ENUM($eJ) \ =define eK ENUM($eK) \ =define eL ENUM($eL) \ =define eM ENUM($eM) \ =define eN ENUM($eN) \ =define eO ENUM($eO) \ =define eP ENUM($eP) \ =define eQ ENUM($eQ) \ =define eR ENUM($eR) \ =define eS ENUM($eS) \ =define eT ENUM($eT) \ =define eU ENUM($eU) \ =define eV ENUM($eV) \ =define eW ENUM($eW) \ =define eX ENUM($eX) \ =define eY ENUM($eY) \ =define eZ ENUM($eZ) \ =define ea ENUM($ea) \ =define eb ENUM($eb) \ =define ec ENUM($ec) \ =define ed ENUM($ed) #define DeT48(A,eB,eC,D,E,eF,G,H,eI,J,K,L,M,N,O,eP,Q,R,S,T,eU,V,eW,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u,v,w,n) \ Den48($A \ ,$eB \ ,$eC \ ,$D \ ,$E \ ,$eF \ ,$G \ ,$H \ ,$eI \ ,$J \ ,$K \ ,$L \ ,$M \ ,$N \ ,$O \ ,$eP \ ,$Q \ ,$R \ ,$S \ ,$T \ ,$eU \ ,$V \ ,$eW \ ,$X \ ,$Y \ ,$Z \ ,$a \ ,$b \ ,$c \ ,$d \ ,$e \ ,$f \ ,$g \ ,$h \ ,$i \ ,$j \ ,$k \ ,$l \ ,$m \ ,$o \ ,$p \ ,$q \ ,$r \ ,$s \ ,$t \ ,$u \ ,$v \ ,$w \ ,n \ ); \ =define A ENUM($A) \ =define eB ENUM($eB) \ =define eC ENUM($eC) \ =define D ENUM($D) \ =define E ENUM($E) \ =define eF ENUM($eF) \ =define G ENUM($G) \ =define H ENUM($H) \ =define eI ENUM($eI) \ =define J ENUM($J) \ =define K ENUM($K) \ =define L ENUM($L) \ =define M ENUM($M) \ =define N ENUM($N) \ =define O ENUM($O) \ =define eP ENUM($eP) \ =define Q ENUM($Q) \ =define R ENUM($R) \ =define S ENUM($S) \ =define T ENUM($T) \ =define eU ENUM($eU) \ =define V ENUM($V) \ =define eW ENUM($eW) \ =define X ENUM($X) \ =define Y ENUM($Y) \ =define Z ENUM($Z) \ =define a ENUM($a) \ =define b ENUM($b) \ =define c ENUM($c) \ =define d ENUM($d) \ =define e ENUM($e) \ =define f ENUM($f) \ =define g ENUM($g) \ =define h ENUM($h) \ =define i ENUM($i) \ =define j ENUM($j) \ =define k ENUM($k) \ =define l ENUM($l) \ =define m ENUM($m) \ =define o ENUM($o) \ =define p ENUM($p) \ =define q ENUM($q) \ =define r ENUM($r) \ =define s ENUM($s) \ =define t ENUM($t) \ =define u ENUM($u) \ =define v ENUM($v) \ =define w ENUM($w) \ /* Introduit le 20170622130733... */ \ /* */ \ /* On notera qu'il n'y a pas d'arguments {A,D,E,G,H,J,K,L,M,N,O,Q,R,S,T,V,X,Y,Z} car, en */ \ /* effet, ces symboles sur une seule lettre existent en tant que '#define' et je souhaite */ \ /* evidemment eviter d'hypothetiques "collisions". En ce qui concerne les autres lettres */ \ /* de l'alphabet majuscule elles peuvent servir d'arguments et cela est tres utile afin */ \ /* reduire la longueur de la ligne '#define'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M U L T I P L E S U T I L E S D E S E N T I E R S N A T U R E L S : */ /* */ /*************************************************************************************************************************************/ #define TRENTE \ bMUL(TROIS,DIX) #define TRENTE_DEUX \ DOUB(SEIZE) #define QUARANTE \ bMUL(QUATRE,DIX) #define CINQUANTE \ bMUL(CINQ,DIX) #define SOIXANTE \ bMUL(SIX,DIX) #define SOIXANTE_QUATRE \ EXP2(HUIT) #define SOIXANTE_DIX \ bMUL(SEPT,DIX) #define QUATRE_VINGT \ bMUL(HUIT,DIX) #define QUATRE_VINGT_DIX \ bMUL(NEUF,DIX) #define CENT_VINGT_HUIT \ DOUB(SOIXANTE_QUATRE) #define DEUX_CENT_CINQUANTE_SIX \ DOUB(CENT_VINGT_HUIT) #define CINQ_CENT_DOUZE \ DOUB(DEUX_CENT_CINQUANTE_SIX) #define k___CENT \ EXP2(DIX) #define k___MILLE \ EXP3(DIX) #define k___DIX_MILLE \ EXP4(DIX) #define k___CENT_MILLE \ EXP5(DIX) #define k___MILLION \ EXP6(DIX) #define k___MILLIARD \ EXP9(DIX) #TestADef CENT \ k___CENT #TestADef MILLE \ k___MILLE #TestADef DIX_MILLE \ k___DIX_MILLE #TestADef CENT_MILLE \ k___CENT_MILLE #TestADef MILLION \ k___MILLION #TestADef MILLIARD \ k___MILLIARD /* La pre-generation des puissances de 10 a ete introduite le 20071204112015... */ #define KILO(x) \ bMUL(x,MILLE) #define MEGA(x) \ bMUL(x,MILLION) #define GIGA(x) \ bMUL(x,MILLIARD) #define KIL2(x) \ bMUL(x,EXP1(DEUXp10)) #define MEG2(x) \ bMUL(x,EXP2(DEUXp10)) #define GIG2(x) \ bMUL(x,EXP3(DEUXp10)) /* Introduit le 20031111170158 pour 'v $xcg/CheckMem$vv$K MEG2'. */ #define aKILO(x) \ bDIV(x,MILLE) #define aMEGA(x) \ bDIV(x,MILLION) #define aGIGA(x) \ bDIV(x,MILLIARD) #define aKIL2(x) \ bDIV(x,EXP1(DEUXp10)) #define aMEG2(x) \ bDIV(x,EXP2(DEUXp10)) #define aGIG2(x) \ bDIV(x,EXP3(DEUXp10)) /* Ces "AntiOperateurs" ont ete introduits le 20120131163252... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S I N D E F I N E S : */ /* */ /*************************************************************************************************************************************/ #define FLOT__UNDEF \ FLOT(UNDEF) \ /* Pour ce qui n'est pas defini en flottant (on notera que 'FLOT__UNDEF' et 'FLOT(UNDEF)' */ \ /* ont le meme nombre de caracteres, et ce afin de simplifier les mises a jour...). Enfin, */ \ /* on notera a titre d'information que sa valeur decimale est 444719 ; cela peut etre utile */ \ /* a cause de l'option : */ \ /* */ \ /* Parametres=VRAI */ \ /* */ \ /* qui a ete introduite dans toutes les commandes via les procedures 'GET_ARGUMENTS_(...)' */ \ /* et 'GET_ARGUMENTSi(...)' dans '$xig/fonct$vv$DEF' : ainsi on peut voir, par exemple, */ \ /* celles qui sont inutiles... */ #define LUNDEF \ CHOI(VRAI,FAUX) \ /* Pour ce qui n'est pas defini en matiere de logique... */ \ /* */ \ /* Le 20080303094255, je note qu'il serait preferable de donner a 'LUNDEF' une valeur */ \ /* qui soit a la fois differente de 'VRAI' et de 'FAUX' de facon a pouvoir la prendre */ \ /* en compte dans 'EST_VRAI(...)' et dans 'EST_FAUX(...)', Mais malheureusement, il */ \ /* s'agit ici de logiques booleennes et il n'est pas prevu de traiter {VRAI,FAUX,LUNDEF}, */ \ /* mais uniquement {VRAI,FAUX}... */ #define QUELCONQUE \ UNDEF \ /* Pour definir un nombre entier dont la valeur importe peu... */ #define FLOT__QUELCONQUE \ FLOT__UNDEF \ /* Pour definir un nombre flottant dont la valeur importe peu... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N " N E U T R E " : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autres ; en particulier 'NEUT(...)' doit etre definie */ /* avant tout '-define ...', et donc 'SE11(...)' doit etre definie encore avant... */ /* ATTENTION : la fonction 'NEUT(...)' est definie dans '$xil/defi_K1$vv$DEF' dorenavant... */ #define RIEN(x) \ x \ /* Operation "encore" plus neutre destinee par exemple a transmettre le nom d'une */ \ /* fonction qui est de temps en temps un pointeur 'fPOINTEUR' (on verra avec interet */ \ /* l'exemple de 'ACCES_A_UN_CHAMP()'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A F F E C T A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define CLIR(x) \ EGAL(x,ZERO) \ /* Pour remettre a zero... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R D E S E L E C T I O N C O N D I T I O N N E L L E D ' O P E R A T E U R S : */ /* */ /*************************************************************************************************************************************/ /* Les OPerateurs Conditionnels ont ete introduits le 20070519162237... */ /* ATTENTION : on notera le 20110821102426 que les operateurs 'OPC?(...)' ne peuvent pas */ /* figurer directement au niveau d'un '$K', mais doivent etre necessairement a un niveau */ /* superieur (par exemple celui d'un '$I' : voir 'v $xcg/SegReduct.01$I OPC1' par exemple). */ #define OPC1(condition,operateur_si_VRAI,operateur_si_FAUX,a) \ COND(condition,operateur_si_VRAI(a),operateur_si_FAUX(a)) \ /* Cas des operateurs a une operande... */ #define OPC2(condition,operateur_si_VRAI,operateur_si_FAUX,a,b) \ COND(condition,operateur_si_VRAI(a,b),operateur_si_FAUX(a,b)) \ /* Cas des operateurs a deux operandes. Ceci fut introduit pour 'v $xrv/densite.01$K OPC2'. */ #define OPC3(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c) \ COND(condition,operateur_si_VRAI(a,b,c),operateur_si_FAUX(a,b,c)) \ /* Cas des operateurs a trois operandes... */ #define OPC4(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d) \ COND(condition,operateur_si_VRAI(a,b,c,d),operateur_si_FAUX(a,b,c,d)) \ /* Cas des operateurs a quatre operandes... */ #define OPC5(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e) \ COND(condition,operateur_si_VRAI(a,b,c,d,e),operateur_si_FAUX(a,b,c,d,e)) \ /* Cas des operateurs a cinq operandes (introduit le 20100210103412)... */ #define OPC6(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f),operateur_si_FAUX(a,b,c,d,e,f)) \ /* Cas des operateurs a six operandes (introduit le 20101128150711)... */ #define OPC7(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g),operateur_si_FAUX(a,b,c,d,e,f,g)) \ /* Cas des operateurs a sept operandes (introduit le 20101128150711)... */ #define OPC8(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h),operateur_si_FAUX(a,b,c,d,e,f,g,h)) \ /* Cas des operateurs a huit operandes (introduit le 20101128150711)... */ #define OPC9(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i),operateur_si_FAUX(a,b,c,d,e,f,g,h,i)) \ /* Cas des operateurs a neuf operandes (introduit le 20101128150711)... */ #define OPC10(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i,j) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i,j),operateur_si_FAUX(a,b,c,d,e,f,g,h,i,j)) \ /* Cas des operateurs a dix operandes (introduit le 20101128150711)... */ #define OPC11(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i,j,k) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i,j,k),operateur_si_FAUX(a,b,c,d,e,f,g,h,i,j,k)) \ /* Cas des operateurs a onze operandes (introduit le 20101128150711)... */ #define OPC12(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i,j,k,l) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i,j,k,l),operateur_si_FAUX(a,b,c,d,e,f,g,h,i,j,k,l)) \ /* Cas des operateurs a douze operandes (introduit le 20101128150711)... */ #define OPC13(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i,j,k,l,m) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i,j,k,l,m),operateur_si_FAUX(a,b,c,d,e,f,g,h,i,j,k,l,m)) \ /* Cas des operateurs a treize operandes (introduit le 20101128150711)... */ #define OPC14(condition,operateur_si_VRAI,operateur_si_FAUX,a,b,c,d,e,f,g,h,i,j,k,l,m,n) \ COND(condition,operateur_si_VRAI(a,b,c,d,e,f,g,h,i,j,k,l,m,n),operateur_si_FAUX(a,b,c,d,e,f,g,h,i,j,k,l,m,n)) \ /* Cas des operateurs a quatorze operandes (introduit le 20101128150711)... */ /* ATTENTION : on notera le 20110821102426 que les operateurs 'OPC?(...)' ne peuvent pas */ /* figurer directement au niveau d'un '$K', mais doivent etre necessairement a un niveau */ /* superieur (par exemple celui d'un '$I' : voir 'v $xcg/SegReduct.01$I OPC1' par exemple). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I T E R A T I O N R E C U R S I V E D ' O P E R A T E U R S : */ /* */ /*************************************************************************************************************************************/ #define OPIR02(oper,variable,profondeur,ValeurDefautInferieure,ValeurDefautSuperieure) \ CON04(IFLT(profondeur,ZERO) ,NEUT(ValeurDefautInferieure) \ ,IFEQ(profondeur,ZERO) ,NEUT(variable) \ ,IFEQ(profondeur,UN) ,oper(variable) \ ,IFEQ(profondeur,DEUX) ,oper(oper(variable)) \ ,NEUT(ValeurDefautSuperieure) \ ) #define OPIR03(oper,variable,profondeur,ValeurDefautInferieure,ValeurDefautSuperieure) \ CON05(IFLT(profondeur,ZERO) ,NEUT(ValeurDefautInferieure) \ ,IFEQ(profondeur,ZERO) ,NEUT(variable) \ ,IFEQ(profondeur,UN) ,oper(variable) \ ,IFEQ(profondeur,DEUX) ,oper(oper(variable)) \ ,IFEQ(profondeur,TROIS) ,oper(oper(oper(variable))) \ ,NEUT(ValeurDefautSuperieure) \ ) #define OPIR04(oper,variable,profondeur,ValeurDefautInferieure,ValeurDefautSuperieure) \ CON06(IFLT(profondeur,ZERO) ,NEUT(ValeurDefautInferieure) \ ,IFEQ(profondeur,ZERO) ,NEUT(variable) \ ,IFEQ(profondeur,UN) ,oper(variable) \ ,IFEQ(profondeur,DEUX) ,oper(oper(variable)) \ ,IFEQ(profondeur,TROIS) ,oper(oper(oper(variable))) \ ,IFEQ(profondeur,QUATRE) ,oper(oper(oper(oper(variable)))) \ ,NEUT(ValeurDefautSuperieure) \ ) #define OPIR05(oper,variable,profondeur,ValeurDefautInferieure,ValeurDefautSuperieure) \ CON07(IFLT(profondeur,ZERO) ,NEUT(ValeurDefautInferieure) \ ,IFEQ(profondeur,ZERO) ,NEUT(variable) \ ,IFEQ(profondeur,UN) ,oper(variable) \ ,IFEQ(profondeur,DEUX) ,oper(oper(variable)) \ ,IFEQ(profondeur,TROIS) ,oper(oper(oper(variable))) \ ,IFEQ(profondeur,QUATRE) ,oper(oper(oper(oper(variable)))) \ ,IFEQ(profondeur,CINQ) ,oper(oper(oper(oper(oper(variable))))) \ ,NEUT(ValeurDefautSuperieure) \ ) #define OPIR08(oper,variable,profondeur,ValeurDefautInferieure,ValeurDefautSuperieure) \ CON10(IFLT(profondeur,ZERO) ,NEUT(ValeurDefautInferieure) \ ,IFEQ(profondeur,ZERO) ,NEUT(variable) \ ,IFEQ(profondeur,UN) ,oper(variable) \ ,IFEQ(profondeur,DEUX) ,oper(oper(variable)) \ ,IFEQ(profondeur,TROIS) ,oper(oper(oper(variable))) \ ,IFEQ(profondeur,QUATRE) ,oper(oper(oper(oper(variable)))) \ ,IFEQ(profondeur,CINQ) ,oper(oper(oper(oper(oper(variable))))) \ ,IFEQ(profondeur,SIX) ,oper(oper(oper(oper(oper(oper(variable)))))) \ ,IFEQ(profondeur,SEPT) ,oper(oper(oper(oper(oper(oper(oper(variable))))))) \ ,IFEQ(profondeur,HUIT) ,oper(oper(oper(oper(oper(oper(oper(oper(variable)))))))) \ ,NEUT(ValeurDefautSuperieure) \ ) /* Iteration Recursive d'un OPerateur (introduite le 20160615094603). Au passage, je n'ai */ /* rien trouve de plus simple et de plus elegant de facon a ce que cela puisse s'appliquer */ /* a un operateur quelconque ('v $xrv/SLOGX.01$K OPIR03'). */ /* */ /* Le 20160615101338, j'ai introduit 'OPIR03(...)', tout en conservant 'OPIR08(...)', */ /* sachant que ce dernier pose des problemes de temps d'execution de 'v $xcc/cpp$Z'... */ /* Au passage, j'ai essaye de passer de 'TROIS' a 'QUATRE', mais ce n'est pas raisonnable... */ /* A titre d'information l'instruction 'v $xrv/SLOGX.01$K ,OPIR03.SLOGX', une fois traduite */ /* en '$c' passe de 818 a 8168 lignes. Je note le 20160617141551 que c'est fort probablement */ /* le 'ABSO(...)' contenu dans la definition de 'SLOGX(...)' via 'fSOPER(....)' qui en est */ /* responsable... */ /* */ /* Le 20160617153646, grace a l'utilisation de 'fABSO(...)' dans la definition de */ /* 'SLOGX(...)', 'OPIR04(...)' et 'OPIR05(...)' ont pu etre introduits raisonnablement... */ /* */ /* En fait, a la date du 20160617161945, seul 'OPIR05(...)' est utile, tous les autres */ /* pourraient etre supprimes... */ /* */ /* Suite a l'introduction de 'OPIR0n(...)' le 20160618094352, les 'OPIR0?(...)' ont */ /* perdu toute utilite, mais pour le plaisir je les conserve (privisoirement ?). */ #define gOPIR0n(valeur_courante_de_l_operateur,variable,profondeur,ValeurDefautInferieure,Type,ValeurUndef) \ /* Dans cette version generale, 'ValeurDefautSuperieure' n'a plus de sens... */ \ PARE( \ Bblock \ DEFV(Type,INIT(gOPIR0n_____VariableTemporaire,ValeurUndef)); \ /* On notera que l'on pourrait ecrire : */ \ /* */ \ /* DEFV(Type,INIT(gOPIR0n_____VariableTemporaire,NEUT(variable))); */ \ /* */ \ /* pour optimiser d'une part en simplifiant le cas ou 'IFEQ(profondeur,ZERO)' et d'autre */ \ /* part en supprimant l'initialisation de 'gOPIR0n_____VariableTemporaire' avant le */ \ /* 'Repe(...)', mais la valeur initiale de 'gOPIR0n_____VariableTemporaire' pourrait etre */ \ /* differente dans ces deux cas en toute generalite... */ \ \ Test(IFLE(profondeur,ZERO)) \ Bblock \ EGAL(gOPIR0n_____VariableTemporaire,COND(IFLT(profondeur,ZERO),ValeurDefautInferieure,NEUT(variable))); \ Eblock \ ATes \ Bblock \ EGAL(gOPIR0n_____VariableTemporaire,NEUT(variable)); \ \ Repe(profondeur) \ Bblock \ EGAL(gOPIR0n_____VariableTemporaire,valeur_courante_de_l_operateur); \ /* Iteration de 'operateur(...)'... */ \ /* */ \ /* Jusqu'au 20160620134325, il y avait ci-dessus : */ \ /* */ \ /* EGAL(gOPIR0n_____VariableTemporaire,operateur(gOPIR0n_____VariableTemporaire)); */ \ /* */ \ /* L'inconvenient etait alors que l'on se limitait a des operateurs unaires. Or de nombreux */ \ /* operateurs ne le sont pas (par exemple 'SPUIX(...)'). D'ou cette nouvelle formulation */ \ /* qui renvoie le calcul dans l'appel a 'gOPIR0n(...)'. */ \ Eblock \ ERep \ Eblock \ ETes \ \ NEUT(gOPIR0n_____VariableTemporaire); \ /* Renvoi de la valeur de 'variable' iteree 'profondeur' fois par 'operateur(...)'... */ \ Eblock \ ) \ /* Version generale de l'Iteration Recursive d'un OPerateur (introduite le 20160618094352). */ #define fOPIR0n(valeur_courante_de_l_operateur,variable,profondeur,ValeurDefautInferieure) \ gOPIR0n(valeur_courante_de_l_operateur \ ,variable \ ,profondeur \ ,ValeurDefautInferieure \ ,Float \ ,FLOT__UNDEF \ ) #define fOPIR1n(operateur,variable,profondeur,ValeurDefautInferieure) \ fOPIR0n(operateur(gOPIR0n_____VariableTemporaire) \ ,variable \ ,profondeur \ ,ValeurDefautInferieure \ ) /* Versions flottantes de l'Iteration Recursive d'un OPerateur (introduite le */ /* 20160618111504). L'operateur 'fOPIR0n(...)' et la version generale flottante. */ /* */ /* Le 20160620134325 a ete introduite 'fOPIR1n(...)' qui est la version operateur unaire (1) */ /* de 'fOPIR0n(...)'. On notera que pour operateurs N-aires et par exemple 'SPUIX(...)', on */ /* ecrira : */ /* */ /* fOPIR0n(SPUIX(gOPIR0n_____VariableTemporaire,exposant) */ /* ,variable */ /* ,profondeur */ /* ,ValeurDefautInferieure */ /* ) */ /* */ /* Voir par exemple 'v $xrv/SPUIX.01$K fOPIR0n.SPUIX.' a ce propos... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D ' A D D I T I O N : */ /* */ /*************************************************************************************************************************************/ -define ADD1(a) \ -_-_-_- NEUT(a) /* La fonction 'ADD1' est introduite afin de "symetriser" les sommes a 1 terme... */ _____define(GenOperator_PASSE_D_____ADDn,++D++-define $1($3,$4) \ -_-_-_- ADD2($2($3),$4)++F++ ) /* Generateur des 'ADD?(....)'s introduit le 20070914092847... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....ADDn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'ADD?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'ADD?' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (nombre variables d'elements), */ /* $4 : deuxieme liste d'arguments (toujours un seul element). */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE.D.....ADDn') */ /* donne a priori a 'GenOperator.PASSE.D.....ADDn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....ADDn' la bonne definition... */ /* */ /* Le 20070913153802 le nom 'GenOperator_____ADDn(...)' fut change en */ /* 'GenOperator_P_D_____ADDn(...)' afin de contenir la passe '$PASSE_D' de generation, */ /* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */ /* */ /* Le 20071003152838 le nom 'GenOperator_P_D_____ADDn(...)' a ete change en */ /* 'GenOperator.PASSE.D.....ADDn(...)' pour une meilleure lisibilite... */ GenOperator_PASSE_D_____ADDn(ADD3 ,ADD2 ,++D++a,b++F++,++D++c++F++) GenOperator_PASSE_D_____ADDn(ADD4 ,ADD3 ,++D++a,b,c++F++,++D++d++F++) GenOperator_PASSE_D_____ADDn(ADD5 ,ADD4 ,++D++a,b,c,d++F++,++D++e++F++) GenOperator_PASSE_D_____ADDn(ADD6 ,ADD5 ,++D++a,b,c,d,e++F++,++D++f++F++) GenOperator_PASSE_D_____ADDn(ADD7 ,ADD6 ,++D++a,b,c,d,e,f++F++,++D++g++F++) GenOperator_PASSE_D_____ADDn(ADD8 ,ADD7 ,++D++a,b,c,d,e,f,g++F++,++D++h++F++) GenOperator_PASSE_D_____ADDn(ADD9 ,ADD8 ,++D++a,b,c,d,e,f,g,h++F++,++D++i++F++) GenOperator_PASSE_D_____ADDn(ADD10,ADD9 ,++D++a,b,c,d,e,f,g,h,i++F++,++D++j++F++) GenOperator_PASSE_D_____ADDn(ADD11,ADD10,++D++a,b,c,d,e,f,g,h,i,j++F++,++D++k++F++) GenOperator_PASSE_D_____ADDn(ADD12,ADD11,++D++a,b,c,d,e,f,g,h,i,j,k++F++,++D++l++F++) GenOperator_PASSE_D_____ADDn(ADD13,ADD12,++D++a,b,c,d,e,f,g,h,i,j,k,l++F++,++D++m++F++) GenOperator_PASSE_D_____ADDn(ADD14,ADD13,++D++a,b,c,d,e,f,g,h,i,j,k,l,m++F++,++D++n++F++) GenOperator_PASSE_D_____ADDn(ADD15,ADD14,++D++a,b,c,d,e,f,g,h,i,j,k,l,m,n++F++,++D++o++F++) GenOperator_PASSE_D_____ADDn(ADD16,ADD15,++D++a,b,c,d,e,f,g,h,i,j,k,l,m,n,o++F++,++D++p++F++) /* Le 20080102130008, furent introduites 'ADD15(...)' et 'ADD16(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E R I V E E D ' U N E S O M M E : */ /* */ /*************************************************************************************************************************************/ #define d_ADD2(u,v) \ ADD2(d#u,d#v) #define d_bADD(u,v) \ bADD(d#u,d#v) /* Derivee de la somme de deux termes : */ /* */ /* d(u+v) = d(u) + d(v) */ /* */ /* Le 20101210184750 la derivee de 'd_bADD(...)' a ete introduite a cause des modifications */ /* faites aux environs du 20101120092003... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N V A L E U R A B S O L U E : */ /* */ /*************************************************************************************************************************************/ -define ABSO(x) \ -_-_-_- COND(IZGE(x),NEUT(x),NEGA(x)) /* Recherche de la valeur absolue du nombre 'x'. */ /* */ /* Le 20080104145324, la procedure 'NEUT(...)' fut introduite par symetrie avec 'NEGA(...)'. */ -define OSBA(x) \ -_-_-_- NEGA(ABSO(x)) /* La "Anti Valeur Absolue" a ete introduite le 20070820130154, pour le plaisir... */ #define fABSO(x) \ PARE( \ Bblock \ DEFV(Float,INIT(fABSO_____VariableTemporaire,NEUT(x))); \ ABSO(fABSO_____VariableTemporaire); \ Eblock \ ) \ /* Version flottante optimisee introduite le 20160617153646 pour alleger la compilation */ \ /* de 'v $xrv/SLOGX.01$K .OPIR03.SLOGX'... Elle permet de ne calculer qu'une seule fois */ \ /* la valeur de 'x'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D E S O U S T R A C T I O N : */ /* */ /*************************************************************************************************************************************/ #define SOUA(a,b) \ ABSO(SOUS(a,b)) \ /* Soustraction en valeur absolue des deux nombres 'a' et 'b'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E R I V E E D ' U N E D I F F E R E N C E : */ /* */ /*************************************************************************************************************************************/ #define d_SOUS(u,v) \ SOUS(d#u,d#v) #define d_bSOU(u,v) \ bSOU(d#u,d#v) /* Derivee de la difference de deux termes : */ /* */ /* d(u-v) = d(u) - d(v) */ /* */ /* Le 20101210184750 la derivee de 'd_bADD(...)' a ete introduite a cause des modifications */ /* faites aux environs du 20101120092003... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D E M U L T I P L I C A T I O N : */ /* */ /*************************************************************************************************************************************/ -define MUL0(a) \ -_-_-_- UN /* La fonction 'MUL0' est introduite afin de "symetriser" les produits a 0 facteur et ce */ /* de facon compatible avec la fonction factorielle pour laquelle : */ /* */ /* 0! = 1 */ /* */ -define MUL1(a) \ -_-_-_- NEUT(a) /* La fonction 'MUL1' est introduite afin de "symetriser" les produits a 1 facteur... */ _____define(GenOperator_PASSE_D_____MULn,++D++-define $1($3,$4) \ -_-_-_- MUL2($2($3),$4)++F++ ) /* Generateur des 'MUL?(....)'s introduit le 20070914092847... */ /* */ /* ATTENTION : On consultera avec profit les commentaires de 'v $xil/re_definit$DEF', la */ /* definition precedente pouvant, par exemple, se reformuler : */ /* */ /* MUL2($4,$2($3)) */ /* */ /* Definition des arguments de 'GenOperator.PASSE_D.....MULn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'MUL?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'MUL?' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (nombre variables d'elements), */ /* $4 : deuxieme liste d'arguments (toujours un seul element). */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE_D.....MULn') */ /* donne a priori a 'GenOperator.PASSE_D.....MULn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE_D.....MULn' la bonne definition... */ /* */ /* Le 20070913153802 le nom 'GenOperator_____MULn(...)' fut change en */ /* 'GenOperator_P_D_____MULn(...)' afin de contenir la passe '$PASSE_D' de generation, */ /* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */ /* */ /* Le 20071003152838 le nom 'GenOperator_P_D_____MULn(...)' a ete change en */ /* 'GenOperator.PASSE_D.....MULn(...)' pour une meilleure lisibilite... */ GenOperator_PASSE_D_____MULn(MUL3,MUL2,++D++a,b++F++,++D++c++F++) GenOperator_PASSE_D_____MULn(MUL4,MUL3,++D++a,b,c++F++,++D++d++F++) GenOperator_PASSE_D_____MULn(MUL5,MUL4,++D++a,b,c,d++F++,++D++e++F++) GenOperator_PASSE_D_____MULn(MUL6,MUL5,++D++a,b,c,d,e++F++,++D++f++F++) GenOperator_PASSE_D_____MULn(MUL7,MUL6,++D++a,b,c,d,e,f++F++,++D++g++F++) GenOperator_PASSE_D_____MULn(MUL8,MUL7,++D++a,b,c,d,e,f,g++F++,++D++h++F++) GenOperator_PASSE_D_____MULn(MUL9,MUL8,++D++a,b,c,d,e,f,g,h++F++,++D++i++F++) GenOperator_PASSE_D_____MULn(MUL10,MUL9,++D++a,b,c,d,e,f,g,h,i++F++,++D++j++F++) /* Le 20181104103702 'MUL6(...)', 'MUL7(...)', 'MUL8(...)' et 'MUL9(...)' ont ete */ /* introduits "pour le plaisir" (inutiles a cette date...). */ /* */ /* Le 20190203101754, 'MUL10(...)' a ete introduit (bien qu'il ne serve a rien a cette */ /* date) afin de rappeler qu'a compter du 20190201124644, ce type d'operateur est numerote */ /* sur deux chiffres apres le numero "9"... */ #define MULH24(a,b) \ FfHORNER_2_04(FLOT(a),FLOT(b)) \ /* Fonction 'FfHORNER_2_04(...)' introduite le 20181203155632... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E R I V E E D ' U N P R O D U I T : */ /* */ /*************************************************************************************************************************************/ #define d_MUL2(u,v) \ ADD2(MUL2(d#u,v),MUL2(u,d#v)) #define d_bMUL(u,v) \ bADD(bMUL(d#u,v),bMUL(u,d#v)) /* Derivee du produit de deux termes : */ /* */ /* d(u.v) = [d(u).v] + [u.d(v)] */ /* */ /* Le 20101210184750 la derivee de 'd_bADD(...)' a ete introduite a cause des modifications */ /* faites aux environs du 20101120092003... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D E D I V I S I O N : */ /* */ /*************************************************************************************************************************************/ -define DIV0(a,b,c,d) \ -_-_-_- COND(IFET(IZEQ(a),IZEQ(b)) \ -_-_-_- ,d \ -_-_-_- ,COND(IZEQ(b) \ -_-_-_- ,c \ -_-_-_- ,DIVI(a,b) \ -_-_-_- ) \ -_-_-_- ) /* Division de 'a' par 'b' avec traitement de la division par 0 (avec renvoi d'une valeur */ /* donnee par l'argument 'c') et du cas 0/0 (avec renvoi d'une valeur donnee par l'argument */ /* 'd'). */ -define DIVZ(a,b) \ -_-_-_- DIV0(a,b,MEME_SIGNE_QUE(a,INFINI),UN) /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ /* de l'infini ou de 1 dans le cas des divisions par 0... */ -define DIVZI(a,b,valeur_en_cas_d_Indetermination) \ -_-_-_- DIV0(a,b,MEME_SIGNE_QUE(a,INFINI),valeur_en_cas_d_Indetermination) /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ /* de l'infini dans le cas a/0 et une valeur donnee dans le cas "Indetermine" 0/0. Ceci */ /* a ete introduit le 20021120172628 pour 'v $xrs/bKlein.41$I DIVZI'. */ -define fDIVZ(a,b) \ -_-_-_- DIV0(a,b,MEME_SIGNE_QUE(a,F_INFINI),FU) /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ /* de l'infini ou de 1 dans le cas des divisions par 0... Le 20001223232351, le 'UN' */ /* fut remplace par 'FU'. */ -define fDIVZI(a,b,valeur_en_cas_d_Indetermination) \ -_-_-_- DIV0(a,b,MEME_SIGNE_QUE(a,F_INFINI),valeur_en_cas_d_Indetermination) /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ /* de l'infini dans le cas a/0 et une valeur donnee dans le cas "Indetermine" 0/0. Ceci */ /* a ete introduit le 20021120172628 par symetrie avec 'DIVZI(...)'. */ #define RESZ(a,b) \ COND(IZNE(b),REST(a,b),a) \ /* Reste de la division entiere de 'a' par 'b' avec traitement special du cas b=0. Ceci a */ \ /* ete introduit le 20010531103929 pour 'v $xrs/CalabiYau.21$K RESZ' par exemple. */ \ /* */ \ /* Jusqu'au 20140307093749, la definition etait : */ \ /* */ \ /* COND(IZNE(b),REST(a,b),b) */ \ /* */ \ /* Or la definition de la division euclidienne est : */ \ /* */ \ /* a = b.q + r */ \ /* */ \ /* ce qui donne : */ \ /* */ \ /* a = r */ \ /* */ \ /* si 'b' est nul, d'ou la nouvelle definition... */ #define DIV0_a_peu_pres(a,b,c,d,epsilon) \ COND(IFET(IZEQ_a_peu_pres(a,epsilon),IZEQ_a_peu_pres(b,epsilon)) \ ,d \ ,COND(IZEQ_a_peu_pres(b,epsilon) \ ,c \ ,DIVI(a,b) \ ) \ ) \ /* Division de 'a' par 'b' avec traitement de la division par 0 (avec renvoi d'une valeur */ \ /* donnee par l'argument 'c') et du cas 0/0 (avec renvoi d'une valeur donnee par l'argument */ \ /* 'd'), les tests de nullite etant faits a "epsilon pres"... */ #define DIVZ_a_peu_pres(a,b,epsilon) \ DIV0_a_peu_pres(a,b,MEME_SIGNE_QUE(a,INFINI),UN,epsilon) \ /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ \ /* de l'infini ou de un dans le cas des divisions par 0 a "epsilon pres"... */ #define fDIVZ_a_peu_pres(a,b,epsilon) \ DIV0_a_peu_pres(a,b,MEME_SIGNE_QUE(a,F_INFINI),UN,epsilon) \ /* Division de 'a' par 'b' avec traitement de la division par 0, et renvoi eventuel */ \ /* de l'infini ou de un dans le cas des divisions par 0 a "epsilon pres"... */ #define QUOD(a,b) \ INTE(bDIV(INTE(a),INTE(b))) \ /* Quotient par defaut des deux nombres 'a' et 'b' ; le quotient et le */ \ /* reste sont du signe du dividende 'a'. */ #define QUOE(a,b) \ COND(IZEQ(REST(a,b)) \ ,QUOD(a,b) \ ,COND(IFEQ(SIGN(bMUL(a,b)),SIGNE_PLUS) \ ,SUCC(QUOD(a,b)) \ ,PRED(QUOD(a,b)) \ ) \ ) \ /* Quotient par exces des deux nombres 'a' et 'b' ; le quotient a le signe */ \ /* du produit 'a*b'. ATTENTION, il y avait autrefois : */ \ /* */ \ /* IFEQ(SIGN(QUOD(a,b)),SIGNE_PLUS) */ \ /* */ \ /* ce qui n'est pas compatible avec le commentaire precedent... */ \ /* */ \ /* Le 20101120091431, 'bMUL(...)' a remplace 'MUL2(...)'. */ #define MULD(a,b) \ bMUL(QUOD(a,b),INTE(b)) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par defaut. */ \ /* */ \ /* Le 20090319113909, je me demande quelle est la difference avec 'iMULTIPLE(...)' ? A */ \ /* priori, il n'y en a pas mais on ne sait jamais... */ #define MULE(a,b) \ bMUL(QUOE(a,b),INTE(b)) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par exces. */ #nodefine fMULD_VERSION_01(a,b) \ SOUS(a,MODF(a,FZERO,b)) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par defaut en flottant (premiere */ \ /* version)... */ \ /* */ \ /* Le 20030222102112, 'fMULD_VERSION_01(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fMULD_VERSION_02(a,b) \ SOUS(a,COND(IZGE(fREST(a,b)),fREST(a,b),NEGA(fREST(a,b)))) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par defaut en flottant (deuxieme */ \ /* version). ATTENTION, il y a eu pendant un temps : */ \ /* */ \ /* SOUS(a,COND(IZGE(fREST(a,b)),fREST(a,b),ADD2(fREST(a,b),b))) */ \ /* */ \ /* mais cela semble faux... */ #nodefine fMULD_VERSION_03(a,b) \ ffMULD(a,b) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par defaut en flottant (troisieme */ \ /* version)... */ \ /* */ \ /* Le 20030222102112, 'fMULD_VERSION_03(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fMULD(a,b) \ fMULD_VERSION_02(a,b) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par defaut en flottant (version */ \ /* courante)... */ #nodefine fMULE_VERSION_01(a,b) \ ADD2(a,SOUS(b,MODF(a,FZERO,b))) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par exces en flottant (premiere */ \ /* version)... */ \ /* */ \ /* Le 20030222102112, 'fMULE_VERSION_01(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fMULE_VERSION_02(a,b) \ ADD2(fMULD_VERSION_02(a,b),b) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par exces en flottant (deuxieme */ \ /* version)... */ #nodefine fMULE_VERSION_03(a,b) \ ADD2(fMULD_VERSION_02(a,b),b) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par exces en flottant (troisieme */ \ /* version)... */ \ /* */ \ /* Le 20030222102112, 'fMULE_VERSION_03(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fMULE(a,b) \ fMULE_VERSION_02(a,b) \ /* Donne le multiple de 'b' qui soit le plus proche de 'a' par exces en flottant (version */ \ /* courante)... */ #define MULF(x,h) \ bDIV(AINT(bMUL(x,h)),h) \ /* Ramene le nombre 'x' a une valeur inferieure ou egale 'y' tel que le produit 'y.h' soit */ \ /* entier. Par exemple : */ \ /* */ \ /* MULF(3.1415,100) = 3.14 */ \ /* */ \ /* ATTENTION, jusqu'au 1995111900, il y avait ici : */ \ /* */ \ /* #define MULF(x,h) \ */ \ /* DIVI(ARRO(MUL2(x,h)),h) */ \ /* */ \ /* mais le 'ARRO(...)' travaille aussi bien par defaut que par exces... */ \ /* */ \ /* ATTENTION, jusqu'au 1995120400, il y avait ici : */ \ /* */ \ /* #define MULF(x,h) \ */ \ /* DIVI(fENTE(MUL2(x,h)),h) */ \ /* */ \ /* mais pour de petits epsilon, la fonction 'INTE(...)' qui etait alors appelee creait un */ \ /* defaut de conversion "flottant vers entier" (debordement...). */ \ /* */ \ /* Le 20101120081525, 'bDIV(...)' et 'bMUL(...)' ont remplace 'DIVI(...)' et 'MUL2(...)'. */ #define iMULTIPLE(x,m) \ bMUL(INTE(bDIV(x,m)),m) \ /* Construction d'un nombre entier voisin de 'x' et multiple de 'm' (introduit le */ \ /* 20031111175851 pour 'v $xcg/CheckMem$vv$K iMULTIPLE'). */ \ /* */ \ /* Le 20090319113909, je me demande quelle est la difference avec 'MULD(...)' ? A priori, */ \ /* il n'y en a pas mais on ne sait jamais... */ #define MULTIPLE(x,m) \ FLOT(iMULTIPLE(x,m)) \ /* Construction d'un nombre flottant voisin de 'x' et multiple de 'm'. */ #define MULTIPLE1(x,m) \ COND(IFEQ(m,FU),x,MULTIPLE(x,m)) \ /* Construction d'un nombre flottant voisin de 'x' et multiple de 'm' en garantissant */ \ /* de conserver la valeur de 'x' si 'm' est egal a l'unite (introduit le 20231010095702...). */ #define DIVISIBLE(a,b) \ COND(IZEQ(REST(a,b)),VRAI,FAUX) \ /* Test de la divisibilite de 'a' par 'b'. */ #define NON_DIVISIBLE(a,b) \ NOTL(DIVISIBLE(a,b)) \ /* Test de la non divisibilite de 'a' par 'b'. */ #define fDIVISIBLE(a,b) \ COND(IFEQ(fMULD(a,b),a),VRAI,FAUX) \ /* Test de la divisibilite de 'a' par 'b' pour des nombres flottants. */ #define fNON_DIVISIBLE(a,b) \ NOTL(fDIVISIBLE(a,b)) \ /* Test de la non divisibilite de 'a' par 'b' pour des nombres flottants. */ #define fDIVISIBLE_a_peu_pres_absolu(a,b,epsilon) \ COND(IFEQ_a_peu_pres_absolu(fMULD(a,b),a,epsilon),VRAI,FAUX) \ /* Test de la divisibilite de 'a' par 'b' pour des nombres flottants a 'epsilon' pres. */ #define fNON_DIVISIBLE_a_peu_pres_absolu(a,b,epsilon) \ NOTL(fDIVISIBLE_a_peu_pres_absolu(a,b,epsilon)) \ /* Test de la non divisibilite de 'a' par 'b' pour des nombres flottants a 'epsilon' pres. */ #define EST_ENTIER(x) \ IFEQ(x,INTE(x)) \ /* Test de la nature entiere de 'x' pour des petits nombres (c'est-a-dire inferieurs ou */ \ /* egaux en valeur absolue a 'INFINI'). */ #define N_EST_PAS_ENTIER(x) \ NOTL(EST_ENTIER(x)) \ /* Test de la nature non entiere de 'x' pour des petits nombres (c'est-a-dire inferieurs ou */ \ /* egaux en valeur absolue a 'INFINI'). */ #define fEST_ENTIER(x) \ IFEQ(x,AINT(x)) \ /* Test de la nature entiere de 'x' pour des nombres quelconques (de toute grandeur...). */ #define fN_EST_PAS_ENTIER(x) \ NOTL(fEST_ENTIER(x)) \ /* Test de la nature non entiere de 'x' pour des nombres quelconques (de toute grandeur...). */ #define fiEST_ENTIER(x) \ IFEQ(FLOT(VINTE(x)),x) \ /* Test de la nature entiere de 'x' pour des nombres quelconques avec test des Infinis (ceci */ \ /* fut introduit le 20210307182306 pour 'v $xig/defin_2$vv$DEF fiEST_ENTIER'). */ #define fiN_EST_PAS_ENTIER(x) \ NOTL(fiEST_ENTIER(x)) \ /* Test de la nature non entiere de 'x' pour des nombres quelconques avec test des Infinis */ /* (ceci fut introduit le 20210307182306). */ #define AINT_a_peu_pres(x,epsilon) \ AINT(bADD(x,epsilon)) \ /* Afin d'eviter les problemes d'arrondi ('v $xci/valeurs.02$I AINT_a_peu_pres'). */ \ /* */ \ /* Le 20101120092003, 'bADD(...)' plus logique a remplace 'ADD2(...)'. */ #define PGCD(a,b) \ PlusGrandCommunDiviseur(INTE(a),INTE(b)) #define PPCM(a,b) \ PlusPetitCommunMultiple(INTE(a),INTE(b)) /* "PGCD" et "PPCM" de deux nombres (procedures introduites le 20081116094531). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E R I V E E D ' U N Q U O T I E N T : */ /* */ /*************************************************************************************************************************************/ #define d_DIVI(u,v) \ DIVI(SOUS(MUL2(d#u,v),MUL2(u,d#v)),EXP2(v)) #define d_bDIV(u,v) \ bDIV(bSOU(bMUL(d#u,v),bMUL(u,d#v)),EXP2(v)) /* Derivee du produit de deux termes : */ /* */ /* [d(u).v] - [u.d(v)] */ /* d(u.v) = --------------------- */ /* 2 */ /* v */ /* */ /* Le 20101210184750 la derivee de 'd_bADD(...)' a ete introduite a cause des modifications */ /* faites aux environs du 20101120092003... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D ' A R R O N D I : */ /* */ /*************************************************************************************************************************************/ #define gFLIN(x,translation,entier) \ entier(bADD(COND(IZGE(x),x,bSOU(x,FU)),translation)) \ /* Passage general FLottant vers INteger avec translation quelconque lorsque l'argument 'x' */ \ /* est negatif et une conversion arbitraire. */ \ /* */ \ /* Le 20101120092003, 'bADD(...)' et 'bSOU(...)' ont remplace 'ADD2(...)' et 'SOUS(...)'. */ #define fFLIN(x,translation) \ gFLIN(x,translation,NEUT) \ /* Translation quelconque en restant en Flottant (introduit le 20040910142802 pour etre */ \ /* etre utilise dans 'v $xiiD/definit.2$DEF 20040910141428'). */ #define FLIN(x,translation) \ gFLIN(x,translation,INTE) \ /* Passage general FLottant vers INteger avec translation quelconque lorsque l'argument 'x' */ \ /* est negatif et une conversion standard. */ #define VFLIN(x,translation) \ gFLIN(x,translation,VINTE) \ /* Passage general FLottant vers INteger avec translation quelconque lorsque l'argument 'x' */ \ /* est negatif et une conversion avec validation de non debordement. */ #define TRANSLATION_D_ARRONDI_AU_PLUS_PROCHE_ENTIER \ FDU #define ARRI(x) \ FLIN(x,TRANSLATION_D_ARRONDI_AU_PLUS_PROCHE_ENTIER) /* Arrondi du nombre 'x' a la plus proche valeur entiere. */ #define ARRX(x) \ FLIN(x,UN_MOINS_EPSILON) \ /* Arrondi du nombre 'x' par exces, c'est-a-dire a l'entier suivant si 'x' n'est pas */ \ /* lui-meme un nombre entier. */ #define ARRO(x) \ FLOT(ARRI(x)) \ /* Version flottante de 'ARRI(...)'. */ #define ENTE(x) \ FLIN(x,FZERO) \ /* Arrondi du nombre 'x' a la plus proche valeur entiere, telle que : */ \ /* */ \ /* INTE(+0.75) = 0, */ \ /* INTE(+0.25) = 0, */ \ /* INTE(-0.25) = 0, */ \ /* INTE(-0.75) = 0, */ \ /* */ \ /* ENTE(+0.75) = 0, */ \ /* ENTE(+0.25) = 0, */ \ /* ENTE(-0.25) = -1, */ \ /* ENTE(-0.75) = -1. */ \ /* */ \ /* et au passage : */ \ /* */ \ /* INTE(+1.75) = +1, */ \ /* ENTE(+1.75) = +1, */ \ /* */ \ /* INTE(+2.00) = +2, */ \ /* ENTE(+2.00) = +2 (=INTE(+2.00)), */ \ /* */ \ /* INTE(-2.00) = -2, */ \ /* ENTE(-2.00) = -3 (=INTE(+2.00)-1). */ \ /* */ #define ENTO(x) \ FLOT(ENTE(x)) \ /* Version flottante de 'ENTE(...)' (introduite le 20120619084023). */ #define ANTE(x) \ FLIN(x,mgEPSILON) \ /* Arrondi du nombre 'x' a la plus proche valeur entiere destine a compenser les */ \ /* approximations (introduit le 20090225130838 pour 'v $xiii/di_image$DEF 20090225114137'. */ #define fINTE(x) \ FLOT(INTE(x)) \ /* Version flottante de 'INTE(...)'. */ #define fENTE(x) \ FLOT(ENTE(x)) \ /* Version flottante de 'ENTE(...)'. */ /* ATTENTION, avant la nouvelle definition de 'MOINS_L_INFINI' (le 30/03/94), il y avait */ /* ici : */ /* */ /* #define INFINI_M1 \ */ /* SOUS(INFINI,UN) */ /* #define MOINS_L_INFINI_P1 \ */ /* ADD2(MOINS_L_INFINI,UN) */ /* */ /* ces deux constantes sont definies car en effet, si l'on utilise directement plus ou moins */ /* l'infini, un probleme tres delicat apparaitrait. Celui-ci a ete mis en evidence dans le */ /* fichier 'v $xrq/nucleon.LS.1$I' lors de l'appel des procedures 'begin_colonneQ(...)' */ /* et 'begin_ligneQ(...)', lorsque les bornes des coordonnees etaient a l'infini. On pourra */ /* a ce propos voir le programme 'v $xtc/infini.01$c'... */ /* */ /* #define VINTE(x) \ */ /* INTE(COND(IFINff(x,FLOT(MOINS_L_INFINI_P1),FLOT(INFINI_M1)) \ */ /* ,x \ */ /* ,MEME_SIGNE_QUE(x,INFINI_M1) \ */ /* ) \ */ /* ) */ /* mais tout ceci est devenu inutile... */ #define VINTE(x) \ INTE(COND(IFINff(x,FLOT(MOINS_L_INFINI),FLOT(INFINI)) \ ,x \ ,MEME_SIGNE_QUE(x,INFINI) \ ) \ ) \ /* Partie entiere d'un nombre avec test de debordement possible lors de la conversion... */ \ /* ATTENTION, l'ecriture : */ \ /* */ \ /* VINTE(DEUXp31M1) */ \ /* */ \ /* est fausse car 'DEUXp31M1' est vu alors comme un nombre entier negatif, et la valeur */ \ /* renvoyee est egale a 'DEUXp31M1 - 2'... */ #nodefine fARRI_VERSION_01(x,epsilon) \ MULF(ADD2(x,MOIT(epsilon)),INVE(epsilon)) \ /* Arrondi du nombre 'x' a la plus proche valeur multiple de 'epsilon' (premiere version). */ \ /* On notera que (aux types pres), on a l'equivalence entre : */ \ /* */ \ /* ARRI(x) */ \ /* */ \ /* et : */ \ /* */ \ /* fARRI(x,UN) */ \ /* */ \ /* la nouveaute etant ici que cette notion peut etre etendue a des 'epsilon' non entiers... */ \ /* */ \ /* ATTENTION, jusqu'au 1995120500, il y avait ici : */ \ /* */ \ /* MULF(ADD2(x,MOIT(epsilon)),INVE(epsilon)) */ \ /* */ \ /* mais cela a cree des problemes dans '$xiii/aleat.2$vv$FON' lors de l'introduction des */ \ /* reductions lineaires ; malheureusement, la correction apportee : */ \ /* */ \ /* MULF(ADD2(x,MUL2(COMP(epsilon),epsilon)),INVE(epsilon)) */ \ /* */ \ /* a ete nefaste dans le cas des reductions non lineaires, d'ou un retour en arriere le */ \ /* meme jour... */ \ /* */ \ /* Le 20030222102112, 'fARRI_VERSION_01(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fARRI_VERSION_02(x,epsilon) \ fMULD_VERSION_02(x,epsilon) \ /* Arrondi du nombre 'x' a la plus proche valeur multiple de 'epsilon' (deuxieme version). */ #nodefine fARRI_VERSION_03(x,epsilon) \ fMULD_VERSION_02(x,epsilon) \ /* Arrondi du nombre 'x' a la plus proche valeur multiple de 'epsilon' (troisieme version). */ \ /* */ \ /* Le 20030222102112, 'fARRI_VERSION_03(...)' est passe de 'define' a 'nodefine' afin de */ \ /* ne pas etre recupere par le processus 'v $xcc/cpp$Z _VERSION_'. */ #define fARRI(x,epsilon) \ fARRI_VERSION_02(x,epsilon) \ /* Arrondi du nombre 'x' a la plus proche valeur multiple de 'epsilon' (version "active"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D ' I N V E R S I O N S D I V E R S E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autres ; en particulier 'SOUS(...)' et 'DIVI(...)' */ /* doivent etre definies avant tout '-define ...' qui les utilisent... */ -define NEGA(x) \ -_-_-_- bSOU(ZERO,x) /* Inversion du signe du nombre 'x'. */ /* */ /* Le 20101119173715, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ #define COMP(x) \ SOUS(UN,x) \ /* Complementation a un du nombre 'x'. */ \ /* */ \ /* On notera que par symetrie avec 'INVE(...)' qui utilise 'DIVI(...)' (et non pas */ \ /* 'bDIV(...)'), 'COMP(...)' utilise 'SOUS(...)' (et non pas 'bSOU(...)'). */ #define gCOMP(x,a,b) \ SOUS(x,DOUB(SOUS(x,MOYE(a,b)))) \ /* Complementation generalisee du nombre 'x' dans le segment [a,b], ce qui revient a faire */ \ /* une symetrie de 'x' par rapport au milieu de [a,b]. On notera que l'on pourrait */ \ /* simplifier l'ecriture precedente en : */ \ /* */ \ /* #define gCOMP(x,a,b) \ */ \ /* SOUS(ADD2(a,b),x) */ \ /* */ \ /* mais il s'agit, encore une fois, de privilegier la comprehension (en fait ces deux */ \ /* possibilites ont ete permutees le 20071024164122...). */ #define aCOMP(x) \ NEGA(COMP(x)) \ /* Anti-complementation du nombre 'x' (introduit le 20240328154623)... */ \ /* */ \ /* ATTENTION : on notera l'enorme difference avec 'TRMU(...)' qui reference 'INDX(...)' */ \ /* qui lui-meme utilise 'INTE(...)'. Et ainsi, 'TRMU(...)' prend la partie entiere si */ \ /* l'argument est flottant... */ #define SYME(x,a,b) \ COND(IFLE(x,MOYE(a,b)),x,gCOMP(x,a,b)) \ /* Symetrisation de 'x' par rapport au milieu de [a,b] : */ \ /* */ \ /* */ \ /* SYME(x,a,b) ^ */ \ /* | */ \ /* | */ \ /* b +. . . . */ \ /* | .. . */ \ /* | . . . */ \ /* | . . . */ \ /* | . . . */ \ /* | . . . */ \ /* | . . . */ \ /* | . . . */ \ /* | . . . */ \ /* | . ^ */ \ /* | . /.\ */ \ /* | . y=+x / . \ y=-x+(a+b) */ \ /* | . / . \ */ \ /* | . / . \ */ \ /* | . / . \ */ \ /* | . / . \ */ \ /* | . / . \ */ \ /* | ./ . \ */ \ /* a +. . *. . . . . . . . .* */ \ /* | .. . .. */ \ /* | . . . . . */ \ /* | . . . . . */ \ /* |. . . . . */ \ /* ------------------------------O----+--------+--------+---------------> */ \ /* | a a+b b x */ \ /* ----- */ \ /* 2 */ \ /* */ \ /* Ceci fut introduit le 20071024161235 pour 'v $xiii/mono_image$FON Fpolynome_polaire'... */ -define INVE(x) \ -_-_-_- DIVI(FU,x) /* Inversion par rapport a un du nombre 'x', mais ATTENTION : 'FU' et non pas 'UN'... */ -define INVZ(x) \ -_-_-_- DIVZ(UN,x) /* Inversion par rapport a un du nombre 'x' avec test de division par zero... */ -define fINVZ(x) \ -_-_-_- fDIVZ(FU,x) /* Inversion par rapport a un du nombre 'x' avec test de division par zero. Ceci fut */ /* introduit le 20070727103657 par symetrie (tardive...) avec 'fDIVZ(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D ' E X T R A C T I O N D ' E X T R E M A : */ /* */ /*************************************************************************************************************************************/ #define MIN1(a) \ NEUT(a) \ /* Par symetrie avec 'MIN2(...)', 'MIN3(...)',... */ #define gMIN2(a1,b1,a2,b2) \ COND(IFLT(a1,b1),a2,b2) \ /* Recherche generale du minimum des deux nombres 'a' et 'b' (introduit le 20091204130256). */ #define MIN2(a,b) \ COND(IFLT(a,b),a,b) \ /* Recherche du minimum des deux nombres {a,b}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMIN2(...)' et 'fMIN2(...)'. */ #define MIN3(a,b,c) \ MIN2(MIN2(a,b),c) \ /* Recherche du minimum des trois nombres {a,b,c}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMIN3(...)' et 'fMIN3(...)'. */ #define MIN4(a,b,c,d) \ MIN2(MIN3(a,b,c),d) \ /* Recherche du minimum des quatre nombres {a,b,c,d}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMIN4(...)' et 'fMIN4(...)'. */ #define MIN5(a,b,c,d,e) \ MIN2(MIN4(a,b,c,d),e) \ /* Recherche du minimum des cinq nombres {a,b,c,d,e}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMIN5(...)' et 'fMIN5(...)'. Ceci fut */ \ /* introduit le 20111118180131... */ #define MIN6(a,b,c,d,e,f) \ MIN2(MIN5(a,b,c,d,e),f) \ /* Recherche du minimum des six nombres {a,b,c,d,e,f}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMIN6(...)' et 'fMIN6(...)'. Ceci fut */ \ /* introduit le 20111118180131... */ #define MAX1(a) \ NEUT(a) \ /* Par symetrie avec 'MAX2(...)', 'MAX3(...)',... */ #define gMAX2(a1,b1,a2,b2) \ COND(IFGT(a1,b1),a2,b2) \ /* Recherche generale du maximum des deux nombres 'a' et 'b' (introduit le 20091204130256). */ #define MAX2(a,b) \ COND(IFGT(a,b),a,b) \ /* Recherche du maximum des deux nombres {a,b}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMAX2(...)' et 'fMAX2(...)'. */ #define MAX3(a,b,c) \ MAX2(MAX2(a,b),c) \ /* Recherche du maximum des trois nombres {a,b,c}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMAX3(...)' et 'fMAX3(...)'. */ #define MAX4(a,b,c,d) \ MAX2(MAX3(a,b,c),d) \ /* Recherche du maximum des quatre nombres {a,b,c,d}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMAX4(...)' et 'fMAX4(...)'. */ #define MAX5(a,b,c,d,e) \ MAX2(MAX4(a,b,c,d),e) \ /* Recherche du maximum des cinq nombres {a,b,c,d,e}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMAX5(...)' et 'fMAX5(...)'. Ceci fut */ \ /* introduit le 20111118180131... */ #define MAX6(a,b,c,d,e,f) \ MAX2(MAX5(a,b,c,d,e),f) \ /* Recherche du maximum des six nombres {a,b,c,d,e,f}. */ \ /* ATTENTION : on notera dans '$xig/fonct$vv$FON' l'introduction, pour des questions de */ \ /* performance a la compilation, des fonctions 'iMAX6(...)' et 'fMAX6(...)'. Ceci fut */ \ /* introduit le 20111118180131... */ #define MINA2(a,b) \ gMIN2(ABSO(a),ABSO(b),a,b) \ /* Recherche du minimum des deux nombres 'a' et 'b', mais en testant les valeurs absolues */ \ /* des deux nombres (introduit le 20091204125114 pour 'v $xiii/di_album$FON MINA2'). */ #define MAXA2(a,b) \ gMAX2(ABSO(a),ABSO(b),a,b) \ /* Recherche du maximum des deux nombres 'a' et 'b', mais en testant les valeurs absolues */ \ /* des deux nombres (introduit le 20091204125114 pour 'v $xiii/di_album$FON MAXA2'). */ #define MINMAX(x,y) \ MAX2(MIN2(x,COMP(y)),MIN2(COMP(x),y)) \ /* En quelque sorte, le 'ou exclusif' de la logique floue (introduit le 20000724102041 lors */ \ /* de l'introduction de 'v $xrv/MINMAX.11$K'). */ #define gMINMAX(x,y,a,b) \ MAX2(MIN2(x,gCOMP(y,a,b)),MIN2(gCOMP(x,a,b),y)) \ /* Generalisation dans [a,b] de 'MINMAX(x,y)' (ce dernier etant dans [0,1]). */ #define MAXMIN(x,y) \ MIN2(MAX2(x,COMP(y)),MAX2(COMP(x),y)) \ /* Introduit le 20061023091349 par "symetrie" avec 'MINMAX(...)'... */ #define gMAXMIN(x,y,a,b) \ MIN2(MAX2(x,gCOMP(y,a,b)),MAX2(gCOMP(x,a,b),y)) \ /* Generalisation dans [a,b] de 'MAXMIN(x,y)' (ce dernier etant dans [0,1]) (introduit le */ \ /* 20061023091349). */ #define IMINMAX(x,y) \ MAX2(MIN2(x,INVZ(y)),MIN2(INVZ(x),y)) \ /* Par symetrie avec 'MINMAX(...)' en passant de l'addition a la multiplication (introduit */ \ /* le 20080102130008) et dite "Inverse" de 'MINMAX(...)' (par abus de langage...). */ #define IMAXMIN(x,y) \ MIN2(MAX2(x,INVZ(y)),MAX2(INVZ(x),y)) \ /* Par symetrie avec 'MAXMIN(...)' en passant de l'addition a la multiplication (introduit */ \ /* le 20080102130008) et dite "Inverse" de 'MAXMIN(...)' (par abus de langage...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S A R I T H M E T I Q U E S D I V E R S E S : */ /* */ /*************************************************************************************************************************************/ -define DIVn(x,n) \ -_-_-_- DIVI(x,n) /* Division du nombre 'x' par le nombre 'n' (suppose entier...). ATTENTION, le passage par */ /* la definition intermediaire 'DIVn(...)' en '$PASSE_1' est liee au fait que la definition */ /* 'FRAn(...)' est conditionnelle alors qu'elle appartient a '$PASSE_D'. */ /* */ /* Le 20050821155430, la definition precedente est passee de '$PASSE_1' a '$PASSE_D' ' */ /* a cause de 'v $xrs/Mobius2D.11$I MOIT'... */ #if ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) # undef DIVn # define DIVn(x,n) \ bMUL(bMUL(SIGN(x),SIGN(n)) \ ,DIVI(ABSO(x),ABSO(n)) \ ) \ /* Division du nombre 'x' par le nombre 'n' (suppose entier...). ATTENTION, le passage par */ \ /* la definition intermediaire 'DIVn(...)' en '$PASSE_1' est liee au fait que la definition */ \ /* 'FRAn(...)' est conditionnelle alors qu'elle appartient a '$PASSE_D'. */ \ /* */ \ /* ATTENTION, pendant quelque temps, il y a eu : */ \ /* */ \ /* # define DIVn(x,n) \ */ \ /* DIVI(x,FLOT(n)) */ \ /* */ \ /* mais cette solution a un inconvenient majeur ; en effet, si la primitive 'DIVn(...)' */ \ /* apparait dans la definition d'une constante entiere, elle-meme utilisee comme argument */ \ /* entier lors de l'appel d'une fonction, cet argument entier prend le type 'Float' a */ \ /* cause du 'FLOT(...)' de la definition de 'DIVn(...)'. A l'entree de la fonction, */ \ /* l'argument entier correspondant a donc une valeur enorme et fausse... Ce cas s'est */ \ /* en particulier rencontre avec les definitions 'MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_FONCTION' */ \ /* et 'MOITIE_DU_NOMBRE_DE_POINTS_DE_LA_TRANSFORMEE' de 'v $ximt/fourier$FON'. La nouvelle */ \ /* solution consiste donc a ajouter a 'n' une variable entiere toujours nulle ; le type */ \ /* entier de cette derniere permet d'utiliser 'DIVn(...)' avec des arguments de tout type */ \ /* ('Int' et/ou 'Float'). */ \ /* */ \ /* Puis j'ai tente : */ \ /* */ \ /* # define DIVn(x,n) \ */ \ /* DIVI(x,ADD2(n,pour_faire_correctement_...)) */ \ /* */ \ /* ou 'pour_faire_correctement_...' etait un 'Int' implantee dans '$xig/common$STR'. Cela */ \ /* ne pouvait pas fonctionner car, en effet, certaines constantes calculees a l'aide de */ \ /* 'DIVn(...)' servent a initialiser des variables globales (par exemple 'Zmin' dans */ \ /* '$xiii/Images$STR'), or on ne peut utiliser pour cela que des constantes "pures" et */ \ /* donc initialisables des le chargement du programme, ce qui n'est pas possible ici... */ \ /* */ \ /* On notera actuellement l'ecriture : */ \ /* */ \ /* # define DIVn(x,n) \ */ \ /* MUL2(MUL2(SIGN(x),SIGN(n)),DIVI(ABSO(x),ABSO(n))) */ \ /* */ \ /* et non pas : */ \ /* */ \ /* # define DIVn(x,n) \ */ \ /* MEME_SIGNE_QUE(MUL2(x,n),DIVI(ABSO(x),ABSO(n))) */ \ /* */ \ /* afin d'alleger le travail du compilateur... */ \ /* */ \ /* Le 20101120091431, 'bMUL(...)' a remplace 'MUL2(...)'. */ #Aif ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) #Eif ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) -define FRAn(x,n) \ -_-_-_- DIVn(x,n) /* Division du nombre 'x' par le nombre 'n' (suppose entier...). ATTENTION, le passage par */ /* la definition intermediaire 'DIVn(...)' en '$PASSE_1' est liee au fait que la definition */ /* 'FRAn(...)' est conditionnelle alors qu'elle appartient a '$PASSE_D'. */ -define fFRAn(x,n) \ -_-_-_- DIVI(x,FLOT(n)) /* Division du nombre 'x' par le nombre 'n' (suppose flottant). */ #define MOYG(a,b) \ RACX(MUL2(a,b)) \ /* Moyenne Geometrique des deux nombres 'a' et 'b'. Elle est definie par : */ \ /* */ \ /* a x */ \ /* --- = --- */ \ /* x b */ \ /* */ \ /* soit : */ \ /* */ \ /* 2 */ \ /* x = a.b */ \ /* */ \ /* avec donc un probleme si le produit 'a.b' est negatif, d'ou 'MOYZ(...)' ci-apres... */ #define MOYZ(a,b) \ MOYG(ABSO(a),ABSO(b)) \ /* Moyenne geometrique des deux nombres 'a' et 'b' en tenant compte des signes respectifs. */ \ /* */ \ /* Jusqu'au 20061023132307, la definition precedente etait : */ \ /* */ \ /* #define MOYZ(a,b) \ */ \ /* COND(IZGE(MUL2(a,b)),MOYG(a,b),FZERO) */ \ /* */ \ /* Mais, pour des raisons de "continuite", il est preferable de systematiquement renvoyer */ \ /* quelque chose (plutot que 'FZERO'), d'ou les 'ABSO(...)'s... */ #define MOYZSI(a,b) \ MEME_SIGNE_QUE(bMUL(a,b),MOYZ(a,b)) \ /* Moyenne geometrique "signee" des deux nombres 'a' et 'b' en tenant compte des signes */ \ /* respectifs. Meme si cela a peu de sens mathematiquement parlant, cela fut introduit le */ \ /* 20061025131829... */ \ /* */ \ /* Le 20101120092003, 'bMUL(...)' a remplace 'MUL2(...)'. */ #define MOYH(a,b) \ DIVZ(DOUB(MUL2(a,b)),ADD2(a,b)) \ /* Moyenne Harmonique des deux nombres 'a' et 'b'. Elle est definie par : */ \ /* */ \ /* a x - a */ \ /* --- = ------- */ \ /* b b - x */ \ /* */ \ /* soit : */ \ /* */ \ /* 2.a.b */ \ /* x = ------- */ \ /* a + b */ \ /* */ \ /* ou encore : */ \ /* */ \ /* 2 */ \ /* x = ----------- */ \ /* 1 1 */ \ /* --- + --- */ \ /* a b */ \ /* */ \ /* */ \ /* ou encore (ce qui est l'inverse de la moyenne des inverses...) : */ \ /* */ \ /* 1 */ \ /* x = ------------- */ \ /* 1 1 */ \ /* --- + --- */ \ /* a b */ \ /* ----------- */ \ /* 2 */ \ /* */ \ /* ce qui (je le note le 20090401100200) permet de calculer la vitesse moyenne V (=x) de */ \ /* deux trajets successifs dont les vitesses moyennes respectives V1 (=a) et V2 (=b) sont */ \ /* connues... */ \ /* */ \ /* */ \ /* Le 20180823094512, 'DIVI(...)' a ete remplace par 'DIVZ(...)' qui est plus logique */ \ /* suite a l'introduction de 'v $xig/fonct$vv$DEF ponderation_de_MOYH'... */ #define MOYQ(a,b) \ RACX(MOYE(EXP2(a),EXP2(b))) \ /* Moyenne Quadratique des deux nombres 'a' et 'b'. Elle est definie par : */ \ /* */ \ /* 2 2 */ \ /* 2 a + b */ \ /* x = --------- */ \ /* 2 */ \ /* */ #define MOYQSI(a,b) \ MEME_SIGNE_QUE(bMUL(a,b),MOYQ(a,b)) \ /* Moyenne Quadratique "signee" des deux nombres 'a' et 'b' en tenant compte des signes */ \ /* respectifs. Meme si cela a peu de sens mathematiquement parlant, cela fut introduit le */ \ /* 20061025131829... */ \ /* */ \ /* Le 20101120092003, 'bMUL(...)' a remplace 'MUL2(...)'. */ #define MOYE(a,b) \ FRAn(ADD2(a,b),CONSTANTE_DE_MOYENNE) \ /* Moyenne arithmetique des deux nombres 'a' et 'b'. On notera que 'MOYE(a,b)' n'est pas */ \ /* definie par : */ \ /* */ \ /* FRA2(ADD2(a,b)) */ \ /* */ \ /* pour des raisons de symetrie avec 'MOYD(a,b)' et 'MOYX(a,b)'. Elle est definie par : */ \ /* */ \ /* x-a = b-x */ \ /* */ \ /* soit : */ \ /* */ \ /* a + b */ \ /* x = ------- */ \ /* 2 */ \ /* */ #define MOYS(a,b) \ FRAn(SOUS(a,b),CONSTANTE_DE_MOYENNE) \ /* Sorte d'anti-moyenne "soustractive" de deux nombres 'a' et 'b' (cela fut introduit le */ \ /* 20230123112942...), soit : */ \ /* */ \ /* a - b */ \ /* x = ------- */ \ /* 2 */ \ /* */ #define AMOY(m,a) \ AXPB(CONSTANTE_DE_MOYENNE,m,NEGA(a)) \ /* Anti-MOYenne arithmetique donnant 'b' connaissant 'm' (la moyenne) et 'a' : */ \ /* */ \ /* a + b */ \ /* m = ------- */ \ /* 2 */ \ /* */ \ /* d'ou : */ \ /* */ \ /* b=2.m-a */ \ /* */ \ /* Ceci fut introduit le 20160726092210 (pour 'v $xrv/ReflexionTriangle.01$K AMOY' et */ \ /* pour 'v $xrv/ReflexionTetraedre.01$K AMOY'). */ #define NOYE(a,b) \ FRAn(SOUS(a,b),CONSTANTE_DE_MOYENNE) \ /* Moyenne arithmetique "Negative" des deux nombres 'a' et 'b'. Ceci fut introduit le */ \ /* 20071012102307 pour pouvoir eventuellement formuler de facon symetrique le probleme */ \ /* suivant lie a l'ondelette de Haar. Soient deux nombres {a,b} ; leur Somme et leur */ \ /* Difference sont : */ \ /* */ \ /* S = a + b */ \ /* D = a - b */ \ /* */ \ /* A partir de {S,D}, il est possible de reconstituer {a,b} suivant : */ \ /* */ \ /* S + D */ \ /* a = ------- = MOYE(S,D) */ \ /* 2 */ \ /* */ \ /* S - D */ \ /* b = ------- = NOYE(S,D) */ \ /* 2 */ \ /* */ \ /* d'ou la necessite de 'NOYE(...)' a cote de 'MOYE(...)'. */ \ /* */ \ /* Au passage, on notera que l'ondelette de Haar consiste, pour un vecteur de N nombres */ \ /* {A(j)}, a memoriser les N/2 differences [A(2i+1)-A(2i)] et a generer un nouveau vecteur */ \ /* contenant les N/2 sommes {[A(2i+1)+A(2i)]} (en supposant evidemment que le cardinal N */ \ /* du vecteur initial est une puissance de 2 et que l'indexation se fait a partir de 0), */ \ /* puis en iterant recursivement ce processus sur ce vecteur des N/2 sommes... */ #define MOYD(a,b) \ QUOD(ADD2(a,b),CONSTANTE_DE_MOYENNE) \ /* Moyenne arithmetique par Defaut des deux nombres {a,b}. */ #define MOYX(a,b) \ QUOE(ADD2(a,b),CONSTANTE_DE_MOYENNE) \ /* Moyenne arithmetique par eXces des deux nombres {a,b}. */ #define MOY3(a,b,c) \ FRA3(ADD3(a,b,c)) \ /* Moyenne arithmetique des trois nombres {a,b,c}. */ #define MOY4(a,b,c,d) \ FRA4(ADD4(a,b,c,d)) \ /* Moyenne arithmetique des quatre nombres {a,b,c,d}. */ #define MOY5(a,b,c,d,e) \ FRA5(ADD5(a,b,c,d,e)) \ /* Moyenne arithmetique des cinq nombres {a,b,c,d,e}. */ #define MOY6(a,b,c,d,e,f) \ FRA6(ADD6(a,b,c,d,e,f)) \ /* Moyenne arithmetique des six nombres {a,b,c,d,e,f}. */ #define MOY7(a,b,c,d,e,f,g) \ FRA7(ADD7(a,b,c,d,e,f,g)) \ /* Moyenne arithmetique des sept nombres {a,b,c,d,e,f,g}. */ #define MOY8(a,b,c,d,e,f,g,h) \ FRA8(ADD8(a,b,c,d,e,f,g,h)) \ /* Moyenne arithmetique des huit nombres {a,b,c,d,e,f,g,h}. */ #define SOYE(a,b) \ FRAn(SOUS(a,b),CONSTANTE_DE_MOYENNE) \ /* "Symetrique" de 'MOYE(a,b)' utilisant la soustraction (introduit le 20030324111828 */ \ /* pour 'v $ximt/ondelettes$FON 20030324115446'). */ #define INTM(a,b) \ MOYE(a,b) \ /* Interpolation "Mediane" entre deux nombres 'a' et 'b'. */ #define EXTG(a,b) \ SOUS(DOUB(a),b) \ /* Extrapolation a "Gauche" de {a,b} dans cet ordre. */ #define EXTD(a,b) \ SOUS(DOUB(b),a) \ /* Extrapolation a "Droite" de {a,b} dans cet ordre. */ #define PAR0(x) \ ETLO(x,COMK(BIT)) \ /* Plus proche nombre pair (0) par defaut du nombre 'x'. */ #define PAR1(x) \ OUIN(x,BIT) \ /* Plus proche nombre impair (1) par exces du nombre 'x'. */ #define MEME_PARITE(a,b) \ IFEQ(REST(a,DEUX),REST(b,DEUX)) \ /* Indique si les deux nombres 'a' et 'b' ont la meme parite... */ #define CHOI(x,y) \ SE12(x,y) \ /* Selectionne l'un des deux nombres 'x' ou 'y' ; en fait, cette macro est */ \ /* introduite pour ne pas privilegier l'un des deux en apparence. En general */ \ /* elle est appelee alors que les deux elements 'x' et 'y' sont egaux. */ #define CHOY(x,y,z) \ SE13(x,y,z) \ /* Selectionne l'un des trois nombres 'x' ou 'y' ou 'z' ; en fait, cette macro est */ \ /* introduite pour ne pas privilegier l'un des trois en apparence. En general */ \ /* elle est appelee alors que les trois elements 'x', 'y' et 'z' sont egaux. */ #define CHOZ(x,y,z,t) \ SE14(x,y,z,t) \ /* Selectionne l'un des quatre nombres 'x' ou 'y' ou 'z' ou 't' ; en fait, cette macro est */ \ /* introduite pour ne pas privilegier l'un des quatre en apparence. En general */ \ /* elle est appelee alors que les quatre elements 'x', 'y', 'z' et 't' sont egaux. */ \ /* Cette definition a ete introduite pour 'v $xrv/PointsVoisins_3D.01$K CHOZ' le */ \ /* 20150810101052... */ #define FRACTION(nombre_rationnel,denominateur) \ INTE(bMUL(nombre_rationnel,denominateur)) \ /* Conversion d'un nombre flottant suppose rationnel en une fraction (de nombres entiers...) */ \ /* dont on se fixe a priori le denominateur... */ \ /* */ \ /* Le 20101120092003, 'bMUL(...)' a remplace 'MUL2(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O R M E S L I N E A I R E S : */ /* */ /*************************************************************************************************************************************/ -define DIS2(x,a,b) \ -_-_-_- MUL2(x,ADD2(a,b)) /* Distributivite de la multiplication sur l'addition a 2 termes. */ /* */ /* ATTENTION : On consultera avec profit les commentaires de 'v $xil/re_definit$DEF', la */ /* definition de 'DIS2(x,a,b)' pouvant, par exemple, se reformuler : */ /* */ /* #redefine DIS2(x,a,b) \ */ /* ADD2(MUL2(x,a) \ */ /* ,MUL2(x,b) \ */ /* ) */ /* */ -define DIS3(x,a,b,c) \ -_-_-_- MUL2(x,ADD3(a,b,c)) /* Distributivite de la multiplication sur l'addition a 3 termes. */ /* */ /* ATTENTION : On consultera avec profit les commentaires de 'v $xil/re_definit$DEF', la */ /* definition de 'DIS3(x,a,b,c)' pouvant, par exemple, se reformuler : */ /* */ /* #redefine DIS3(x,a,b,c) \ */ /* ADD3(MUL2(x,a) \ */ /* ,MUL2(x,b) \ */ /* ,MUL2(x,c) \ */ /* ) */ /* */ -define DIS4(x,a,b,c,d) \ -_-_-_- MUL2(x,ADD4(a,b,c,d)) /* Distributivite de la multiplication sur l'addition a 4 termes. */ /* */ /* ATTENTION : On consultera avec profit les commentaires de 'v $xil/re_definit$DEF', la */ /* definition de 'DIS4(x,a,b,c,d)' pouvant, par exemple, se reformuler : */ /* */ /* #redefine DIS4(x,a,b,c,d) \ */ /* ADD4(MUL2(x,a) \ */ /* ,MUL2(x,b) \ */ /* ,MUL2(x,c) \ */ /* ,MUL2(x,d) \ */ /* ) */ /* */ -define DIS5(x,a,b,c,d,e) \ -_-_-_- MUL2(x,ADD5(a,b,c,d,e)) /* Distributivite de la multiplication sur l'addition a 5 termes. */ /* */ /* ATTENTION : On consultera avec profit les commentaires de 'v $xil/re_definit$DEF', la */ /* definition de 'DIS5(x,a,b,c,d,e)' pouvant, par exemple, se reformuler : */ /* */ /* #redefine DIS5(x,a,b,c,d,e) \ */ /* ADD5(MUL2(x,a) \ */ /* ,MUL2(x,b) \ */ /* ,MUL2(x,c) \ */ /* ,MUL2(x,d) \ */ /* ,MUL2(x,e) \ */ /* ) */ /* */ -define DIT2(x,a,b,c,d) \ -_-_-_- MUL3(x,ADD2(a,b),ADD2(c,d)) /* Generalisation de 'DIS2(...)' destinee a 'BAR4(...)' introduite le 20060207101914. En */ /* apres la nouvelle definition de 'BAR4(...)' le 20060207121926, 'DIT2(...)' est devenue */ /* inutile, mais je la garde car on ne sait jamais... */ -define AXPB(a,x,b) \ -_-_-_- ADD2(MUL2(a,x),b) /* Calcul de la formule : */ /* */ /* a.x + b */ /* */ -define XPBA(a,x,b) \ -_-_-_- MUL2(ADD2(x,b),a) /* Calcul de la formule : */ /* */ /* a.(x + b) */ /* */ /* On notera le 20070910144615 que j'ai essaye : */ /* */ /* -define GenereOperateur_____LINn(LINn,LINn_1,Liste_n_1,Liste_n) \ */ /* -define LINn(Liste_n_1,Liste_n,b) \ */ /* -_-_-_- LINn_1(Liste_n_1,LIN1(Liste_n,b)) */ /* */ /* -_-_-_- GenereOperateur_____LINn(LIN2,LIN1,a0/-/x0,a1/-/x1) */ /* -_-_-_- GenereOperateur_____LINn(LIN3,LIN2,a0/-/x0/-/a1/-/x1,a2/-/x2) */ /* (...) */ /* */ /* sur le modele de 'v $ximd/operator.1$FON GenereOperateur_____HORNER_NN'. Malheureusement, */ /* c'est ici beaucoup trop complique au niveau de 'v $xcc/cpp$Z 20070910144831' a cause du */ /* 'GooF' et de la derivation formelle... */ /* */ /* Le 20070911100016, j'ai essaye : */ /* */ /* -_-_-_- define(Nom_____LINn,LIN) */ /* -_-_-_- define(GenereOperateur_____LINn, */ /* -_-_-_- `-define Nom_____LINn`'`'$1($3,$4,b) \ */ /* -_-_-_- Nom_____LINn`'`'$2($3 \ */ /* -_-_-_- ,Nom_____LINn`'`'1($4,b) \ */ /* -_-_-_- )' */ /* -_-_-_- ) */ /* */ /* -_-_-_- GenereOperateur_____LINn(2,1,`a0,x0',`a1,x1') */ /* -_-_-_- GenereOperateur_____LINn(3,2,`a0,x0,a1,x1',`a2,x2') */ /* -_-_-_- GenereOperateur_____LINn(4,3,`a0,x0,a1,x1,a2,x2',`a3,x3') */ /* (...) */ /* */ /* qui est interprete par des sequences : */ /* */ /* | $M4 $Parametres_M4 $xccp/GarOrdre$vv$m4 - */ /* | $SE -e "s/^ *\($PASSE_D\)/\1/" */ /* -e 's/^ *$//' */ /* */ /* bien placees dans 'v $xcc/cpp$Z', par exemple en fin de la "PASSE D1". Mais, */ /* malheureusement, cela cree de graves problemes a cause des arguments {$1,$2,$3,$4} */ /* de 'GenereOperateur_____LINn(...)' car, en effet, les "$"s sont transformes en "_" a */ /* cause de 'v $xcc/cpp$Z .xcp.underscore.X'... */ _____define(GenOperator_PASSE_D_____LINn,++D++-define $1($3,$4,b) \ -_-_-_- $2($3,LIN1($4,b))++F++ ) /* Generateur des 'LIN?(....)'s introduit le 20070912125718... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....LINn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'LIN?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'LIN?' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (nombre variables d'elements), */ /* $4 : deuxieme liste d'arguments (toujours deux elements). */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE.D.....LINn') */ /* donne a priori a 'GenOperator.PASSE.D.....LINn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....LINn' la bonne definition... */ /* */ /* Le 20070913153802 le nom 'GenOperator_____LINn(...)' fut change en */ /* 'GenOperator_P_D_____LINn(...)' afin de contenir la passe '$PASSE_D' de generation, */ /* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */ /* */ /* Le 20071003152838 le nom 'GenOperator_P_D_____LINn(...)' a ete change en */ /* 'GenOperator.PASSE.D.....LINn(...)' pour une meilleure lisibilite... */ -define LIN1(a0,x0,b) \ -_-_-_- AXPB(a0,x0,b) GenOperator_PASSE_D_____LINn(LIN2 ,LIN1 ,++D++a0,x0++F++,++D++a1,x1++F++) GenOperator_PASSE_D_____LINn(LIN3 ,LIN2 ,++D++a0,x0,a1,x1++F++,++D++a2,x2++F++) GenOperator_PASSE_D_____LINn(LIN4 ,LIN3 ,++D++a0,x0,a1,x1,a2,x2++F++,++D++a3,x3++F++) GenOperator_PASSE_D_____LINn(LIN5 ,LIN4 ,++D++a0,x0,a1,x1,a2,x2,a3,x3++F++,++D++a4,x4++F++) GenOperator_PASSE_D_____LINn(LIN6 ,LIN5 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4++F++,++D++a5,x5++F++) GenOperator_PASSE_D_____LINn(LIN7 ,LIN6 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5++F++,++D++a6,x6++F++) GenOperator_PASSE_D_____LINn(LIN8 ,LIN7 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6++F++,++D++a7,x7++F++) GenOperator_PASSE_D_____LINn(LIN9 ,LIN8 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7++F++,++D++a8,x8++F++) GenOperator_PASSE_D_____LINn(LIN10,LIN9 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8++F++,++D++a9,x9++F++) GenOperator_PASSE_D_____LINn(LIN11,LIN10,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9++F++,++D++aA,xA++F++) GenOperator_PASSE_D_____LINn(LIN12,LIN11,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA++F++,++D++aB,xB++F++) GenOperator_PASSE_D_____LINn(LIN13 ,LIN12 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB ++F++ ,++D++aC,xC++F++ ) GenOperator_PASSE_D_____LINn(LIN14 ,LIN13 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC ++F++ ,++D++aD,xD++F++ ) GenOperator_PASSE_D_____LINn(LIN15 ,LIN14 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD ++F++ ,++D++aE,xE++F++ ) GenOperator_PASSE_D_____LINn(LIN16 ,LIN15 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE ++F++ ,++D++aF,xF++F++ ) GenOperator_PASSE_D_____LINn(LIN17 ,LIN16 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF ++F++ ,++D++aG,xG++F++ ) GenOperator_PASSE_D_____LINn(LIN18 ,LIN17 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG ++F++ ,++D++aH,xH++F++ ) GenOperator_PASSE_D_____LINn(LIN19 ,LIN18 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH ++F++ ,++D++aI,xI++F++ ) GenOperator_PASSE_D_____LINn(LIN20 ,LIN19 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI ++F++ ,++D++aJ,xJ++F++ ) GenOperator_PASSE_D_____LINn(LIN21 ,LIN20 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ++F++ ,++D++aK,xK++F++ ) GenOperator_PASSE_D_____LINn(LIN22 ,LIN21 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK ++F++ ,++D++aL,xL++F++ ) GenOperator_PASSE_D_____LINn(LIN23 ,LIN22 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL ++F++ ,++D++aM,xM++F++ ) GenOperator_PASSE_D_____LINn(LIN24 ,LIN23 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM ++F++ ,++D++aN,xN++F++ ) GenOperator_PASSE_D_____LINn(LIN25 ,LIN24 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN ++F++ ,++D++aO,xO++F++ ) GenOperator_PASSE_D_____LINn(LIN26 ,LIN25 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN,aO,xO ++F++ ,++D++aP,xP++F++ ) GenOperator_PASSE_D_____LINn(LIN27 ,LIN26 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN,aO,xO,aP,xP ++F++ ,++D++aQ,xQ++F++ ) /* Calcul des formes lineaires N-dimensionnelles 'LIN?(....)' : */ /* */ /* Sigma(A .X ) + B */ /* i i */ /* */ /* On notera que les calculs sont systematiques contrairement a 'LIO?(....)' ou les calculs */ /* ne sont effectues que pour les 'A(i)' non nuls... */ /* */ /* Le 20080102130008, furent introduites 'LIN14(...)' et 'LIN15(...)'. */ /* */ /* Le 20080104152848, fut introduite 'LIN16(...)'. */ /* */ /* Le 20080325155353, fut introduite 'LIN17(...)'. */ /* */ /* Le 20201004173108, furent introduites 'LIN18(...)' a 'LIN27(...)'. */ _____define(GenOperator_PASSE_D_____LIZn,++D++-define $1($3) \ -_-_-_- $2($3,ZERO)++F++ ) /* Generateur des 'LIZ?(....)'s introduit le 20200323165808 pour simplifier les */ /* 'LIN?(...,[F]ZERO)', d'ou le nom 'LIZ?' pour "Zero"... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....LIZn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'LIZ?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'LIN?' a utiliser (de rang 'n'), */ /* $3 : liste d'arguments. */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator_PASSE_D.....LIZn') */ /* donne a priori a 'GenOperator_PASSE_D.....LIZn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....LIZn' la bonne definition... */ GenOperator_PASSE_D_____LIZn(LIZ1 ,LIN1 ,++D++a0,x0++F++) GenOperator_PASSE_D_____LIZn(LIZ2 ,LIN2 ,++D++a0,x0,a1,x1++F++) GenOperator_PASSE_D_____LIZn(LIZ3 ,LIN3 ,++D++a0,x0,a1,x1,a2,x2++F++) GenOperator_PASSE_D_____LIZn(LIZ4 ,LIN4 ,++D++a0,x0,a1,x1,a2,x2,a3,x3++F++) GenOperator_PASSE_D_____LIZn(LIZ5 ,LIN5 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4++F++) GenOperator_PASSE_D_____LIZn(LIZ6 ,LIN6 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5++F++) GenOperator_PASSE_D_____LIZn(LIZ7 ,LIN7 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6++F++) GenOperator_PASSE_D_____LIZn(LIZ8 ,LIN8 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7++F++) GenOperator_PASSE_D_____LIZn(LIZ9 ,LIN9 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8++F++) GenOperator_PASSE_D_____LIZn(LIZ10,LIN10,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9++F++) GenOperator_PASSE_D_____LIZn(LIZ11,LIN11,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA++F++) GenOperator_PASSE_D_____LIZn(LIZ12,LIN12,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB++F++) GenOperator_PASSE_D_____LIZn(LIZ13 ,LIN13 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC++F++ ) GenOperator_PASSE_D_____LIZn(LIZ14 ,LIN14 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD++F++ ) GenOperator_PASSE_D_____LIZn(LIZ15 ,LIN15 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE++F++ ) GenOperator_PASSE_D_____LIZn(LIZ16 ,LIN16 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF++F++ ) /* Calcul des formes lineaires N-dimensionnelles 'LIZ?(....)' : */ /* */ /* Sigma(A .X ) */ /* i i */ /* */ /* Cela fut introduit le 20200323165808 pour simplifier les 'LIN?(...,[F]ZERO)'... */ -define oAXPB(a,x,b) \ -_-_-_- COND(IZNE(a),AXPB(a,x,b),b) /* Calcul optimise de la formule : */ /* */ /* a.x + b si : x # 0 */ /* b si : x = 0 */ /* */ /* Cela peut etre d'une grande utilite dans le cas ou, par exemple, l'argument 'x' designe */ /* en fait une fonction. Ceci a ete introduit le 20041118134103... */ _____define(GenOperator_PASSE_D_____LIOn,++D++-define $1($3,$4,b) \ -_-_-_- ADD2($2($3,ZERO),LIO1($4,b))++F++ ) /* Generateur des 'LIO?(....)'s introduit le 20070912125718... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....LIOn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'LIO?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'LIO?' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (nombre variables d'elements), */ /* $4 : deuxieme liste d'arguments (toujours deux elements). */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE.D.....LIOn') */ /* donne a priori a 'GenOperator.PASSE.D.....LIOn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....LIOn' la bonne definition... */ /* */ /* Le 20070913153802 le nom 'GenOperator_____LIOn(...)' fut change en */ /* 'GenOperator_P_D_____LIOn(...)' afin de contenir la passe '$PASSE_D' de generation, */ /* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */ /* */ /* Le 20071003152838 le nom 'GenOperator_P_D_____LIOn(...)' a ete change en */ /* 'GenOperator.PASSE.D.....LIOn(...)' pour une meilleure lisibilite... */ /* */ /* Jusqu'au 20080111142631, la definition precedente etait plus elegante (parce n'utilisant */ /* que des operateurs 'LIO?(...)'s) et definie par : */ /* */ /* _____define(GenOperator.PASSE.D.....LIOn \ */ /* ,++D++-define $1($3,$4,b) */ /* -_-_-_- $2($3,LIO1($4,b))++F++ */ /* ) */ /* */ /* mais, les formules generees explosaient litteralement (en particulier 'LIO16(...)'). */ /* Cette nouvelle version croit lineairement en complexite). On notera que cette nouvelle */ /* definition utilise la constante 'ZERO' (on ne fait pas d'hypotheses sur les utilisations */ /* des procedures 'LIO?(...)' et donc cela exclut l'usage de 'FZERO'...). */ -define LIO1(a0,x0,b) \ -_-_-_- oAXPB(a0,x0,b) GenOperator_PASSE_D_____LIOn(LIO2 ,LIO1 ,++D++a0,x0++F++ ,++D++a1,x1++F++ ) GenOperator_PASSE_D_____LIOn(LIO3 ,LIO2 ,++D++a0,x0,a1,x1++F++ ,++D++a2,x2++F++ ) GenOperator_PASSE_D_____LIOn(LIO4 ,LIO3 ,++D++a0,x0,a1,x1,a2,x2++F++ ,++D++a3,x3++F++ ) GenOperator_PASSE_D_____LIOn(LIO5 ,LIO4 ,++D++a0,x0,a1,x1,a2,x2,a3,x3++F++ ,++D++a4,x4++F++ ) GenOperator_PASSE_D_____LIOn(LIO6 ,LIO5 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4++F++ ,++D++a5,x5++F++ ) GenOperator_PASSE_D_____LIOn(LIO7 ,LIO6 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5++F++ ,++D++a6,x6++F++ ) GenOperator_PASSE_D_____LIOn(LIO8 ,LIO7 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6++F++ ,++D++a7,x7++F++ ) GenOperator_PASSE_D_____LIOn(LIO9 ,LIO8 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7++F++ ,++D++a8,x8++F++ ) GenOperator_PASSE_D_____LIOn(LIO10 ,LIO9 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8++F++ ,++D++a9,x9++F++ ) GenOperator_PASSE_D_____LIOn(LIO11 ,LIO10 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ++F++ ,++D++aA,xA++F++ ) GenOperator_PASSE_D_____LIOn(LIO12 ,LIO11 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA ++F++ ,++D++aB,xB++F++ ) GenOperator_PASSE_D_____LIOn(LIO13 ,LIO12 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB ++F++ ,++D++aC,xC++F++ ) GenOperator_PASSE_D_____LIOn(LIO14 ,LIO13 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC ++F++ ,++D++aD,xD++F++ ) GenOperator_PASSE_D_____LIOn(LIO15 ,LIO14 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD ++F++ ,++D++aE,xE++F++ ) GenOperator_PASSE_D_____LIOn(LIO16 ,LIO15 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE ++F++ ,++D++aF,xF++F++ ) GenOperator_PASSE_D_____LIOn(LIO17 ,LIO16 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF ++F++ ,++D++aG,xG++F++ ) GenOperator_PASSE_D_____LIOn(LIO18 ,LIO17 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG ++F++ ,++D++aH,xH++F++ ) GenOperator_PASSE_D_____LIOn(LIO19 ,LIO18 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH ++F++ ,++D++aI,xI++F++ ) GenOperator_PASSE_D_____LIOn(LIO20 ,LIO19 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI ++F++ ,++D++aJ,xJ++F++ ) GenOperator_PASSE_D_____LIOn(LIO21 ,LIO20 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ++F++ ,++D++aK,xK++F++ ) GenOperator_PASSE_D_____LIOn(LIO22 ,LIO21 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK ++F++ ,++D++aL,xL++F++ ) GenOperator_PASSE_D_____LIOn(LIO23 ,LIO22 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL ++F++ ,++D++aM,xM++F++ ) GenOperator_PASSE_D_____LIOn(LIO24 ,LIO23 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM ++F++ ,++D++aN,xN++F++ ) GenOperator_PASSE_D_____LIOn(LIO25 ,LIO24 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN ++F++ ,++D++aO,xO++F++ ) GenOperator_PASSE_D_____LIOn(LIO26 ,LIO25 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN,aO,xO ++F++ ,++D++aP,xP++F++ ) GenOperator_PASSE_D_____LIOn(LIO27 ,LIO26 ,++D++ a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9 ,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,aF,xF,aG,xG,aH,xH,aI,xI,aJ,xJ ,aK,xK,aL,xL,aM,xM,aN,xN,aO,xO,aP,xP ++F++ ,++D++aQ,xQ++F++ ) /* Calcul optimise des formes lineaires N-dimensionnelles 'LIO?(....)' : */ /* */ /* Sigma(A .X ) + B */ /* i i */ /* */ /* en ne calculant les produits que pour les A(i) non nuls contrairement a 'LIN?(....)' */ /* qui calcule tout systematiquement. */ /* */ /* Le 20080102130008, furent introduites 'LIO14(...)' et 'LIO15(...)'. */ /* */ /* Le 20080104152848, fut introduite 'LIO16(...)'. */ /* */ /* Le 20080325155353, fut introduite 'LIO17(...)'. */ /* */ /* Le 20180821092424, furent introduites 'LIO18(...)' et 'LIO19(...)'. On notera leur mise */ /* en page inhabituelle (ainsi que pour 'LIO16(...)' et 'LIO17(...)') qui est destinee a */ /* eviter le message d'erreur : */ /* */ /* Error : (...): illegal macro name */ /* */ /* en '$PASSE_A'... */ /* */ /* Le 20180823181138 pour la commande 'vG' ('v $Falias_vG GenOperator_'), j'ai ramene le */ /* nom de l'operateur (ici 'LIO??') sur la meme ligne que 'GenOperator_PASSE_D_____LIOn'... */ /* */ /* Le 20181009165920, fut introduite 'LIO20(...)'. */ /* */ /* Le 20181203155403, fut introduite 'LIO21(...)'. */ /* */ /* Le 20201004104407, furent introduites 'LIO22(...)' a 'LIO27(...)'. */ _____define(GenOperator_PASSE_D_____LIRn,++D++-define $1($3) \ -_-_-_- DIVZ($2($3),$4($5))++F++ ) /* Generateur des 'LIR?(....)'s introduit le 20070914094954... */ /* */ /* Sigma(A .X ) + b */ /* i i */ /* ------------------ */ /* Sigma(A ) + b */ /* i */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....LIRn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'LIR?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'LIR?' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (nombre variables d'elements), */ /* $4 : deuxieme liste d'arguments (toujours deux elements). */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE.D.....LIRn') */ /* donne a priori a 'GenOperator.PASSE.D.....LIRn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....LIRn' la bonne definition... */ /* */ /* Le 20070913153802 le nom 'GenOperator_____LIRn(...)' fut change en */ /* 'GenOperator_P_D_____LIRn(...)' afin de contenir la passe '$PASSE_D' de generation, */ /* ce qui est utile dans 'v $xi/DICO$D/GenOperator$vv$sub GenOperator_P_._____'. */ /* */ /* Le 20071003152838 le nom 'GenOperator_P_D_____LIRn(...)' a ete change en */ /* 'GenOperator.PASSE.D.....LIRn(...)' pour une meilleure lisibilite... */ /* */ /* Avant le 20190724113720, il y avait ici : */ /* */ /* _____define(GenOperator_PASSE_D_____LIRn */ /* ,++D++-define $1($3) \ */ /* -_-_-_- DIVI($2($3),$4($5))++F++ */ /* ) */ /* */ /* Mais a cause de 'v $xiii/pent_image$FON LIR3', le 'DIVI(...)' a ete remplace par un */ /* 'DIVZ(...)' au cas ou la somme des ponderations serait nulle... */ GenOperator_PASSE_D_____LIRn(LIR1 ,LIN1,++D++a0,x0,b++F++ ,ADD2,++D++a0,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR2 ,LIN2,++D++a0,x0,a1,x1,b++F++ ,ADD3,++D++a0,a1,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR3 ,LIN3,++D++a0,x0,a1,x1,a2,x2,b++F++ ,ADD4,++D++a0,a1,a2,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR4 ,LIN4,++D++a0,x0,a1,x1,a2,x2,a3,x3,b++F++ ,ADD5,++D++a0,a1,a2,a3,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR5 ,LIN5,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,b++F++ ,ADD6,++D++a0,a1,a2,a3,a4,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR6 ,LIN6,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,b++F++ ,ADD7,++D++a0,a1,a2,a3,a4,a5,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR7 ,LIN7,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,b++F++ ,ADD8,++D++a0,a1,a2,a3,a4,a5,a6,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR8 ,LIN8,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,b++F++ ,ADD9,++D++a0,a1,a2,a3,a4,a5,a6,a7,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR9 ,LIN9,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,b++F++ ,ADD10,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR10 ,LIN10,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,b++F++ ,ADD11,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR11 ,LIN11,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,b++F++ ,ADD12,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR12 ,LIN12,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,b++F++ ,ADD13,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR13 ,LIN13,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,b++F++ ,ADD14,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR14 ,LIN14,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD,b++F++ ,ADD15,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,aD,b++F++ ) GenOperator_PASSE_D_____LIRn(LIR15 ,LIN15,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE,b++F++ ,ADD16,++D++a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,aD,aE,b++F++ ) /* Le 20080102130008, furent introduites 'LIR14(...)' et 'LIR15(...)'. */ _____define(GenOperator_PASSE_D_____LRZn,++D++-define $1($3) \ -_-_-_- $2($3,ZERO)++F++ ) /* Generateur des 'LRZ?(....)'s introduit le 20211116175755 pour simplifier les */ /* 'LIR?(...,[F]ZERO)', d'ou le nom 'LRZ?' pour "Zero"... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....LRZn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'LRZ?' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'LIR?' a utiliser (de rang 'n'), */ /* $3 : liste d'arguments. */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator_PASSE_D.....LRZn') */ /* donne a priori a 'GenOperator_PASSE_D.....LRZn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....LRZn' la bonne definition... */ GenOperator_PASSE_D_____LRZn(LRZ1 ,LIR1 ,++D++a0,x0++F++) GenOperator_PASSE_D_____LRZn(LRZ2 ,LIR2 ,++D++a0,x0,a1,x1++F++) GenOperator_PASSE_D_____LRZn(LRZ3 ,LIR3 ,++D++a0,x0,a1,x1,a2,x2++F++) GenOperator_PASSE_D_____LRZn(LRZ4 ,LIR4 ,++D++a0,x0,a1,x1,a2,x2,a3,x3++F++) GenOperator_PASSE_D_____LRZn(LRZ5 ,LIR5 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4++F++) GenOperator_PASSE_D_____LRZn(LRZ6 ,LIR6 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5++F++) GenOperator_PASSE_D_____LRZn(LRZ7 ,LIR7 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6++F++) GenOperator_PASSE_D_____LRZn(LRZ8 ,LIR8 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7++F++) GenOperator_PASSE_D_____LRZn(LRZ9 ,LIR9 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8++F++) GenOperator_PASSE_D_____LRZn(LRZ10,LIR10,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9++F++) GenOperator_PASSE_D_____LRZn(LRZ11,LIR11,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA++F++) GenOperator_PASSE_D_____LRZn(LRZ12,LIR12,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB++F++) GenOperator_PASSE_D_____LRZn(LRZ13 ,LIR13 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC++F++ ) GenOperator_PASSE_D_____LRZn(LRZ14 ,LIR14 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD++F++ ) GenOperator_PASSE_D_____LRZn(LRZ15 ,LIR15 ,++D++a0,x0,a1,x1,a2,x2,a3,x3,a4,x4,a5,x5,a6,x6,a7,x7,a8,x8,a9,x9,aA,xA,aB,xB,aC,xC,aD,xD,aE,xE++F++ ) /* Calcul des formes lineaires N-dimensionnelles 'LRZ?(....)' : */ /* */ /* Sigma(A .X ) */ /* i i */ /* -------------- */ /* Sigma(A ) */ /* i */ /* */ /* Cela fut introduit le 20211116175755 pour simplifier les 'LIR?(...,[F]ZERO)'... */ -define BLI1(a11,a1,x1,b) \ -_-_-_- LIN2(a11,EXP2(x1),a1,EXP1(x1),b) /* Calcul de la forme bilineaire 1-dimensionnelle : */ /* */ /* 2 */ /* a11.x1 + a1.x1 + */ /* b */ /* */ /* (introduit le 20070626140959). */ -define BLI2(a11,a1,x1,a22,a2,x2,a12,b) \ -_-_-_- BLI1(a11,a1,x1 \ -_-_-_- ,BLI1(a22,a2,x2 \ -_-_-_- ,LIN1(a12,MUL2(x1,x2),b) \ -_-_-_- ) \ -_-_-_- ) /* Calcul de la forme bilineaire 2-dimensionnelle : */ /* */ /* 2 */ /* a11.x1 + a1.x1 + */ /* 2 */ /* a22.x2 + a2.x2 + */ /* a12.x1.x2 + */ /* b */ /* */ /* (introduit le 20070626140959). */ -define BLI3(a11,a1,x1,a22,a2,x2,a33,a3,x3,a12,a23,b) \ -_-_-_- BLI2(a11,a1,x1,a22,a2,x2,a12 \ -_-_-_- ,BLI1(a33,a3,x3 \ -_-_-_- ,LIN1(a23,MUL2(x2,x3),b) \ -_-_-_- ) \ -_-_-_- ) /* Calcul de la forme bilineaire 3-dimensionnelle : */ /* */ /* 2 */ /* a11.x1 + a1.x1 + */ /* 2 */ /* a22.x2 + a2.x2 + */ /* 2 */ /* a33.x3 + a3.x3 + */ /* a12.x1.x2 + */ /* a23.x2.x3 + */ /* b */ /* */ /* (introduit le 20070626140959). */ /* */ /* On notera l'absence de 'a31.x3.x1' trop difficile a introduire recursivement... */ -define BLI4(a11,a1,x1,a22,a2,x2,a33,a3,x3,a44,a4,x4,a12,a23,a34,b) \ -_-_-_- BLI3(a11,a1,x1,a22,a2,x2,a33,a3,x3,a12,a23 \ -_-_-_- ,BLI1(a44,a4,x4 \ -_-_-_- ,LIN1(a34,MUL2(x3,x4),b) \ -_-_-_- ) \ -_-_-_- ) /* Calcul de la forme bilineaire 4-dimensionnelle : */ /* */ /* 2 */ /* a11.x1 + a1.x1 + */ /* 2 */ /* a22.x2 + a2.x2 + */ /* 2 */ /* a33.x3 + a3.x3 + */ /* 2 */ /* a44.x4 + a4.x4 + */ /* a12.x1.x2 + */ /* a23.x2.x3 + */ /* a34.x3.x4 + */ /* b */ /* */ /* (introduit le 20070626140959). */ /* */ /* On notera l'absence de 'a41.x4.x1' trop difficile a introduire recursivement... */ -define BLI5(a11,a1,x1,a22,a2,x2,a33,a3,x3,a44,a4,x4,a55,a5,x5,a12,a23,a34,a45,b) \ -_-_-_- BLI4(a11,a1,x1,a22,a2,x2,a33,a3,x3,a44,a4,x4,a12,a23,a34 \ -_-_-_- ,BLI1(a55,a5,x5 \ -_-_-_- ,LIN1(a45,MUL2(x4,x5),b) \ -_-_-_- ) \ -_-_-_- ) /* Calcul de la forme bilineaire 5-dimensionnelle : */ /* */ /* 2 */ /* a11.x1 + a1.x1 + */ /* 2 */ /* a22.x2 + a2.x2 + */ /* 2 */ /* a33.x3 + a3.x3 + */ /* 2 */ /* a44.x4 + a4.x4 + */ /* 2 */ /* a55.x5 + a5.x5 + */ /* a12.x1.x2 + */ /* a23.x2.x3 + */ /* a34.x3.x4 + */ /* a45.x4.x5 + */ /* b */ /* */ /* (introduit le 20070626140959). */ /* */ /* On notera l'absence de 'a51.x5.x1' trop difficile a introduire recursivement... */ #define MODG(x,origine,extremite,Borne_Inferieure,Borne_Superieure) \ COND(IFNE(origine,extremite) \ /* Cas ou le segment [origine,extremite] n'est pas vide : */ \ ,COND(IFLT(x,Borne_Inferieure(origine,extremite)) \ /* Cas ou le nombre 'x' est avant le segment [origine,extremite] : */ \ ,SOUS(x \ ,MUL2(PRED(QUOD(SOUS(SUCC(x) \ ,Borne_Inferieure(origine,extremite) \ ) \ ,LENG(origine,extremite) \ ) \ ) \ ,LENG(origine,extremite) \ ) \ ) \ ,COND(IFGT(x,Borne_Superieure(origine,extremite)) \ /* Cas ou le nombre 'x' est apres le segment [origine,extremite] : */ \ ,SOUS(x \ ,MUL2(QUOD(SOUS(x \ ,Borne_Inferieure(origine,extremite) \ ) \ ,LENG(origine,extremite) \ ) \ ,LENG(origine,extremite) \ ) \ ) \ /* Cas ou le nombre 'x' est dans le segment [origine,extremite] : */ \ ,x \ ) \ ) \ /* Cas ou le segment [origine,extremite] est vide : */ \ ,CHOI(origine,extremite) \ ) \ /* Permet de ramener le nombre 'x' dans le segment [origine,extremite] */ \ /* quel que soit le signe de 'x' (ATTENTION : bornes INCLUSES...) : */ \ /* */ \ /* o o o */ \ /* o | o | o */ \ /* o origine o | o */ \ /* ------o------+-----o-----+------o-----> */ \ /* o | o extremite o x */ \ /* o | o | o */ \ /* o o o */ \ /* */ \ /* a comparer a 'TRON'... */ \ /* */ \ /* ATTENTION : 'MODG(...)' ne fonctionne qu'avec des nombres entiers ; pour des nombres */ \ /* flottants, il conviendra d'utiliser 'MODF(...)' avec un segment [origine,extremite] */ \ /* bien ordonne... */ #define MODU(x,origine,extremite) \ MODG(x,origine,extremite,MIN2,MAX2) \ /* Permet de ramener le nombre 'x' dans le segment [origine,extremite] */ \ /* quel que soit le signe de 'x' et quel que soit l'ordre des bornes */ \ /* 'origine' et 'extremite' du segment (ATTENTION : bornes INCLUSES...) : */ \ /* */ \ /* o o o */ \ /* o | o | o */ \ /* o origine o | o */ \ /* ------o------+-----o-----+------o-----> */ \ /* o | o extremite o x */ \ /* o | o | o */ \ /* o o o */ \ /* */ \ /* a comparer a 'TRON'... */ \ /* */ \ /* ATTENTION : 'MODU(...)' ne fonctionne qu'avec des nombres entiers ; pour des nombres */ \ /* flottants, il conviendra d'utiliser 'MODF(...)' avec un segment [origine,extremite] */ \ /* bien ordonne... */ #define MODS(x,origine,extremite) \ MODG(x,origine,extremite,SE12,SE22) \ /* Permet de ramener le nombre 'x' dans le segment [origine,extremite] */ \ /* quel que soit le signe de 'x' et en supposant l'ordre des bornes */ \ /* 'origine' et 'extremite' du segment correct, c'est-a-dire que l'on a */ \ /* origine < extremite (ATTENTION : bornes INCLUSES...) : */ \ /* */ \ /* o o o */ \ /* o | o | o */ \ /* o origine o | o */ \ /* ------o------+-----o-----+------o-----> */ \ /* o | o extremite o x */ \ /* o | o | o */ \ /* o o o */ \ /* */ \ /* a comparer a 'TRON'... */ \ /* */ \ /* ATTENTION : 'MODS(...)' ne fonctionne qu'avec des nombres entiers ; pour des nombres */ \ /* flottants, il conviendra d'utiliser 'MODF(...)' avec un segment [origine,extremite] */ \ /* bien ordonne... */ #define MODF(x,origine,extremite) \ HOMO(CERC(HOMO(x \ ,origine,extremite \ ,FZERO,CERCLE_TRIGONOMETRIQUE \ ) \ ) \ ,FZERO,CERCLE_TRIGONOMETRIQUE \ ,origine,extremite \ ) \ /* Permet de ramener le nombre 'x' dans le segment [origine,extremite] */ \ /* quel que soit le signe de 'x' et en supposant l'ordre des bornes */ \ /* 'origine' et 'extremite' du segment correct, c'est-a-dire que l'on a */ \ /* origine < extremite (ATTENTION : bornes INCLUSES...) : */ \ /* */ \ /* o o o */ \ /* o | o | o */ \ /* o origine o | o */ \ /* ------o------+-----o-----+------o-----> */ \ /* o | o extremite o x */ \ /* o | o | o */ \ /* o o o */ \ /* */ \ /* a comparer a 'TRON'... */ \ /* */ \ /* On notera que 'MODF(...)' fonctionne correctement avec des nombres flottants... */ #define MODFcs(x,origine,extremite) \ MEME_SIGNE_QUE(x,MODF(x,origine,extremite)) \ /* Identique a 'MODF(...)' mais en Conservant le Signe, meme si cela n'a que peu de sens, */ \ /* cela fut introduit le 20060814171943 pour 'v $xrs/surfaces.12$I MODFcs'. Cela n'a en */ \ /* effet que peu de sens mathematiquement car, en effet, en respectant le signe de 'x', le */ \ /* resultat du 'MODF(...)' qui etait evidemment dans [origine,extremite], peut en sortir a */ \ /* cause du 'MEME_SIGNE_QUE(...)'... */ #define bSCAL(x,ancien_intervalle,nouvel_intervalle) \ MUL2(DIVI(x \ ,ancien_intervalle \ ) \ ,nouvel_intervalle \ ) \ /* Introduit le 20040409122523 specifiquement pour 'v $xcp/Bugs$K bSCAL' afin qu'il n'y */ \ /* ait pas de conditionnalite dans cette regle de trois... */ #define bbSCAL(x,ancien_intervalle,nouvel_intervalle) \ bMUL(bDIV(x \ ,ancien_intervalle \ ) \ ,nouvel_intervalle \ ) \ /* Introduit le 20161203114852 pour etre sur de bloquer un processus de derivation (voir */ \ /* par exemple 'v $xrs/huit.11$I bbSCAL'). */ -define gSCAZ(x,ancien_intervalle,nouvel_intervalle,exception,conversion) \ -_-_-_- COND(IZNE(ancien_intervalle) \ -_-_-_- ,MUL2(DIVI(conversion(x) \ -_-_-_- ,conversion(ancien_intervalle) \ -_-_-_- ) \ -_-_-_- ,conversion(nouvel_intervalle) \ -_-_-_- ) \ -_-_-_- ,exception \ -_-_-_- ) /* Fonction identique a 'SCAL(...)' mais prenant en compte la possibilite qu'a l'ancien */ /* intervalle de se reduire a un point et ce quels que soient les types des donnees */ /* (introduit le 20011025140011 a cause de 'v $xrk/rdn_walk.52$K dSCAL'). */ -define SCAZ(x,ancien_intervalle,nouvel_intervalle,exception) \ -_-_-_- gSCAZ(x,ancien_intervalle,nouvel_intervalle,exception,FLOT) /* Fonction identique a 'SCAL(...)' mais prenant en compte la possibilite qu'a l'ancien */ /* intervalle de se reduire a un point... */ -define SCAL(x,ancien_intervalle,nouvel_intervalle) \ -_-_-_- SCAZ(x,ancien_intervalle,nouvel_intervalle,x) /* Permet de faire une "regle de trois" qui fait passer le nombre 'x' */ /* d'un 'ancien intervalle' a un 'nouvel intervalle', soit : */ /* */ /* nouvel_intervalle */ /* ------------------- . x */ /* ancien_intervalle */ /* */ /* ou en abrege : */ /* */ /* n */ /* SCAL(x,a,n) = x.--- */ /* a */ /* */ /* le resultat est donne en flottant. ATTENTION, j'ai longtemps utilise : */ /* */ /* MUL2(DIVI(FLOT(nouvel_intervalle) */ /* ,FLOT(ancien_intervalle) */ /* ) */ /* ,FLOT(x) */ /* ) */ /* */ /* mais afin de garantir l'obtention de la valeur 'nouvel_intervalle' dans le cas ou : */ /* */ /* x = ancien_intervalle */ /* */ /* j'ai change l'ordre des operations (ceci s'est vu a la suite d'un probleme de conversion */ /* dans la fonction 'Ifloat_std(...)' de '$xiii/conversion$FON' pour laquelle de temps en */ /* temps le maximum de 'nouvel_intervalle' n'est pas atteint pour 'x' valant le maximum de */ /* 'ancien_intervalle'). */ -define dSCAL(x,ancien_intervalle,nouvel_intervalle) \ -_-_-_- INTE(SCAL(x,ancien_intervalle,nouvel_intervalle)) /* Fonction identique a 'SCAL(...)' mais sans typage des donnees afin de pouvoir l'utiliser, */ /* par exemple, pour dimensionner des tableaux ('v $xrk/rdn_walk.52$K dSCAL'). En fait, */ /* jusqu'au 20011026102952, la definition de 'dSCAL(...)' a ete : */ /* */ /* -define dSCAL(x,ancien_intervalle,nouvel_intervalle) \ */ /* -_-_-_- gSCAZ(x,ancien_intervalle,nouvel_intervalle,x,NEUT) */ /* */ /* mais cela creait un petit probleme car le calcul qui est effectue en realite est : */ /* */ /* x */ /* SCAL(x,a,n) = ---.n */ /* a */ /* */ /* et non pas : */ /* */ /* n */ /* SCAL(x,a,n) = x.--- */ /* a */ /* */ /* La division etant effectuee avant la multiplication, il y a une perte de precision */ /* importante et ainsi, par exemple, dans 'v $xrk/rdn_walk.52$K dSCAL' avec un ancien */ /* et un nouvel intervalles egaux (a 256 au passage), le resultat (egal a 29952) etait */ /* different de 'x' (egal a 30000 dans ce cas). D'ou cette nouvelle version... */ -define idSCAL(x,ancien_intervalle,nouvel_intervalle) \ -_-_-_- gSCAZ(x,ancien_intervalle,nouvel_intervalle,x,NEUT) /* Le 20170126111709, a cause de '$LACT1A' il a fallu introduire cette version speciale */ /* de 'dSCAL(...)' ne contenant pas de typage 'FLOT(...)'. En effet, 'dSCAL(...)' sur */ /* '$LACT1A' donnait pour les fichers : */ /* */ /* $xrk/SolConnue.11$K */ /* $xrk/SolConnue.21$K */ /* $xrk/lorenz.11$K */ /* $xrk/rdn_walk.52$K */ /* */ /* les messages ennuyeux suivants : */ /* */ /* warning: variably modified '...' at file scope */ /* */ /* par exemple pour 'liste_des_index' (defini a l'EXTERIEUR de toute fonction -et en */ /* particulier du 'main(...)'- avec le type 'Local' -soit donc 'static'- via la procedure */ /* 'v $xrv/champs_5.41$I gDEFINITION_LISTE') et : */ /* */ /* error: storage size of '...' isn't constant */ /* */ /* par exemple pour 'liste_des_corps' (defini a l'INTERIEUR du 'main(...)'- avec le type */ /* 'Local'...). On remarque donc que le type de message depend de la localisation de la */ /* definition du tableau par rapport aux fonctions (et en particulier le 'main(...)'). */ /* */ /* En fait le probleme venait de la presence du typage '(double)' dans la definition */ /* de 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION' via donc 'dSCAL(...)'... */ /* */ /* Cela s'est revu aux environs du 20180403185947 sur '$CMAP28, ex(1) "porte-brancion"' */ /* apres que toutes ces MACHINEs aient ete mises a jour. Il a donc fallu modifier en */ /* consequences les '$K's suivants : */ /* */ /* $xrk/SolConnue.11$K */ /* $xrk/SolConnue.21$K */ /* $xrk/lorenz.11$K */ /* $xrk/rdn_walk.52$K */ /* */ /* en introduisant 'SYSTEME_APC_LinuxRedHat_GCC' dans la definition conditionnelle de */ /* 'v $xrk/rdn_walk.52$K NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION' (par exemple...). */ -define HOMO(x,origine1,extremite1,origine2,extremite2) \ -_-_-_- ADD2(SCAL(SOUS(x,origine1),SOUS(extremite1,origine1),SOUS(extremite2,origine2)),origine2) /* Permet de faire passer le nombre 'x' appartenant a [origine1,extremite1] dans le */ /* segment [origine2,extremite2] en respectant la loi : */ /* */ /* y = f(x) = a.x + b */ /* */ /* ou : */ /* */ /* f(o1) = o2 */ /* f(e1) = e2 */ /* */ -define HOMZ(x,origine1,extremite1,origine2,extremite2,exception) \ -_-_-_- ADD2(SCAZ(SOUS(x,origine1),SOUS(extremite1,origine1),SOUS(extremite2,origine2),exception),origine2) /* Permet de faire passer le nombre 'x' appartenant a [origine1,extremite1] dans le */ /* segment [origine2,extremite2] avec test de l'egalite de 'origine1' et de 'extremite1'. */ -define NORM(x,origine,extremite) \ -_-_-_- HOMO(x,origine,extremite,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE) /* Permet de normaliser le nombre 'x' appartenant a [origine,extremite], c'est-a-dire, */ /* le ramene dans le segment [0,1]. */ -define NORZ(x,origine,extremite,exception) \ -_-_-_- HOMZ(x,origine,extremite,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE,exception) /* Permet de normaliser le nombre 'x' appartenant a [origine,extremite], c'est-a-dire, */ /* le ramene dans le segment [0,1] avec test de l'egalite de 'origine' et de 'extremite'. */ -define DENO(x,origine,extremite) \ -_-_-_- HOMO(x,COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE,origine,extremite) /* Operation inverse de 'NORM(...)', et fait donc passer le nombre 'x' normalise du segment */ /* [0,1] au segment [origine,extremite]. */ #define TRON(x,origine,extremite) \ MIN2(extremite,MAX2(origine,x)) \ /* Permet de ramener par troncation le nombre 'x' dans le segment [origine,extremite] */ \ /* quel que soit son signe et en supposant origine<extremite : */ \ /* */ \ /* o o o o o o */ \ /* o | */ \ /* origine o | */ \ /* ----------+-----o-----+---------> */ \ /* | o extremite x */ \ /* | o */ \ /* o o o o o o */ \ /* */ \ /* a comparer a 'MODU'... */ #define TROQ(x,origine,extremite) \ TRON(x,MIN2(origine,extremite),MAX2(origine,extremite)) \ /* Procedure identique a 'TRON(...)' mais independante de l'ordre relatif de 'origine' */ \ /* et de 'extremite'... */ #define xTRON(x,borne_gauche,borne_droite,valeur_a_gauche,valeur_au_centre,valeur_a_droite,IfInclus) \ COND(IfInclus(x,borne_gauche,borne_droite) \ ,valeur_au_centre \ ,COND(IFLE(x,borne_gauche) \ ,valeur_a_gauche \ ,COND(IFGE(x,borne_droite) \ ,valeur_a_droite \ ,FLOT__UNDEF \ ) \ ) \ ) \ /* Version "eXtended" de 'TRON(...)'. Ceci fut introduit le 20070508095059. On notera */ \ /* que l'on utilise 'IFLE(...)' et 'IFGE(...)' quel que soit 'IfInclus(...)' utilise, mais */ \ /* cela fonctionne correctement car, en effet, lorsque 'IFLE(...)' et 'IFGE(...)' sont */ \ /* appelees, 'IfInclus(...)' a deja fait les bons choix "ouvert"/"ferme". Enfin, on notera */ \ /* le 'FLOT__UNDEF' qui correspond en fait a un cas impossible car, en effet, cela voudrait */ \ /* dire qu'alors 'x' est dans '][borne_gauche,borne_droite][', alors que 'IfInclus(...)' a */ \ /* deja traite ce cas... */ #define xTROQ(x,borne_gauche,borne_droite,valeur_a_gauche,valeur_au_centre,valeur_a_droite,IfInclus) \ xTRON(x \ ,MIN2(borne_gauche,borne_droite) \ ,MAX2(borne_gauche,borne_droite) \ ,valeur_a_gauche \ ,valeur_au_centre \ ,valeur_a_droite \ ,IfInclus \ ) \ /* Procedure identique a 'xTRON(...)' mais independante de l'ordre relatif de 'origine' */ \ /* et de 'extremite'. Elle fut introduite le 20070515115443 par symetrie avec 'TROQ(...)'... */ #define ESCA(x,origine,extremite,inferieur,milieu,superieur) \ COND(IFLT(x,origine) \ ,inferieur \ ,COND(IFGT(x,extremite) \ ,superieur \ ,milieu \ ) \ ) \ /* Procedure "marche d'escalier" en supposant 'origine < extremite' : */ \ /* */ \ /* ^ */ \ /* superieur | o o o o o */ \ /* | | */ \ /* | origine | */ \ /* milieu |---------o-o-o-o-o-o-o---------> */ \ /* | | extremite x */ \ /* | | */ \ /* inferieur | o o o o */ \ /* | */ \ /* */ #define ESCQ(x,origine,extremite,inferieur,milieu,superieur) \ ESCA(x,MIN2(origine,extremite),MAX2(origine,extremite),inferieur,milieu,superieur) \ /* Procedure identique a 'ESCA(...)' mais independante de l'ordre relatif de 'origine' */ \ /* et de 'extremite'... */ #define PRENDRE_UN_POURCENTAGE(x,pourcent) \ SCAL(x,CENT,pourcent) \ /* Prend 'pourcent' % du nombre 'x'. */ #define CONVERTIR_EN_UN_POURCENTAGE(x,nombre) \ SCAL(x,nombre,CENT) \ /* Convertit le nombre 'x' en un pourcentage par rapport au cardinal 'nombre' d'un certain */ \ /* ensemble. */ /* Calculs de pourcentages. ATTENTION a ne pas confondre les deux procedures precedentes */ /* introduite sous cette forme le 20061023153419 afin de remplacer 'POURCENTAGE(...)' qui */ /* jouait simultanement les deux roles sans le savoir et qui etait definie par : */ /* */ /* #define POURCENTAGE(x,nombre) \ */ /* SCAL(x,nombre,CENT) */ /* */ /* (equivalent a 'CONVERTIR_EN_UN_POURCENTAGE(...)') avant le 20031111174436, puis ensuite */ /* par : */ /* */ /* #define POURCENTAGE(x,nombre) \ */ /* SCAL(x,CENT,nombre) */ /* */ /* (equivalent a 'PRENDRE_UN_POURCENTAGE(...)'). */ /* */ /* Avec les deux nouvelles definitions, on a, par exemple : */ /* */ /* PRENDRE_UN_POURCENTAGE(1234,80) = 987.2 (=80% de 1234) */ /* CONVERTIR_EN_UN_POURCENTAGE(23,200) = 11.5% (=(23/200)*100) */ /* */ /* ce qui est enfin correct... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N A R I T H M E T I Q U E " U N I V E R S E L L E " : */ /* */ /*************************************************************************************************************************************/ /* L'operateur 'UNI2(...)' a donc ete supprime le 20061024122449 et fut remplace par */ /* 'v $xig/fonct$vv$DEF GENERE__FonctionF_UNI2_02' dont on peut voir un exemple d'usage */ /* dans 'v $xrv/UNI2.11$K GENERE__FonctionF_UNI2_02'... */ /* Operation arithmetique "universelle". Ceci a ete introduit le 20050302163022 et ne sert */ /* a rien a cette date. Elle est en fait prevue pour definir des versions "etendues" des */ /* operateurs de base {ADD2,SOUS,MUL2,DIVZ,MIN2,MAX2,MOYE,MOYZ,MOYQ} ; ainsi, par exemple, */ /* la version etendue de 'ADD2(a,b)' sera 'UNI2(a,b,1,0,0,0,0,0,0,0,0,0,0)' par defaut, mais */ /* pourra etre redefinie dynamiquement comme 'UNI2(a,b,0,0,0,0,1,0,0,0,0,0,0)' c'est-a-dire */ /* 'MIN2(a,b)'. On pourrait alors, par exemple, faire des fractales ou l'addition et la */ /* multiplication seraient remplacees par le minimum et le maximum respectivement... */ /* */ /* Le 20050304114538 je note qu'il serait peut-etre mieux d'utiliser 'fDIVZ(...)' plutot */ /* que 'DIVZ(...)', mais malheureusement le type des arguments 'a' et 'b' n'est pas connu. */ /* La valeur renvoyee par une division par 0 sera donc 'INFINI' quel que soit le type des */ /* arguments 'a' et 'b'... */ /* */ /* Le 20060126113949, je note donc en resume que : */ /* */ /* UNI2(a,b,1,0,0,0,0,0,0,0,0,0,0) = ADD2(a,b) */ /* UNI2(a,b,0,1,0,0,0,0,0,0,0,0,0) = SOUS(a,b) */ /* UNI2(a,b,0,0,1,0,0,0,0,0,0,0,0) = MUL2(a,b) */ /* UNI2(a,b,0,0,0,1,0,0,0,0,0,0,0) = DIVZ(a,b) */ /* UNI2(a,b,0,0,0,0,1,0,0,0,0,0,0) = MIN2(a,b) */ /* UNI2(a,b,0,0,0,0,0,1,0,0,0,0,0) = MAX2(a,b) */ /* UNI2(a,b,0,0,0,0,0,0,1,0,0,0,0) = MINMAX(a,b) */ /* UNI2(a,b,0,0,0,0,0,0,0,1,0,0,0) = MAXMIN(a,b) */ /* UNI2(a,b,0,0,0,0,0,0,0,0,1,0,0) = MOYE(a,b) */ /* UNI2(a,b,0,0,0,0,0,0,0,0,0,1,0) = MOYZ(a,b) */ /* UNI2(a,b,0,0,0,0,0,0,0,0,0,0,1) = MOYQ(a,b) */ /* */ /* et que, pour faire de l'arithmetique "MAX-PLUS", il suffit de parametrer les deux */ /* fonctions : */ /* */ /* FfxADD2(a,b) = UNI2(a,b,0,0,0,0,0,1,0,0,0,0,0) [=MAX2(a,b)] */ /* FfxMUL2(a,b) = UNI2(a,b,1,0,0,0,0,0,0,0,0,0,0) [=ADD2(a,b)] */ /* */ /* en fixant correctement leurs ponderations ('v $xig/fonct$vv$FON FfxADD2' et */ /* 'v $xig/fonct$vv$FON FfxMUL2' respectivement...). */ /* */ /* Le 20061023101624, furent introduits 'MINMAX(...)' et 'MAXMIN(...)'... */ /* */ /* Le 20061024122449, de plus la procedure 'UNI2(...)' a ete supprimee car, en effet, sa */ /* mise a jour etait difficile : il convenait, si une nouvelle ponderation et une nouvelle */ /* procedures etaient ajoutees, de ne pas de tromper en l'inserant partout ou necessaire et */ /* exactement au bon endroit. Voici, malgre tout, sa definition : */ /* */ /* #define UNI2(a,b \ */ /* ,pond_ADD2,pond_SOUS \ */ /* ,pond_MUL2,pond_DIVZ \ */ /* ,pond_MIN2,pond_MAX2 \ */ /* ,pond_MINMAX,pond_MAXMIN \ */ /* ,pond_MOYE,pond_MOYZ,pond_MOYQ \ */ /* ) \ */ /* LIN11(pond_ADD2,ADD2(a,b) \ */ /* ,pond_SOUS,SOUS(a,b) \ */ /* ,pond_MUL2,MUL2(a,b) \ */ /* ,pond_DIVZ,DIVZ(a,b) \ */ /* ,pond_MIN2,MIN2(a,b) \ */ /* ,pond_MAX2,MAX2(a,b) \ */ /* ,pond_MINMAX,MINMAX(a,b) \ */ /* ,pond_MAXMIN,MAXMIN(a,b) \ */ /* ,pond_MOYE,MOYE(a,b) \ */ /* ,pond_MOYZ,MOYZ(a,b) \ */ /* ,pond_MOYQ,MOYQ(a,b) \ */ /* ,ZERO \ */ /* ) */ /* */ /* */ /* Le 20061102164207 je note l'interet de l'arithmetique "MIN-ADD" (ou "MIN-PLUS") a la */ /* place de l'arithmetique usuelle "ADD-MUL" (ou "PLUS-MUL") definie par : */ /* */ /* FfxADD2(a,b) = UNI2(a,b,0,0,0,0,1,0,0,0,0,0,0) [=MIN2(a,b)] */ /* FfxMUL2(a,b) = UNI2(a,b,1,0,0,0,0,0,0,0,0,0,0) [=ADD2(a,b)] */ /* */ /* En particulier, elle permet de trouver les plus courts chemins de longueur 'N' dans un */ /* graphe non oriente (les longueurs sont positives). Soit par exemple le graphe suivant : */ /* */ /* */ /* A */ /* */ /* /\ */ /* / \ */ /* / \ */ /* 2 / \ 3 */ /* / \ */ /* / \ */ /* / \ */ /* -------------- */ /* B 7 C */ /* */ /* */ /* compose des trois noeuds {A,B,C} et de trois aretes non orientees de longueurs */ /* respectives {2,3,7}. La matrice de connexite 'M' est donc : */ /* */ /* */ /* A B C */ /* */ /* A | 0 2 3 | */ /* | | */ /* B | 2 0 7 | = M */ /* | | */ /* C | 3 7 0 | */ /* */ /* */ /* qui donne finalement les plus courts chemins de longueur 'N=1". Son carre calcule avec */ /* l'arithmetique "MIN-PLUS" c'est-a-dire en remplacant : */ /* */ /* Sigma [M(i,j) x M(j,k)] */ /* */ /* par : */ /* */ /* Minimum[M(i,j) + M(j,k)] */ /* */ /* vaut : */ /* */ /* */ /* A B C */ /* */ /* A | 4 2 3 | */ /* | | 2 */ /* B | 2 4 5 | = M */ /* | | */ /* C | 3 5 6 | */ /* */ /* */ /* qui donne les plus courts chemins de longueur 'N=2'. Ainsi, par exemple : */ /* */ /* Chemin2(B,C) = Chemin1(B,A) + Chemin1(A,C) = 2 + 3 = 5 */ /* */ /* ou encore : */ /* */ /* Chemin2(C,C) = Chemin1(C,A) + Chemin1(A,C) = 3 + 3 = 6 */ /* */ /* Enfin, la puissance N-ieme de la matrice 'M' donnerait les plus courts chemins de */ /* longueur 'N'... */ /* */ /* On notera que malheureusement, a la date du 20080108155955, le carre de la matrice 'M' */ /* vaut en fait : */ /* */ /* */ /* A B C */ /* */ /* A | 0 2 3 | */ /* | | 2 */ /* B | 2 0 5 | = M */ /* | | */ /* C | 3 5 0 | */ /* */ /* */ /* la diagonale etant nulle. Cela s'est vu grace a 'v $xci/multi_02.03$K' et vient */ /* evidemment du 'MIN2(...)' pour lequel : */ /* */ /* MIN2(0+0,ValeurPositiveQuelconque) = 0 */ /* */ /* (les '0+0' venant des "carres" des elements de la diagonale de la matrice 'M'). */ /* Il faudrait donc, pour traiter correctement ce cas, une variante de 'MIN2(...)' qui */ /* "eliminerait" en quelque sorte les valeurs nulles (voire negatives ou nulles)... */ /* La solution fut trouvee avec l'option 'v $xiii/tri_image$FON 20080109083121' qui */ /* consiste a permettre d'ignorer les couples {0,0} lors de l'iteration de produit... */ /* */ /* On notera le 20080109110510, au passage, que le carre de la matrice 'M', au sens */ /* traditionnel du terme, est : */ /* */ /* | 13 21 14 | */ /* | | 2 */ /* | 21 53 6 | = M */ /* | | */ /* | 14 6 58 | */ /* */ /* ce qui permettra de faciliter des tests ulterieurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E R I V A T I O N N U M E R I Q U E P A R T I E L L E : */ /* */ /*************************************************************************************************************************************/ #define DERIVATION_PARTIELLE(fonction_origine,fonction_extremite,amplitude_de_la_variable) \ DIVI(SOUS(fonction_extremite,fonction_origine) \ ,amplitude_de_la_variable \ ) \ /* Permet de calculer la derivee numerique partielle d'une fonction suivante la formule */ \ /* "geniale" suivante : */ \ /* */ \ /* extremite - origine */ \ /* derivee = --------------------- */ \ /* amplitude */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S C O O R D O N N E E S B A R Y C E N T R I Q U E S E T D U B A R Y C E N T R E : */ /* */ /*************************************************************************************************************************************/ -define COORDONNEE_BARYCENTRIQUE_MINIMALE \ -_-_-_- FZERO /* Definition de la valeur minimale d'une coordonnee barycentrique, */ -define COORDONNEE_BARYCENTRIQUE_MAXIMALE \ -_-_-_- FU /* Definition de la valeur maximale d'une coordonnee barycentrique. */ -define COORDONNEE_BARYCENTRIQUE_CENTRALE \ -_-_-_- MOYE(COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE) /* Definition de la valeur centrale d'une coordonnee barycentrique. */ -define AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES \ -_-_-_- bSOU(COORDONNEE_BARYCENTRIQUE_MAXIMALE,COORDONNEE_BARYCENTRIQUE_MINIMALE) /* Amplitude des coordonnees barycentriques (introduite le 20061218152415). */ /* */ /* Le 20101120092003, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ /* */ /* Le 20101210184750, les definitions 'COORDONNEE_BARYCENTRIQUE_CENTRALE' et */ /* 'AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES' sont passees de '$PASSE_1' a '$PASSE_D' */ /* a cause de 'v $xiii/aleat.2$vv$DEF AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES'... */ -define BAR2(point1,point2,lambda) \ -_-_-_- ADD2(DIS2(point1,NEUT(COORDONNEE_BARYCENTRIQUE_MAXIMALE),NEGA(lambda)) \ -_-_-_- ,DIS2(point2,NEUT(lambda),NEGA(COORDONNEE_BARYCENTRIQUE_MINIMALE)) \ -_-_-_- ) /* Permet de calculer le barycentre du segment [point1,point2] suivant le parametre */ /* 'lambda', c'est-a-dire la valeur de l'expression : */ /* */ /* [(1-lambda).point1] + [(lambda-0).point2] */ /* */ /* pour les valeurs 0 et 1 de 'lambda', elle vaut : */ /* */ /* BARY(point1,point2,0) = point1 */ /* BARY(point1,point2,1) = point2 */ /* */ /* Introduit le 20060207101350 par symetrie avec le nouveau 'BAR4(...)'... */ -define BARY(origine,extremite,lambda) \ -_-_-_- BAR2(origine,extremite,lambda) /* Permet de calculer le barycentre du segment [origine,extremite] suivant le parametre */ /* 'lambda', c'est-a-dire la valeur de l'expression : */ /* */ /* [(1-lambda).origine] + [(lambda-0).extremite] */ /* */ /* pour les valeurs 0 et 1 de 'lambda', elle vaut : */ /* */ /* BARY(origine,extremite,0) = origine */ /* BARY(origine,extremite,1) = extremite */ /* */ /* */ /* Autrefois, la fonction 'BARY(...)' etait formulee de la facon suivante : */ /* */ /* #define BARY(origine,extremite,lambda) \ */ /* ADD2(MUL2(SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE \ */ /* ,lambda \ */ /* ) \ */ /* ,origine \ */ /* ) \ */ /* ,MUL2(SOUS(lambda \ */ /* ,COORDONNEE_BARYCENTRIQUE_MINIMALE \ */ /* ) \ */ /* ,extremite \ */ /* ) \ */ /* */ /* Mais afin que la fonction 'BARY(...)' puisse participer a la detection de la sensibilite */ /* a la precision des calculs, il est plus simple qu'elle reference 'DIS2(x,a,b)', dont on */ /* consultera avec profit les commentaires... */ #define fBARY(origine,extremite,lambda,fonction) \ BARY(origine,extremite,fonction(lambda)) \ /* Permet de calculer le barycentre du segment [origine,extremite] suivant le parametre */ \ /* 'lambda', c'est-a-dire la valeur de l'expression : */ \ /* */ \ /* [(1-fonction(lambda)).origine] + [fonction(lambda).extremite] */ \ /* */ \ /* pour les valeurs 0 et 1 de 'lambda', elle vaut : */ \ /* */ \ /* fBARY(origine,extremite,0,fonction) = origine */ \ /* fBARY(origine,extremite,1,fonction) = extremite */ \ /* */ \ /* Il est de plus important que : */ \ /* */ \ /* 0 <= fonction(lambda) <= 1 */ \ /* */ \ /* pour : */ \ /* */ \ /* lambda E [0,1] */ \ /* */ \ /* ATTENTION, a cause de la definition en '$PASSE_D' de 'BARY(...)', il est imperatif de */ \ /* definir 'fBARY(...)' a partir de 'BARY(...)' et non pas l'inverse (qui aurait ete en */ \ /* fait plus logique puisque 'fBARY(...)' est plus generale que 'BARY(...)'). */ #define vBARY(origine,extremite,lambda) \ COND(IFINff(lambda,GRAND_EPSILON,SOUS(COORDONNEE_BARYCENTRIQUE_MAXIMALE,GRAND_EPSILON)) \ ,BARY(origine,extremite,lambda) \ ,COND(IFLT(lambda,GRAND_EPSILON) \ ,origine \ ,extremite \ ) \ ) \ /* Permet de calculer le barycentre du segment [origine,extremite] suivant le parametre */ \ /* 'lambda' et avec validation de celui-ci, c'est-a-dire la valeur de l'expression : */ \ /* */ \ /* [(1-lambda).origine] + [lambda.extremite] */ \ /* */ \ /* pour les valeurs 0 et 1 de 'lambda', elle vaut : */ \ /* */ \ /* BARY(origine,extremite,0) = origine */ \ /* BARY(origine,extremite,1) = extremite */ \ /* */ -define BAR4(point1,point2,point3,point4,lambda1,lambda2) \ -_-_-_- BAR2(BAR2(point1,point3,lambda1),BAR2(point2,point4,lambda1),lambda2) /* Introduit le 20060207101914, permet de calculer le barycentre du quadrilatere */ /* {point1,point2,point3,point4} suivant les parametres {lambda1,lambda2}, c'est-a-dire */ /* la valeur de l'expression : */ /* */ /* [(1-l1).(1-l2).p1] + [(1-l1).(l2-0).p2] + [(l1-0).(1-l2).p3] + [(l1-0).(l2-0).p4] */ /* */ /* ce qui peut s'ecrire : */ /* */ /* {[(1-l1).p1] + [(l1-0).p3]}.(1-l2) + {[(1-l1).p2] + [(l1-0).p4]}.(l2-0) */ /* */ /* soit : */ /* */ /* [BAR2(p1,p3,l1).(1-l2)] + [BAR2(p2,p4,l1).(l2-0)] */ /* */ /* soit encore : */ /* */ /* BAR2(BAR2(p1,p3,l1),BAR2(p2,p4,l1),l2) (1) */ /* */ /* Evidemment, cela pourrait aussi s'ecrire : */ /* */ /* {[(1-l2).p1] + [(l2-0).p2]}.(1-l1) + {[(1-l2).p3] + [(l2-0).p4]}.(l1-0) */ /* */ /* soit : */ /* */ /* [BAR2(p1,p2,l2).(1-l1)] + [BAR2(p3,p4,l2).(l1-0)] */ /* */ /* soit enfin : */ /* */ /* BAR2(BAR2(p1,p2,l2),BAR2(p3,p4,l2),l1) (2) */ /* */ /* qui est donc equivalente a (1)... */ /* */ /* Cette nouvelle formulation introduite le 20060207121926 rend caduque la definition de */ /* de 'DIT2(...)', mais je conserve cette derniere malgre tout, car on ne sait jamais... */ /* */ /* Pour les valeurs 0 et 1 de 'lambda1' et de 'lambda2', elle vaut : */ /* */ /* BAR4(point1,point2,point3,point4,0,0) = point1 */ /* BAR4(point1,point2,point3,point4,0,1) = point2 */ /* BAR4(point1,point2,point3,point4,1,0) = point3 */ /* BAR4(point1,point2,point3,point4,1,1) = point4 */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S D E " D E C O U P A G E " D ' U N N O M B R E : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */ /* definitions soient faites avant d'autres ; en particulier 'NEUT(...)' doit etre definie */ /* avant tout '-define ...'. */ -define FRA1(x) \ -_-_-_- NEUT(x) /* Par symetrie avec les autres 'FRAi'. */ -define FRA2(x) \ -_-_-_- FRAn(x,DEUX) /* Moitie du nombre 'x'. */ -define MOIT(x) \ -_-_-_- FRA2(x) -define fMOIT(x) \ -_-_-_- fFRAn(x,DEUX) /* Moitie du nombre 'x'. */ #define MOID(x) \ QUOD(x,DEUX) \ /* Moitie par Defaut du nombre 'x'. */ #define MOIE(x) \ QUOE(x,DEUX) \ /* Moitie par Exces du nombre 'x'. */ -define FRA3(x) \ -_-_-_- FRAn(x,TROIS) /* Tiers du nombre 'x'. */ -define TIER(x) \ -_-_-_- FRA3(x) -define fTIER(x) \ -_-_-_- fFRAn(x,TROIS) /* Tiers du nombre 'x' ('fTIER' fut introduit le 20070213092213 pour 'PI_SUR_3'...). */ -define FRA4(x) \ -_-_-_- FRAn(x,QUATRE) /* Quart du nombre 'x'. */ -define QUAR(x) \ -_-_-_- FRA4(x) -define fQUAR(x) \ -_-_-_- fFRAn(x,QUATRE) /* Quart du nombre 'x'. */ -define FRA5(x) \ -_-_-_- FRAn(x,CINQ) /* Cinquieme du nombre 'x'. */ -define FRA6(x) \ -_-_-_- FRAn(x,SIX) /* Sixieme du nombre 'x'. */ -define FRA7(x) \ -_-_-_- FRAn(x,SEPT) /* Septieme du nombre 'x'. */ -define FRA8(x) \ -_-_-_- FRAn(x,HUIT) /* Huitieme du nombre 'x'. */ -define FRA9(x) \ -_-_-_- FRAn(x,NEUF) /* Neuvieme du nombre 'x'. */ -define FRA10(x) \ -_-_-_- FRAn(x,DIX) /* Dixieme du nombre 'x'. */ -define FRA11(x) \ -_-_-_- FRAn(x,ONZE) /* Onzieme du nombre 'x'. */ -define FRA12(x) \ -_-_-_- FRAn(x,DOUZE) /* Douzieme du nombre 'x'. */ -define FRA13(x) \ -_-_-_- FRAn(x,TREIZE) /* Treizieme du nombre 'x'. */ -define FRA14(x) \ -_-_-_- FRAn(x,QUATORZE) /* Quatorzieme du nombre 'x'. */ -define FRA15(x) \ -_-_-_- FRAn(x,QUINZE) /* Quinzieme du nombre 'x'. */ -define FRA16(x) \ -_-_-_- FRAn(x,SEIZE) /* Seizieme du nombre 'x'. */ -define FRAm1(x) \ -_-_-_- FRAn(x,MILLE) -define FRAm2(x) \ -_-_-_- FRAn(x,MILLION) -define FRAm3(x) \ -_-_-_- FRAn(x,MILLIARD) /* Operateurs introduits le 20180504144637 pour 'v $xil/defi_c1$vv$DEF FRAm1' en */ /* particulier... */ /* Le 20101228082819, la definition des operateurs 'GROn(...)' est passee de : */ /* */ /* -define GROn(x) \ */ /* -_-_-_- MUL2(x,n) */ /* */ /* a : */ /* */ /* -define GROn(x) \ */ /* -_-_-_- MUL2(n,x) */ /* */ /* afin que lors d'une eventuelle derivation formelle la derivee de 'n' (='d_CONSTANTES') */ /* apparaisse en premier argument d'un 'MUL2(...)' et qu'ainsi un 'MUL2(0,...)' soit */ /* facilement identifiable en vue de faire des simplifications d'expressions formelles... */ -define GRO0(x) \ -_-_-_- ZERO /* (par "symetrie" avec 'DOUB' et 'TRIP'...). ATTENTION, il y a eu pendant longtemps : */ /* */ /* -define GRO0(x) \ */ /* -_-_-_- MUL2(x,ZERO) */ /* */ /* or l'existence d'un bug de type 'BUG_SYSTEME_CRAY_C_GRO0' creait un probleme */ /* lie a l'impossibilite d'avoir des definitions de '$PASSE_D' conditionnelles. Il a donc */ /* fallu choisir pour 'GRO0(...)' une definition universelle ('ZERO'...). */ -define GROu(x) \ -_-_-_- UN /* Introduit le 20200320103803 pour 'v $xrs/vagues.13$I GROu'... */ -define GRO1(x) \ -_-_-_- MUL2(UN,x) /* (par "symetrie" avec 'DOUB' et 'TRIP'...). */ -define GRO2(x) \ -_-_-_- MUL2(DEUX,x) /* Double du nombre 'x'. */ -define GRO3(x) \ -_-_-_- MUL2(TROIS,x) /* Triple du nombre 'x'. */ -define GRO4(x) \ -_-_-_- MUL2(QUATRE,x) /* Quadruple du nombre 'x'. */ -define GRO5(x) \ -_-_-_- MUL2(CINQ,x) /* Multiplication par 5 du nombre 'x'. */ -define GRO6(x) \ -_-_-_- MUL2(SIX,x) /* Multiplication par 6 du nombre 'x'. */ -define GRO7(x) \ -_-_-_- MUL2(SEPT,x) /* Multiplication par 7 du nombre 'x'. */ -define GRO8(x) \ -_-_-_- MUL2(HUIT,x) /* Multiplication par 8 du nombre 'x'. */ -define GRO9(x) \ -_-_-_- MUL2(NEUF,x) /* Multiplication par 9 du nombre 'x'. */ -define GRO10(x) \ -_-_-_- MUL2(DIX,x) /* Multiplication par 10 du nombre 'x'. */ -define GRO11(x) \ -_-_-_- MUL2(ONZE,x) /* Multiplication par 11 du nombre 'x'. */ -define GRO12(x) \ -_-_-_- MUL2(DOUZE,x) /* Multiplication par 12 du nombre 'x'. */ -define GRO13(x) \ -_-_-_- MUL2(TREIZE,x) /* Multiplication par 13 du nombre 'x'. */ -define GRO14(x) \ -_-_-_- MUL2(QUATORZE,x) /* Multiplication par 14 du nombre 'x'. */ -define GRO15(x) \ -_-_-_- MUL2(QUINZE,x) /* Multiplication par 15 du nombre 'x'. */ -define GRO16(x) \ -_-_-_- MUL2(SEIZE,x) /* Multiplication par 16 du nombre 'x'. */ /* Le 20101228082819, la definition des operateurs 'GROn(...)' est passee de : */ /* */ /* -define GROn(x) \ */ /* -_-_-_- MUL2(x,n) */ /* */ /* a : */ /* */ /* -define GROn(x) \ */ /* -_-_-_- MUL2(n,x) */ /* */ /* afin que lors d'une eventuelle derivation formelle la derivee de 'n' (='d_CONSTANTES') */ /* apparaisse en premier argument d'un 'MUL2(...)' et qu'ainsi un 'MUL2(0,...)' soit */ /* facilement identifiable en vue de faire des simplifications d'expressions formelles... */ -define ZORO(x) \ -_-_-_- GRO0(x) /* (par "symetrie" avec 'DOUB' et 'TRIP'...). */ -define MONO(x) \ -_-_-_- GRO1(x) /* (par "symetrie" avec 'DOUB' et 'TRIP'...). */ -define DOUB(x) \ -_-_-_- GRO2(x) /* Double du nombre 'x'. */ -define DOUP(x) \ -_-_-_- ADD2(DOUB(x),UN) /* Double du nombre 'x' plus un. */ -define TRIP(x) \ -_-_-_- GRO3(x) /* Triple du nombre 'x'. */ -define QUAD(x) \ -_-_-_- GRO4(x) /* Quadruple du nombre 'x'. */ -define EXP0(x) \ -_-_-_- UN /* 'x' a la puissance 0... */ -define EXP1(x) \ -_-_-_- MUL2(x,EXP0(x)) /* 'x' a la puissance 1... */ -define EXP2(x) \ -_-_-_- MUL2(x,EXP1(x)) /* 'x' a la puissance 2 (ou 'carre')... */ -define EXP3(x) \ -_-_-_- MUL2(x,EXP2(x)) /* 'x' a la puissance 3 (ou 'cube')... */ -define EXP4(x) \ -_-_-_- MUL2(x,EXP3(x)) /* 'x' a la puissance 4... */ -define EXP5(x) \ -_-_-_- MUL2(x,EXP4(x)) /* 'x' a la puissance 5... */ -define EXP6(x) \ -_-_-_- MUL2(EXP3(x),EXP3(x)) /* 'x' a la puissance 6... */ -define EXP7(x) \ -_-_-_- MUL2(EXP3(x),EXP4(x)) /* 'x' a la puissance 7 (introduit le 20170928110301, pour le plaisir...). */ -define EXP8(x) \ -_-_-_- MUL2(EXP4(x),EXP4(x)) /* 'x' a la puissance 8 (introduit le 20170928110301, pour le plaisir...). */ -define EXP9(x) \ -_-_-_- MUL2(EXP3(x),EXP6(x)) /* 'x' a la puissance 9... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E S D E S O P E R A T E U R S L O G I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define d_IFOU(condition_1,condition_2) \ IFOU(condition_1,condition_2) \ /* Derivee de la fonction 'IFOU' : */ \ /* */ \ /* d(IFOU(c1,c2)) = IFOU(c1,c2) */ \ /* */ #define d_IFET(condition_1,condition_2) \ IFET(condition_1,condition_2) \ /* Derivee de la fonction 'IFET' : */ \ /* */ \ /* d(IFET(c1,c2)) = IFET(c1,c2) */ \ /* */ #define d_IFEQ(x,a) \ IFEQ(x,a) \ /* Derivee de la fonction 'IFEQ' : */ \ /* */ \ /* d(IFEQ(x,a)) = IFEQ(x,a) */ \ /* */ #define d_IFNE(x,a) \ IFNE(x,a) \ /* Derivee de la fonction 'IFNE' : */ \ /* */ \ /* d(IFNE(x,a)) = IFNE(x,a) */ \ /* */ #define d_IFGE(x,a) \ IFGE(x,a) \ /* Derivee de la fonction 'IFGE' : */ \ /* */ \ /* d(IFGE(x,a)) = IFGE(x,a) */ \ /* */ #define d_IFGT(x,a) \ IFGT(x,a) \ /* Derivee de la fonction 'IFGT' : */ \ /* */ \ /* d(IFGT(x,a)) = IFGT(x,a) */ \ /* */ #define d_IFLE(x,a) \ IFLE(x,a) \ /* Derivee de la fonction 'IFLE( : */ \ /* */ \ /* d(IFLE(x,a)) = IFLE(x,a) */ \ /* */ #define d_IFLT(x,a) \ IFLT(x,a) \ /* Derivee de la fonction 'IFLT' : */ \ /* */ \ /* d(IFLT(x,a)) = IFLT(x,a) */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E R I V E E D E L ' O P E R A T E U R D E S E L E C T I O N C O N D I T I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #define d_COND(condition,valeur_si_vrai,valeur_si_faux) \ COND(condition,d#valeur_si_vrai,d#valeur_si_faux) \ /* Derivee de la fonction de selection conditionnelle : */ \ /* */ \ /* d(selection(c,v,f)) = selection(c,d(v),d(f)) */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S M A S Q U E S F O N D A M E N T A U X ( F I N ) : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, a cause de la generation de '$xcp/Konstantes$K', la definition des differents */ /* masques ne peut se faire qu'apres celle des decalages. Ceci est du en particulier au bug */ /* relatif a la fonction 'SARS(...)'. */ #define k___MHEXA \ gMASQUE(NBITHX) \ /* Definition du masque d'acces au chiffre hexa-decimal de droite d'un mot. */ \ /* */ \ /* ATTENTION : la constante 'MHEXA' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MOCD \ gMASQUE(NBITOC) \ /* Definition du masque d'acces a l'octet de droite d'un mot. */ \ /* */ \ /* ATTENTION : la constante 'MOCD' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MHWD \ gMASQUE(NBITHW) \ /* Definition du masque d'acces au demi-mot de droite d'un mot. */ \ /* */ \ /* ATTENTION : la constante 'MHWD' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MMOT \ OUIN(SCLS(MHWD,NBITHW),MHWD) \ /* Definition du masque d'un mot entier. */ \ /* */ \ /* ATTENTION : la constante 'MMOT' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* Jusqu'au 20171219152301, 'k___MMOT' etait defini par : */ \ /* */ \ /* #define k___MMOT \ */ \ /* gMASQUE(NBITMO) */ \ /* */ \ /* Malheureusement cela donnait le message suivant sur '$CMAP28' : */ \ /* */ \ /* warning: left shift count >= width of type [enabled by default] */ \ /* */ \ /* L'option 'v $Fcompilers .Wno.shift.count.overflow' n'existant pas sur '$CMAP28' */ \ /* (contrairement a '$LACT1A') il a fallu definir 'k___MMOT' autrement... */ #if ( (defined(BUG_SYSTEME_C_SARS)) \ ) # undef k___MHWD # define k___MHWD \ SLRS(MMOT,NBITHW) \ /* Definition du masque d'acces au demi-mot de Droite d'un mot. */ \ /* */ \ /* ATTENTION : voir le commentaire associe a la definition de 'SIZE_GENERAL(...)'. */ \ /* */ \ /* ATTENTION : la constante 'MHWD' est pre-generee dans '$xcp/Konstantes$K'. */ # undef k___MMOT # define k___MMOT \ NEGA(UN) \ /* Definition du masque d'un mot entier ; dans la mesure ou les decalages Arithmetiques */ \ /* a droite n'existent pas ici, et que leur simulation demande 'MMOT' (via 'COMK(...)'), */ \ /* il est difficile de definir 'MMOT' a l'aide 'NBITHW' qui utilise 'SARS(...)'... */ \ /* */ \ /* ATTENTION : voir le commentaire associe a la definition de 'SIZE_GENERAL(...)'. */ \ /* */ \ /* ATTENTION : la constante 'MMOT' est pre-generee dans '$xcp/Konstantes$K'. */ #Aif ( (defined(BUG_SYSTEME_C_SARS)) \ ) #Eif ( (defined(BUG_SYSTEME_C_SARS)) \ ) #define k___VALEUR_MINIMALE_DANS_UN_OCTET \ MASQUE_VIDE #define k___VALEUR_MAXIMALE_DANS_UN_OCTET \ MOCD #define k___NOMBRE_D_OCTETS_DIFFERENTS \ LENG(VALEUR_MINIMALE_DANS_UN_OCTET,VALEUR_MAXIMALE_DANS_UN_OCTET) /* Plus petite et plus grande valeur (non signees) stockables dans un octet. Le parametre */ /* 'NOMBRE_D_OCTETS_DIFFERENTS' a ete introduit le 20041202091409... */ /* */ /* ATTENTION : ces constantes sont pre-generees dans '$xcp/Konstantes$K'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef MHEXA \ k___MHEXA #TestADef MOCD \ k___MOCD #TestADef MHWD \ k___MHWD #TestADef MMOT \ k___MMOT #TestADef VALEUR_MINIMALE_DANS_UN_OCTET \ k___VALEUR_MINIMALE_DANS_UN_OCTET #TestADef VALEUR_MAXIMALE_DANS_UN_OCTET \ k___VALEUR_MAXIMALE_DANS_UN_OCTET #TestADef NOMBRE_D_OCTETS_DIFFERENTS \ k___NOMBRE_D_OCTETS_DIFFERENTS /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S S U R B I T S D A N S U N M O T : */ /* */ /*************************************************************************************************************************************/ #define LBIT \ UNITE \ /* Longueur d'un bit... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S S U R O C T E T D A N S U N M O T : */ /* */ /*************************************************************************************************************************************/ #define Decalage_octet(numero_de_l_octet) \ bMUL(bSOU(TRMU(NOCMO),numero_de_l_octet),NBITOC) \ /* Cette fonction convertit un numero d'octet (l'octet '0' etant l'octet de */ \ /* gauche) en une amplitude de decalage a droite. */ #define BYTn(mot,numero_de_l_octet) \ ETLO(SLRS(mot,Decalage_octet(numero_de_l_octet)),MOCD) \ /* Recuperation de l'octet numero 'n' dans un mot, l'octet '0' etant le plus a gauche... */ #define BYT0(mot) \ BYTn(mot,ZERO) \ /* Recuperation de l'octet numero '0' dans un mot, l'octet '0' etant le plus a gauche... */ #define BYT1(mot) \ BYTn(mot,UN) \ /* Recuperation de l'octet numero '1' dans un mot, l'octet '0' etant le plus a gauche... */ #define BYT2(mot) \ BYTn(mot,DEUX) \ /* Recuperation de l'octet numero '2' dans un mot, l'octet '0' etant le plus a gauche... */ #define BYT3(mot) \ BYTn(mot,TROIS) \ /* Recuperation de l'octet numero '3' dans un mot, l'octet '0' etant le plus a gauche... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S D ' I N C R E M E N T A T I O N : */ /* */ /*************************************************************************************************************************************/ #define INCR(x,increment) \ EGAL(x,bADD(x,increment)) \ /* Incrementation d'une variable. */ \ /* */ \ /* Le 20101120092003, 'bADD(...)' plus logique a remplace 'ADD2(...)'. */ #define DECR(x,decrement) \ EGAL(x,bSOU(x,decrement)) \ /* Decrementation d'une variable. */ \ /* */ \ /* Le 20101120092003, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ #define INCK(x) \ INCR(x,I) \ /* Incrementation d'un compteur (introduit le 20200404105518). */ #define DECK(x) \ DECR(x,I) \ /* Decrementation d'un compteur (introduit le 20200404105518). */ #define PRED(x) \ bSOU(x,I) \ /* Fonction 'PREDecesseur'. */ \ /* */ \ /* Le 20101120092003, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ -define SUCC(x) \ -_-_-_- bADD(x,I) /* Fonction 'SUCCesseur'. */ /* */ /* Le 20101120092003, 'bADD(...)' plus logique a remplace 'ADD2(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T I O N S D E P E R M U T A T I O N S D E D E U X V A L E U R S : */ /* */ /*************************************************************************************************************************************/ #define SWAP(x,y) \ Bblock \ EGAL(x,OUEX(x,y)); \ EGAL(y,OUEX(y,x)); \ EGAL(x,OUEX(x,y)); \ Eblock \ /* Permutation des variables (de type 'Int', 'Char' ou 'CHAR') 'x' et 'y' ; cette solution */ \ /* par 'OUEX()' permet de ne pas faire d'allocation memoire locale, et donc pas d'hypotheses */ \ /* trop strictes sur le type des arguments 'x' et 'y'... */ #define xSWAP(x,y,Type) \ Bblock \ DEFV(Type,INIT(variable_de_manoeuvre,x)); \ EGAL(x,y); \ EGAL(y,variable_de_manoeuvre); \ Eblock \ /* Permutation des variables (de type 'Type' quelconque) 'x' et 'y'. */ #define cSWAP(x,y) \ Bblock \ xSWAP(x,y,CHAR); \ Eblock \ /* Permutation des variables (de type 'CHAR') 'x' et 'y'. */ #define iSWAP(x,y) \ Bblock \ xSWAP(x,y,Int); \ Eblock \ /* Permutation des variables (de type 'Int') 'x' et 'y'. */ #define fSWAP(x,y) \ Bblock \ xSWAP(x,y,Float); \ Eblock \ /* Permutation des variables (de type 'Float') 'x' et 'y'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S E L E C T I O N S C O N D I T I O N N E L L E S : */ /* */ /*************************************************************************************************************************************/ #define CONV(condition,valeur_si_vrai,valeur_si_faux) \ COND(TOUJOURS_VRAI,valeur_si_vrai,valeur_si_faux) \ /* 'COND(...)' toujours VRAI ; on notera qu'il pourrait etre programme de facon peut-etre */ \ /* plus optimise par : */ \ /* */ \ /* SE23(condition,valeur_si_vrai,valeur_si_faux) */ \ /* */ #define CONF(condition,valeur_si_vrai,valeur_si_faux) \ COND(TOUJOURS_FAUX,valeur_si_vrai,valeur_si_faux) \ /* 'COND(...)' toujours FAUX ; on notera qu'il pourrait etre programme de facon peut-etre */ \ /* plus optimise par : */ \ /* */ \ /* SE33(condition,valeur_si_vrai,valeur_si_faux) */ \ /* */ _____define(GenOperator_PASSE_1_____CONnn,++D++#define $1($3,$4,vl_FAUX) \ CON01($3,$2($4,vl_FAUX))++F++ ) /* Generateur des 'CON??(....)'s introduit le 20070912125718... */ /* */ /* Definition des arguments de 'GenOperator.PASSE.D.....CONnn(...)' (on notera la presence */ /* des "."s au lieu des "_"s dans les commentaires relatifs a cet operateur : cela est */ /* destine a bloquer l'action de '$m4' dans ces commentaires...) : */ /* */ /* $1 : nom de l'operateur 'CON??' a definir (de rang 'n'), */ /* $2 : nom de l'operateur 'CON??' a utiliser (de rang 'n-1'), */ /* $3 : premiere liste d'arguments (toujours deux elements). */ /* $4 : deuxieme liste d'arguments (nombre variables d'elements), */ /* */ /* ATTENTION : l'absence de "," en bout de ligne (derriere 'GenOperator.PASSE.D.....CONnn') */ /* donne a priori a 'GenOperator.PASSE.D.....CONnn' une valeur vide. Or cela fait partie de */ /* mon modele de programmation. La modification 'v $xcc/cpp$Z 20070912133816' est destinee */ /* justement a deplacer la "," de debut de ligne pour la mettre a la fin de la ligne */ /* precedente et ainsi donner a 'GenOperator.PASSE.D.....CONnn' la bonne definition... */ #define CON01(c1,v1,vl_FAUX) \ COND(c1 \ ,v1 \ ,vl_FAUX \ ) /* Valeur conditionnelle a une condition (introduite le 20100512122420)... */ GenOperator_PASSE_1_____CONnn(CON02,CON01 ,++D++c1,v1++F++ ,++D++c2,v2++F++ ) /* ATTENTION, on notera ici (pour 'CON02(...)') et dans les definitions qui suivent (pour */ /* 'CON03(...)' a 'CON20(...)') des "choses" non conventionnelles : en effet. on trouve : */ /* */ /* CON02,CON01 */ /* */ /* (sur une meme ligne donc) et non pas : */ /* */ /* CON02 */ /* ,CON01 */ /* */ /* comme on pourrait l'esperer et comme cela est fait habituellement... */ /* */ /* De meme, la "(" est juste derriere l'appel a 'GenOperator_PASSE_1_____CONnn' et non */ /* pas devant le 'CON??' de la ligne qui suit... */ /* */ /* Tout cela est du a '$M4' qui est utilise ici et qui est tres "sensible" a la position */ /* des ","s comme cela s'est vu dans 'v $xiMo/GENERE$Z virgule' il y a bien longtemps... */ /* */ /* Le 20180823181138 pour la commande 'vG' ('v $Falias_vG GenOperator_'), j'ai ramene le */ /* nom de l'operateur defini (ici 'CON02') et celui qui le definit (ici 'CON01') sur la */ /* ligne que 'GenOperator_PASSE_1_____CONnn'... */ GenOperator_PASSE_1_____CONnn(CON03,CON02 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3++F++ ) GenOperator_PASSE_1_____CONnn(CON04,CON03 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4++F++ ) GenOperator_PASSE_1_____CONnn(CON05,CON04 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5++F++ ) GenOperator_PASSE_1_____CONnn(CON06,CON05 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6++F++ ) GenOperator_PASSE_1_____CONnn(CON07,CON06 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7++F++ ) GenOperator_PASSE_1_____CONnn(CON08,CON07 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8++F++ ) GenOperator_PASSE_1_____CONnn(CON09,CON08 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9++F++ ) GenOperator_PASSE_1_____CONnn(CON10,CON09 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA++F++ ) GenOperator_PASSE_1_____CONnn(CON11,CON10 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB++F++ ) GenOperator_PASSE_1_____CONnn(CON12,CON11 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC++F++ ) GenOperator_PASSE_1_____CONnn(CON13,CON12 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD++F++ ) GenOperator_PASSE_1_____CONnn(CON14,CON13 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE++F++ ) GenOperator_PASSE_1_____CONnn(CON15,CON14 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF++F++ ) GenOperator_PASSE_1_____CONnn(CON16,CON15 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG++F++ ) GenOperator_PASSE_1_____CONnn(CON17,CON16 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG,cH,vH++F++ ) GenOperator_PASSE_1_____CONnn(CON18,CON17 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG,cH,vH,cI,vI++F++ ) GenOperator_PASSE_1_____CONnn(CON19,CON18 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG,cH,vH,cI,vI,cJ,vJ++F++ ) GenOperator_PASSE_1_____CONnn(CON20,CON19 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG,cH,vH,cI,vI,cJ,vJ,cK,vK++F++ ) GenOperator_PASSE_1_____CONnn(CON21,CON20 ,++D++c1,v1++F++ ,++D++c2,v2,c3,v3,c4,v4,c5,v5,c6,v6,c7,v7,c8,v8,c9,v9,cA,vA,cB,vB,cC,vC,cD,vD,cE,vE,cF,vF,cG,vG,cH,vH,cI,vI,cJ,vJ,cK,vK,cL,vL++F++ ) /* Valeurs conditionnelles a deux,..., vingt conditions (introduites sous cette forme */ /* le 20170419095556). */ /* */ /* La procedure 'CON21(...)' a ete introduite le 20170515104124... */ /* */ /* Le 20180823181138 pour la commande 'vG' ('v $Falias_vG GenOperator_'), j'ai ramene le */ /* nom de l'operateur defini (du type 'CON??') et celui qui le definit (du type 'CON??') */ /* sur la ligne que 'GenOperator_PASSE_1_____CONnn'... */ #define SEL1(clef,clef1,valeur1,valeur_par_defaut) \ CON01(IFEQ(clef,clef1),valeur1 \ ,valeur_par_defaut \ ) \ /* Selection d'une valeur conditionnelle a une clef (introduite le 20070716103625)... */ #define SEL2(clef,clef1,valeur1,clef2,valeur2,valeur_par_defaut) \ CON02(IFEQ(clef,clef1),valeur1 \ ,IFEQ(clef,clef2),valeur2 \ ,valeur_par_defaut \ ) \ /* Selection d'une valeur conditionnelle a deux clefs (introduite le 20070716103625)... */ #define SEL3(clef,clef1,valeur1,clef2,valeur2,clef3,valeur3,valeur_par_defaut) \ CON03(IFEQ(clef,clef1),valeur1 \ ,IFEQ(clef,clef2),valeur2 \ ,IFEQ(clef,clef3),valeur3 \ ,valeur_par_defaut \ ) \ /* Selection d'une valeur conditionnelle a trois clefs (introduite le 20070716103625)... */ #define SEL4(clef,clef1,valeur1,clef2,valeur2,clef3,valeur3,clef4,valeur4,valeur_par_defaut) \ CON04(IFEQ(clef,clef1),valeur1 \ ,IFEQ(clef,clef2),valeur2 \ ,IFEQ(clef,clef3),valeur3 \ ,IFEQ(clef,clef4),valeur4 \ ,valeur_par_defaut \ ) \ /* Selection d'une valeur conditionnelle a quatre clefs (introduite le 20070716103625)... */ #define ZNE1(valeur1,valeur_par_defaut) \ CON01(IZNE(valeur1),valeur1 \ ,valeur_par_defaut \ ) \ /* Recherche de la premiere valeur non nulle parmi une (introduite le 20100623134438). */ #define ZNE2(valeur1,valeur2,valeur_par_defaut) \ CON02(IZNE(valeur1),valeur1 \ ,IZNE(valeur2),valeur2 \ ,valeur_par_defaut \ ) \ /* Recherche de la premiere valeur non nulle parmi deux (introduite le 20100623134438). */ #define ZNE3(valeur1,valeur2,valeur3,valeur_par_defaut) \ CON03(IZNE(valeur1),valeur1 \ ,IZNE(valeur2),valeur2 \ ,IZNE(valeur4),valeur4 \ ,valeur_par_defaut \ ) \ /* Recherche de la premiere valeur non nulle parmi trois (introduite le 20100623134438). */ #define ZNE4(valeur1,valeur2,valeur3,valeur4,valeur_par_defaut) \ CON04(IZNE(valeur1),valeur1 \ ,IZNE(valeur2),valeur2 \ ,IZNE(valeur3),valeur3 \ ,IZNE(valeur4),valeur4 \ ,valeur_par_defaut \ ) \ /* Recherche de la premiere valeur non nulle parmi quatre (introduite le 20100623134438). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E G L E D E S S I G N E S : */ /* */ /*************************************************************************************************************************************/ #define k___SIGNE_PLUS \ ABSO(UN) \ /* Pour definir le signe "+" (et la nullite...), */ \ /* */ \ /* ATTENTION, on notera que les valeurs de 'SIGNE_PLUS' et de 'SIGNE_MOINS' sont choisies */ \ /* de facon a etre utilisable dans des produits, par exemple dans 'MEME_SIGNE_QUE(...)'. */ \ /* */ \ /* Le 20101119160847, 'SIGNE_PLUS' est devenue une constante fondamentale... */ #define k___SIGNE_MOINS \ NEGA(SIGNE_PLUS) \ /* Pour definir le signe "-" ; ainsi, on respecte la tres fameuse */ \ /* regle des signes : "++" = "--" = "+", et "+-" = "-+" = "-". */ \ /* Malheureusement, on ne peut le valider par des "#if", car en effet, */ \ /* le pre-processeur n'admet pas l'appel a des macros dans les expressions */ \ /* de tests !!! */ \ /* */ \ /* ATTENTION, on notera que les valeurs de 'SIGNE_PLUS' et de 'SIGNE_MOINS' sont choisies */ \ /* de facon a etre utilisable dans des produits, par exemple dans 'MEME_SIGNE_QUE(...)'. */ \ /* */ \ /* Le 20101119160847, 'SIGNE_MOINS' est devenue une constante fondamentale... */ #TestADef SIGNE_PLUS \ k___SIGNE_PLUS #TestADef SIGNE_MOINS \ k___SIGNE_MOINS /* ATTENTION : les definitions de 'SIGNE_PLUS' et de 'SIGNE_MOINS' sont ici (et non pas */ /* apres celle de 'VALIDE' ci-apres, comme la logique le voudrait) a cause de la definition */ /* de 'SIGN(...)' ci-apres qui est en '$PASSE_D'... */ #define SIGNE_NUL \ MOYE(SIGNE_PLUS,SIGNE_MOINS) \ /* Pour definir eventuellement la nullite... */ #if ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) # undef SIGNE_NUL # define SIGNE_NUL \ INTE(MOYE(SIGNE_PLUS,SIGNE_MOINS)) \ /* Pour definir eventuellement la nullite. ATTENTION, avant l'introduction de la primitive */ \ /* 'DIVn(...)' qui est utilisee dans 'MOYE(...)' via 'FRA2(...)', et qui sert donc ci-dessus */ \ /* pour definir 'SIGNE_NUL', il y avait ici : */ \ /* */ \ /* #define SIGNE_NUL \ */ \ /* MOYE(SIGNE_PLUS,SIGNE_MOINS) */ \ /* */ \ /* Or maintenant 'SIGNE_NUL' est defini par un 'FLOT(...)', il faut donc introduire un */ \ /* 'INTE(...)'. */ #Aif ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) #Eif ( (defined(BUG_SYSTEME_SGIND_C_divisions_entieres)) \ ) -define SIGN(x) \ -_-_-_- COND(IZLT(x),SIGNE_MOINS,SIGNE_PLUS) /* Signe de 'x' qui peut etre utilise comme multiplicateur +1/-1. ATTENTION, la definition */ /* de 'SIGN(...)' doit suivre celle de 'SIGNE_PLUS' depuis l'introduction de la derivation */ /* formelle... */ -define SIGZ(x) \ -_-_-_- COND(IZEQ(x),SIGNE_NUL,COND(IZLT(x),SIGNE_MOINS,SIGNE_PLUS)) /* Intoduit le 20170305112745 afin d'integrer la nullite... */ -define MEME_SIGNE_QUE(signe,x) \ -_-_-_- bMUL(SIGN(signe),ABSO(x)) /* Donne a 'x' le meme signe que 'signe'... */ /* */ /* Le 20101120081525, 'bMUL(...)' a remplace 'MUL2(...)'. */ #define SONT_DE_MEME_SIGNE(x,y) \ IZGE(bMUL(x,y)) \ /* Indique si les deux nombres sont du meme signe (l'un ou les deux pouvant etre nuls)... */ \ /* */ \ /* Le 20101120081525, 'bMUL(...)' a remplace 'MUL2(...)'. */ #define NE_SONT_PAS_DE_MEME_SIGNE(x,y) \ NOTL(SONT_DE_MEME_SIGNE(x,y)) \ /* Indique si les deux nombres ne sont pas de meme signe (tous deux etant non nuls)... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S D E T E S T B I N A I R E : */ /* */ /*************************************************************************************************************************************/ #define TOUJOURS_VRAI \ EST_VRAI(VRAI) \ /* Condition toujours 'VRAI'... */ #define TOUJOURS_FAUX \ EST_VRAI(FAUX) \ /* Condition toujours 'FAUX'... */ #define TesV(conditions) \ Test(TOUJOURS_VRAI) \ /* 'Test' toujours 'VRAI'... */ #define TesF(conditions) \ Test(TOUJOURS_FAUX) \ /* 'Test' toujours 'FAUX'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D E T E S T B I N A I R E : */ /* */ /*************************************************************************************************************************************/ #define NEUL(x) \ NEUT(x) \ /* Condition logique 'x' inchangee. */ \ /* */ \ /* Le 20060718111227, je me demande quelle est finalement la difference entre 'NEUL(...)' */ \ /* et 'NEUTL(...)' ? */ #define VRAL(x) \ VRAI \ /* Condition logique 'x' toujours 'VRAI'. */ #define FAUL(x) \ FAUX \ /* Condition logique 'x' toujours 'FAUX'. */ #define gETAT_LOGIQUE(variable_logique,Chaine_VRAI,Chaine_FAUX) \ COND(IFEQ(variable_logique,VRAI) \ ,Chaine_VRAI \ ,COND(IFEQ(variable_logique,FAUX) \ ,Chaine_FAUX \ ,"LA VARIABLE N'A PAS UNE VALEUR LOGIQUE" \ ) \ ) #define ETAT_LOGIQUE(variable_logique) \ gETAT_LOGIQUE(variable_logique,C_VRAI____,C_FAUX____) #define ETAT_LOGIQUE_ABREGE(variable_logique) \ gETAT_LOGIQUE(variable_logique,C_VRAI_____ABREGE,C_FAUX_____ABREGE) /* Permet de generer une chaine "VRAI"/"FAUX" suivant la valeur d'une variable logique */ /* argument. La version abregee a ete introduite le 20050128215608... */ #define NEUTL(x) \ COND(IFEQ(x,VRAI) \ ,VRAI \ ,COND(IFEQ(x,FAUX) \ ,FAUX \ ,LUNDEF \ ) \ ) \ /* Operation NEUTre Logique. */ \ /* */ \ /* Le 20060718111227, je me demande quelle est finalement la difference entre 'NEUL(...)' */ \ /* et 'NEUTL(...)' ? */ #define NOTL(x) \ COND(EST_VRAI(x) \ ,FAUX \ ,COND(EST_FAUX(x) \ ,VRAI \ ,LUNDEF \ ) \ ) \ /* Negation logique de 'x'. */ #define IMPLIQUE(p,q) \ OUIN(NOTL(p),q) \ /* Implication logique "p==>q" (introduite le 20210403090456). */ #define EQUI(condition_1,condition_2) \ IFOU(IFET(EST_VRAI(condition_1),EST_VRAI(condition_2)) \ ,IFET(EST_FAUX(condition_1),EST_FAUX(condition_2)) \ ) \ /* Test de l'equivalence logique de deux conditions. On notera que l'on pourrait ecrire */ \ /* ainsi cette definition : */ \ /* */ \ /* #define EQUI(condition_1,condition_2) \ */ \ /* IFEQ(condition_1,condition_2) */ \ /* */ \ /* mais, cela serait moins elegant... */ #define NEQU(condition_1,condition_2) \ NOTL(EQUI(condition_1,condition_2)) \ /* Test de la non-equivalence logique de deux conditions. On notera que l'on pourrait ecrire */ \ /* ainsi cette definition : */ \ /* */ \ /* #define EQUI(condition_1,condition_2) \ */ \ /* IFOU(IFET(EST_VRAI(condition_1),EST_FAUX(condition_2)) \ */ \ /* ,IFET(EST_FAUX(condition_1),EST_VRAI(condition_2)) \ */ \ /* ) */ \ /* */ \ /* cela serait aussi valable... */ #define I3OU(condition_1,condition_2,condition_3) \ IFOU(IFOU(condition_1,condition_2),condition_3) \ /* 'OU' binaire a 3 conditions (anciennement 'IMOU(....)'). */ #define I3ET(condition_1,condition_2,condition_3) \ IFET(IFET(condition_1,condition_2),condition_3) \ /* 'ET' binaire a 3 conditions (anciennement 'IMET(....)'). */ #define I4OU(condition_1,condition_2,condition_3,condition_4) \ IFOU(I3OU(condition_1,condition_2,condition_3),condition_4) \ /* 'OU' binaire a 4 conditions (anciennement 'INOU(....)'). */ #define I4ET(condition_1,condition_2,condition_3,condition_4) \ IFET(I3ET(condition_1,condition_2,condition_3),condition_4) \ /* 'ET' binaire a 4 conditions (anciennement 'INET(....)'). */ #define I5OU(condition_1,condition_2,condition_3,condition_4,condition_5) \ IFOU(I4OU(condition_1,condition_2,condition_3,condition_4),condition_5) \ /* 'OU' binaire a 5 conditions (introduit le 20030204093117, 'v $xiidP/fonct$vv$DEF I5OU', */ \ /* anciennement 'IOOU(....)'). */ #define I5ET(condition_1,condition_2,condition_3,condition_4,condition_5) \ IFET(I4ET(condition_1,condition_2,condition_3,condition_4),condition_5) \ /* 'ET' binaire a 5 conditions (introduit le 20030204093117, anciennement 'IOET(....)'). */ #define I6OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6) \ IFOU(I5OU(cond_1,cond_2,cond_3,cond_4,cond_5),cond_6) \ /* 'OU' binaire a 9 conditions (introduit le 20170612113542). */ #define I6ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6) \ IFET(I5ET(cond_1,cond_2,cond_3,cond_4,cond_5),cond_6) \ /* 'ET' binaire a 9 conditions (introduit le 20170612113542). */ #define I7OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7) \ IFOU(I6OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6),cond_7) \ /* 'OU' binaire a 9 conditions (introduit le 20170612113542). */ #define I7ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7) \ IFET(I6ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6),cond_7) \ /* 'ET' binaire a 9 conditions (introduit le 20170612113542). */ #define I8OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8) \ IFOU(I7OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7),cond_8) \ /* 'OU' binaire a 9 conditions (introduit le 20170612113542). */ #define I8ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8) \ IFET(I7ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7),cond_8) \ /* 'ET' binaire a 9 conditions (introduit le 20170612113542). */ #define I9OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9) \ IFOU(I8OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8),cond_9) \ /* 'OU' binaire a 9 conditions (introduit le 20170612113542). */ #define I9ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9) \ IFET(I8ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8),cond_9) \ /* 'ET' binaire a 9 conditions (introduit le 20170612113542). */ #define I10OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9,cond_10) \ IFOU(I9OU(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9),cond_10) \ /* 'OU' binaire a 10 conditions (introduit le 20210701140132). */ #define I10ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9,cond_10) \ IFET(I9ET(cond_1,cond_2,cond_3,cond_4,cond_5,cond_6,cond_7,cond_8,cond_9),cond_10) \ /* 'ET' binaire a 10 conditions (introduit le 20210701140132). */ #define IMEQ(x,a,b) \ IFOU(IFEQ(x,a),IFEQ(x,b)) \ /* Test de 'x=a' ou 'x=b'. */ #define IMNE(x,a,b) \ IFET(IFNE(x,a),IFNE(x,b)) \ /* Test de 'x#a' et 'x#b'. */ #define INEQ(x,a,b,c) \ I3OU(IFEQ(x,a),IFEQ(x,b),IFEQ(x,c)) \ /* Test de 'x=a' ou 'x=b' ou 'x=c' (introduit le 20160615104458). */ #define INNE(x,a,b,c) \ I3ET(IFNE(x,a),IFNE(x,b),IFNE(x,c)) \ /* Test de 'x#a' et 'x#b' et 'x#c' (introduit le 20160615104458). */ #define IFEQ_a_peu_pres_absolu(x,a,epsilon) \ IFLE(SOUA(x,a) \ ,epsilon \ ) \ /* Test absolu de 'x=a' a 'epsilon' pres. On notera que l'on utilise 'IFLE(...)' afin que : */ \ /* */ \ /* IFEQ_a_peu_pres_absolu(x,a,0) == IFEQ(x,a) */ \ /* */ #define IZEQ_a_peu_pres(x,epsilon) \ IFEQ_a_peu_pres_absolu(x,ZERO,epsilon) \ /* Test de 'x=0' a 'epsilon' pres. */ #define IFEQ_a_peu_pres_relatif(x,a,pourcentage) \ IFEQ_a_peu_pres_absolu(x,a,bMUL(pourcentage,MOYE(ABSO(x),ABSO(a)))) \ /* Test relatif de 'x=a' a 'pourcentage' pres (le test est alors fonction de l'ordre de */ \ /* grandeur de la moyenne des valeurs absolues des nombres 'x' et 'a'). On notera que l'on */ \ /* utilise 'IFLE(...)' afin que : */ \ /* */ \ /* IFEQ_a_peu_pres_relatif(x,a,0) == IFEQ(x,a) */ \ /* */ \ /* ATTENTION : un "pourcentage" est un nombre dans [0,1] et non pas dans [0,100]... */ \ /* */ \ /* Avant le 20060417193804, cette definition etait : */ \ /* */ \ /* IFLE(SOUA(x,a) */ \ /* ,MUL2(pourcentage,MOYE(ABSO(x),ABSO(a))) */ \ /* ) */ \ /* */ \ /* Le 20100701170542, je note que 'IFEQ_a_peu_pres_relatif(...)' comparant '|x-a|' a */ \ /* 'p.(|x|+|a|)/2' semble etre un test assez stupide et inutile... */ \ /* */ \ /* Le 20101120092003, 'bMUL(...)' a remplace 'MUL2(...)'. */ /* ATTENTION, le 20050106112944, j'ai voulu definir : */ /* */ /* #define IZEQ_a_peu_pres_relatif(x,pourcentage) \ */ /* IFEQ_a_peu_pres_relatif(x,ZERO,pourcentage) */ /* */ /* ce qui est particulierement stupide car quand on developpe cette defintion, cela */ /* signifie comparer 'ABSO(x)' a une fraction de lui-meme !!! */ #define IFNE_a_peu_pres_absolu(x,a,epsilon) \ IFGT(SOUA(x,a) \ ,epsilon \ ) \ /* Test absolu de 'x#a' a 'epsilon' pres. On notera que l'on utilise 'IFGT(...)' afin que : */ \ /* */ \ /* IFNE_a_peu_pres_absolu(x,a,0) == IFNE(x,a) */ \ /* */ #define IZNE_a_peu_pres(x,epsilon) \ IFNE_a_peu_pres_absolu(x,ZERO,epsilon) \ /* Test de 'x#0' a 'epsilon' pres. */ #define IFNE_a_peu_pres_relatif(x,a,pourcentage) \ IFNE_a_peu_pres_absolu(x,a,bMUL(pourcentage,MOYE(ABSO(x),ABSO(a)))) \ /* Test relatif de 'x#a' a 'pourcentage' pres (le test est alors fonction de l'ordre de */ \ /* grandeur de la moyenne des valeurs absolues des nombres 'x' et 'a'). On notera que l'on */ \ /* utilise 'IFGT(...)' afin que : */ \ /* */ \ /* IFNE_a_peu_pres_relatif(x,a,0) == IFNE(x,a) */ \ /* */ \ /* ATTENTION : un "pourcentage" est un nombre dans [0,1] et non pas dans [0,100]... */ \ /* */ \ /* Avant le 20060417193804, cette definition etait : */ \ /* */ \ /* IFGT(SOUA(x,a) */ \ /* ,MUL2(pourcentage,MOYE(ABSO(x),ABSO(a))) */ \ /* ) */ \ /* */ \ /* Le 20100701170542, je note que 'IFNE_a_peu_pres_relatif(...)' comparant '|x-a|' a */ \ /* 'p.(|x|+|a|)/2' semble etre un test assez stupide et inutile... */ \ /* */ \ /* Le 20101120092003, 'bMUL(...)' a remplace 'MUL2(...)'. */ /* ATTENTION, le 20050106112944, j'ai voulu definir : */ /* */ /* #define IZNE_a_peu_pres_relatif(x,pourcentage) \ */ /* IFNE_a_peu_pres_relatif(x,ZERO,pourcentage) */ /* */ /* ce qui est particulierement stupide car quand on developpe cette defintion, cela */ /* signifie comparer 'ABSO(x)' a une fraction de lui-meme !!! */ #define IFLT_a_peu_pres_absolu(x,a,epsilon) \ IFLT(x \ ,bSOU(a,epsilon) \ ) \ /* Test absolu de 'x<a' a 'epsilon' pres (introduit le 20101008121303). */ \ /* */ \ /* Le 20101120092003, 'bSOU(...)' plus logique a remplace 'SOUS(...)'. */ #define IFGT_a_peu_pres_absolu(x,a,epsilon) \ IFGT(x \ ,bADD(a,epsilon) \ ) \ /* Test absolu de 'x>a' a 'epsilon' pres (introduit le 20101008121303). */ \ /* */ \ /* Le 20101120092003, 'bADD(...)' plus logique a remplace 'ADD2(...)'. */ #define IFEQ_chaine(chaine,chaine1) \ EST_VRAI(chain_compare(chaine,chaine1)) \ /* Test de l'egalite de deux chaines de caracteres. */ #define IMEQ_chaine(chaine,chaine1,chaine2) \ IFOU(IFEQ_chaine(chaine,chaine1),IFEQ_chaine(chaine,chaine2)) \ /* Test de 'chaine=chaine1' ou 'chaine=chaine2', {chaine,chaine1,chaine2} etant des chaines */ \ /* (introduit le 20170717192423...). */ #define IFNE_chaine(chaine,chaine1) \ EST_FAUX(chain_compare(chaine,chaine1)) \ /* Test de la difference de deux chaines de caracteres. */ #define IMNE_chaine(chaine,chaine1,chaine2) \ IFET(IFNE_chaine(chaine,chaine1),IFNE_chaine(chaine,chaine2)) \ /* Test de 'chaine#chaine1' et 'chaine#chaine2', {chaine,chaine1,chaine2} etant des chaines */ \ /* (introduit le 20170717192423...). */ #define IFOUV(condition_1,condition_2) \ TOUJOURS_VRAI \ /* 'OU' binaire ('Test' toujours 'VRAI'...), */ #define IFETV(condition_1,condition_2) \ TOUJOURS_VRAI \ /* 'ET' binaire ('Test' toujours 'VRAI'...). */ #define IFEQV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x=a' ('Test' toujours 'VRAI'...). */ #define IFNEV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x#a' ('Test' toujours 'VRAI'...). */ #define IFGEV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x>=a' ('Test' toujours 'VRAI'...). */ #define IFGTV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x>a' ('Test' toujours 'VRAI'...). */ #define IFLEV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x<=a' ('Test' toujours 'VRAI'...). */ #define IFLTV(x,a) \ TOUJOURS_VRAI \ /* Test de 'x<a' ('Test' toujours 'VRAI'...). */ #define IFOUF(condition_1,condition_2) \ TOUJOURS_FAUX \ /* 'OU' binaire ('Test' toujours 'FAUX'...), */ #define IFETF(condition_1,condition_2) \ TOUJOURS_FAUX \ /* 'ET' binaire ('Test' toujours 'FAUX'...). */ #define IFEQF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x=a' ('Test' toujours 'FAUX'...). */ #define IFNEF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x#a' ('Test' toujours 'FAUX'...). */ #define IFGEF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x>=a' ('Test' toujours 'FAUX'...). */ #define IFGTF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x>a' ('Test' toujours 'FAUX'...). */ #define IFLEF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x<=a' ('Test' toujours 'FAUX'...). */ #define IFLTF(x,a) \ TOUJOURS_FAUX \ /* Test de 'x<a' ('Test' toujours 'FAUX'...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T S S T R I C T S O U N O N S T R I C T S ( D I T S " C O N D I T I O N N E L S " ) : */ /* */ /*************************************************************************************************************************************/ #define IFLc(a,b,le_test_est_strict) \ COND(EST_VRAI(le_test_est_strict),IFLT(a,b),IFLE(a,b)) \ /* Test conditionnel de l'inferiorite (introduit le 20020625105813). */ #define IFGc(a,b,le_test_est_strict) \ COND(EST_VRAI(le_test_est_strict),IFGT(a,b),IFGE(a,b)) \ /* Test conditionnel de la superiorite (introduit le 20020625105813). */ #define IFINcc(x,a,b,le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ IFET(IFGc(x,a,le_test_est_strict_a_gauche),IFLc(x,b,le_test_est_strict_a_droite)) \ /* Test de 'x E [a,b]', en supposant a<=b (introduit le 20020708180055). */ #define IFEXcc(x,a,b,le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ IFOU(IFLc(x,a,le_test_est_strict_a_gauche),IFGc(x,b,le_test_est_strict_a_droite)) \ /* Test de 'x E/ [a,b]', en supposant a<=b (introduit le 20020708180055). */ #define INCLcc(x,a,b,le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ IFINcc(x,MIN2(a,b),MAX2(a,b),le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ /* Test de 'x E [a,b]', quelles que soient les valeurs de 'a' et 'b' (introduit le */ \ /* 20020708180055). */ #define NINCcc(x,a,b,le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ IFEXcc(x,MIN2(a,b),MAX2(a,b),le_test_est_strict_a_gauche,le_test_est_strict_a_droite) \ /* Test de 'x E/ [a,b]', quelles que soient les valeurs de 'a' et 'b' (introduit le */ \ /* 20020708180055). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D ' I N C L U S I O N B I N A I R E P A R R A P P O R T A U N F E R M E : */ /* */ /*************************************************************************************************************************************/ #define IFINff(x,a,b) \ IFET(IFGE(x,a),IFLE(x,b)) \ /* Test de 'x E [a,b]', en supposant a<=b (appele 'IFIN(x,a,b)' avant le 20020529130223). */ #define IFEXff(x,a,b) \ IFOU(IFLT(x,a),IFGT(x,b)) \ /* Test de 'x E/ [a,b]', en supposant a<=b (appele 'IFEX(x,a,b)' avant le 20020529130223). */ #define INCLff(x,a,b) \ IFINff(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E [a,b]', quelles que soient les valeurs de 'a' et 'b' (appele 'INCL(x,a,b)' */ \ /* avant le 20020529130223). */ #define NINCff(x,a,b) \ IFEXff(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E/ [a,b]', quelles que soient les valeurs de 'a' et 'b' (appele 'NINC(x,a,b)' */ \ /* avant le 20020529130223). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D ' I N C L U S I O N B I N A I R E P A R R A P P O R T A U N O U V E R T : */ /* */ /*************************************************************************************************************************************/ #define IFINoo(x,a,b) \ IFET(IFGT(x,a),IFLT(x,b)) \ /* Test de 'x E ]a,b[', en supposant a<=b. */ #define IFEXoo(x,a,b) \ IFOU(IFLE(x,a),IFGE(x,b)) \ /* Test de 'x E/ ]a,b[', en supposant a<=b. */ #define INCLoo(x,a,b) \ IFINoo(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E ]a,b[', quelles que soient les valeurs de 'a' et 'b'... */ #define NINCoo(x,a,b) \ IFEXoo(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E/ ]a,b[', quelles que soient les valeurs de 'a' et 'b'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D ' I N C L U S I O N B I N A I R E P A R R A P P O R T */ /* A U N " O U V E R T / F E R M E " : */ /* */ /*************************************************************************************************************************************/ #define IFINof(x,a,b) \ IFET(IFGT(x,a),IFLE(x,b)) \ /* Test de 'x E ]a,b]', en supposant a<=b. */ #define IFEXof(x,a,b) \ IFOU(IFLE(x,a),IFGT(x,b)) \ /* Test de 'x E/ ]a,b]', en supposant a<=b. */ #define INCLof(x,a,b) \ IFINof(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E ]a,b]', quelles que soient les valeurs de 'a' et 'b'... */ #define NINCof(x,a,b) \ IFEXof(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E/ ]a,b]', quelles que soient les valeurs de 'a' et 'b'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D ' I N C L U S I O N B I N A I R E P A R R A P P O R T */ /* A U N " F E R M E / O U V E R T " : */ /* */ /*************************************************************************************************************************************/ #define IFINfo(x,a,b) \ IFET(IFGE(x,a),IFLT(x,b)) \ /* Test de 'x E [a,b[', en supposant a<=b. */ #define IFEXfo(x,a,b) \ IFOU(IFLT(x,a),IFGE(x,b)) \ /* Test de 'x E/ [a,b[', en supposant a<=b. */ #define INCLfo(x,a,b) \ IFINfo(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E [a,b[', quelles que soient les valeurs de 'a' et 'b'... */ #define NINCfo(x,a,b) \ IFEXfo(x,MIN2(a,b),MAX2(a,b)) \ /* Test de 'x E/ [a,b[', quelles que soient les valeurs de 'a' et 'b'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D E T E S T D ' I D E N T I T E D E D E U X O B J E T S : */ /* */ /*************************************************************************************************************************************/ #define aIFID(objet1,objet2) \ IFEQ(aIDENTITE(objet1),aIDENTITE(objet2)) \ /* Test de l'identite "directe" de deux objets. */ #define aIFDI(objet1,objet2) \ IFNE(aIDENTITE(objet1),aIDENTITE(objet2)) \ /* Test de la difference "directe" de deux objets. */ /* ATTENTION, on peut etre amene a "caster" 'objet1' et/ou 'objet2' car, en effet, on ne */ /* peut comparer que des pointeurs de meme nature ('v $xrv/champs_5.14$I'). */ #define IFID(objet1,objet2) \ IFEQ(IDENTITE(objet1),IDENTITE(objet2)) \ /* Test de l'identite "indirecte" de deux objets. */ #define IFDI(objet1,objet2) \ IFNE(IDENTITE(objet1),IDENTITE(objet2)) \ /* Test de la difference "indirecte" de deux objets. */ /* ATTENTION, on peut etre amene a "caster" 'objet1' et/ou 'objet2' car, en effet, on ne */ /* peut comparer que des pointeurs de meme nature ('v $xrv/champs_5.14$I'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S L O G I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define k___FAUX \ IFNE(ZERO,ZERO) \ /* Definition du faux. ATTENTION, autrefois on utilisait : */ \ /* */ \ /* LOGI(ZERO) */ \ /* */ \ /* Cette nouvelle version est beaucoup plus sure et generale... */ \ /* */ \ /* ATTENTION : la constante 'FAUX' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___VRAI \ IFEQ(ZERO,ZERO) \ /* Definition du vrai. ATTENTION, autrefois on utilisait : */ \ /* */ \ /* LOGI(OUEX(FAUX,BIT)) */ \ /* */ \ /* (le 'NOTL(...)' etant inutilisable pour des raisons de recursivite...) */ \ /* */ \ /* Cette nouvelle version est beaucoup plus sure et generale... */ \ /* */ \ /* ATTENTION : la constante 'VRAI' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___INDECIS \ ADD2(ADD2(FAUX,FAUX),ADD2(VRAI,VRAI)) \ /* Definition de l'indecis defini de facon a etre du type 'Logical' (c'est-a-dire un */ \ /* entier positif), mais different evidemment de 'FAUX' et de 'VRAI'. Cela a ete introduit */ \ /* le 20180107171545... */ #define k___NEXIST \ FAUX \ /* Ce qui n'existe pas. */ \ /* */ \ /* ATTENTION : la constante 'NEXIST' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___EXIST \ NOTL(k___NEXIST) \ /* Ce qui existe. */ \ /* */ \ /* ATTENTION : la constante 'EXIST' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___INACTIF \ NEXIST \ /* Pour caracteriser ce qui est inactif, */ \ /* */ \ /* ATTENTION : la constante 'INACTIF' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___ACTIF \ EXIST \ /* Et ce qui est actif. */ \ /* */ \ /* ATTENTION : la constante 'ACTIF' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___INTERDIT \ NEXIST \ /* Pour caracteriser ce qui est interdit, */ \ /* */ \ /* ATTENTION : la constante 'INTERDIT' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___AUTORISE \ EXIST \ /* Et ce qui est autorise. */ \ /* */ \ /* ATTENTION : la constante 'AUTORISE' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___INVALIDE \ NEXIST \ /* Pour caracteriser ce qui est invalide, */ \ /* */ \ /* ATTENTION : la constante 'INVALIDE' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___VALIDE \ EXIST \ /* Et ce qui est valide. */ \ /* */ \ /* ATTENTION : la constante 'VALIDE' est pre-generee dans '$xcp/Konstantes$K'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef FAUX \ k___FAUX #TestADef VRAI \ k___VRAI #TestADef INDECIS \ k___INDECIS #TestADef NEXIST \ k___NEXIST #TestADef EXIST \ k___EXIST #TestADef INACTIF \ k___INACTIF #TestADef ACTIF \ k___ACTIF #TestADef INTERDIT \ k___INTERDIT #TestADef AUTORISE \ k___AUTORISE #TestADef INVALIDE \ k___INVALIDE #TestADef VALIDE \ k___VALIDE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T I O N S L O G I Q U E S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ #define IL_FAUT(x) \ IFEQ(x,VRAI) #define IL_NE_FAUT_PAS(x) \ IFEQ(x,FAUX) #define EST_VRAI(x) \ IFEQ(x,VRAI) #define EST_FAUX(x) \ IFEQ(x,FAUX) #define EST_INDECIS(x) \ IFEQ(x,INDECIS) #define EST_CERTAIN(x) \ IFNE(x,INDECIS) #define EST_LOGIQUE(x) \ IFOU(EST_VRAI(x),EST_FAUX(x)) #define N_EST_PAS_LOGIQUE(x) \ NOTL(EST_LOGIQUE(x)) #define PRESENT(x) \ IFEQ(x,EXIST) #define PAS_PRESENT(x) \ IFEQ(x,NEXIST) #define ABSENT(x) \ PAS_PRESENT(x) #define EST_ACTIF(x) \ IFEQ(x,ACTIF) #define EST_INACTIF(x) \ IFEQ(x,INACTIF) #define EST_AUTORISE(x) \ IFEQ(x,AUTORISE) #define EST_INTERDIT(x) \ IFEQ(x,INTERDIT) #define EST_VALIDE(x) \ IFEQ(x,VALIDE) #define EST_INVALIDE(x) \ IFEQ(x,INVALIDE) #define PAS_D_ERREUR(f) \ IFEQ(f,OK) \ /* ATTENTION : a la difference entre 'PAS_D_ERREUR' et 'PAS_D_ERRORS'... */ #define IL_Y_A_ERREUR(f) \ IFNE(f,OK) \ /* ATTENTION : a la difference entre 'IL_Y_A_ERREUR' et 'IL_Y_A_ERRORS'... */ #define PAS_D_ERRORS(f) \ IFGE(f,OK) \ /* ATTENTION : a la difference entre 'PAS_D_ERREUR' et 'PAS_D_ERRORS'... */ #define IL_Y_A_ERRORS(f) \ IFLT(f,OK) \ /* ATTENTION : a la difference entre 'IL_Y_A_ERREUR' et 'IL_Y_A_ERRORS'... */ #define PAS_DE_PROBLEMES(f) \ IFNE(f,PROBLEMES) #define IL_Y_A_PROBLEMES(f) \ IFEQ(f,PROBLEMES) #define BASE_DE_PARITE \ DEUX \ /* Introduit le 20130110104955 pour 'v $xrk/Goldbach.01$K BASE_DE_PARITE'... */ #define EST_PAIR(x) \ IFEQ(PARI(x),PARI(BASE_DE_PARITE)) #define EST_IMPAIR(x) \ IFNE(PARI(x),PARI(BASE_DE_PARITE)) #define fEST_PAIR(x) \ IZEQ(fREST(x,FLOT(BASE_DE_PARITE))) #define fEST_IMPAIR(x) \ IZNE(fREST(x,FLOT(BASE_DE_PARITE))) /* Introduits le 20110308090400 pour 'v $ximf/nombres$FON 20110308090607' afin de pouvoir */ /* tester la parite d'un nombre entier represente par un 'Float'. On notera que cela fut */ /* valide grace a 'v $xtc/fmod.02$c'. */ -define IZLT(x) \ -_-_-_- IFLT(x,ZERO) /* Test 'x' negatif strictement. */ -define IZLE(x) \ -_-_-_- IFLE(x,ZERO) /* Test 'x' negatif ou nul. */ -define IZEQ(x) \ -_-_-_- IFEQ(x,ZERO) /* Test 'x' nul. */ -define IZNE(x) \ -_-_-_- IFNE(x,ZERO) /* Test 'x' non nul. */ -define IZGE(x) \ -_-_-_- IFGE(x,ZERO) /* Test 'x' positif ou nul. */ -define IZGT(x) \ -_-_-_- IFGT(x,ZERO) /* Test 'x' positif strictement. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S D E T E S T F L O U : */ /* */ /*************************************************************************************************************************************/ #define fFAUX \ COORDONNEE_BARYCENTRIQUE_MINIMALE \ /* Valeur materialisant le 'FAUX' flou, */ #define fVRAI \ COORDONNEE_BARYCENTRIQUE_MAXIMALE \ /* Valeur materialisant le 'VRAI' flou. */ #define SEUIL_DE_LA_LOGIQUE_FLOUE \ MOYE(fFAUX,fVRAI) \ /* Les variables de la logique floue sont des variables reelles a valeur dans [0,1], */ \ /* le '0' etant le 'FAUX', et '1' etant le 'VRAI'. 'SEUIL_DE_LA_LOGIQUE_FLOUE' est la */ \ /* limite implicite entre le 'FAUX' et le 'VRAI'... */ #define fTest(conditions) \ BblockV \ Test(IFGE(conditions,SEUIL_DE_LA_LOGIQUE_FLOUE)) \ Bblock \ /* On fait preceder le "if" d'un debut de block, afin que la fin du "fTest" */ \ /* (c'est-a-dire le "EfTes") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee. On notera aussi la dissymetrie au niveau des 'Bblock'/'Eblock' entre */ \ /* 'AfTes' et 'EfTes', et ce afin de rendre obligatoire le triplet (fTest,AfTes,EfTes). */ #define AfTes \ Eblock \ ATes \ Bblock \ BblockV \ /* Alternative du 'fTest'. */ #define EfTes \ EblockV \ Eblock \ ETes \ EblockV \ /* Fin du 'fTest'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S S E C O N D A I R E S D E L A L O G I Q U E F L O U E : */ /* */ /*************************************************************************************************************************************/ #define MODULATEUR_DE_LA_LOGIQUE_FLOUE \ FU \ /* Constante materialisee par la lettre 'k' dans les formules qui suivront, et qui */ \ /* permet de "resserer" plus ou moins la zone de flou, au voisinage de la valeur reelle */ \ /* 'SEUIL_DE_LA_LOGIQUE_FLOUE'... */ #define fD(a,b) \ DIVI(SOUS(b,a) \ ,RACX(ADD2(FU,FU)) \ ) \ /* Distance signee d'un point de coordonnees (a,b) a la premiere bissectrice y=x : */ \ /* */ \ /* b - a */ \ /* d(a,b) = ------- */ \ /* --- */ \ /* \/ 2 */ \ /* */ \ /* */ \ /* y ^ */ \ /* | + */ \ /* . | + */ \ /* * point (a,b) | + y=x (premiere bissectrice) */ \ /* y > x . | + */ \ /* d > 0 . | + */ \ /* . | + */ \ /* . | + */ \ /* ----------------------.-------O----------------------------> */ \ /* . + | x */ \ /* + | */ \ /* + . | */ \ /* + . */ \ /* + | . y < x */ \ /* + | . d < 0 */ \ /* + | . */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P E R A T E U R S D E T E S T F L O U : */ /* */ /*************************************************************************************************************************************/ #define fNOTL(x) \ ADD2(fFAUX \ ,PUIX(SOUS(fVRAI,x) \ ,DIVI(LOGX(SOUS(SEUIL_DE_LA_LOGIQUE_FLOUE,fFAUX)) \ ,LOGX(SOUS(fVRAI,SEUIL_DE_LA_LOGIQUE_FLOUE)) \ ) \ ) \ ) \ /* Negation floue de 'x' : */ \ /* */ \ /* Log(S) */ \ /* ---------- */ \ /* Log(1-S) */ \ /* fNOTL(x) = (1 - x) */ \ /* */ \ /* */ \ /* fNOTL(x) ^ */ \ /* | */ \ /* 1 * */ \ /* | fNOTL(1) = 0 */ \ /* | fNOTL(S) = S */ \ /* |* fNOTL(0) = 1 */ \ /* | */ \ /* | */ \ /* | * */ \ /* | */ \ /* | * */ \ /* S |....* */ \ /* | . * */ \ /* | . * */ \ /* ------------------------------O----------------*-----------> */ \ /* | S 1 x */ \ /* */ #define fIFOU(condition_1,condition_2) \ MAX2(condition_1,condition_2) \ /* 'OU' flou, */ #define fIFET(condition_1,condition_2) \ MIN2(condition_1,condition_2) \ /* 'ET' flou. */ #define fIFEQ(x,a) \ ADD2(fFAUX \ ,MUL2(SOUS(fVRAI,fFAUX) \ ,EXPX(NEGA(MUL2(MODULATEUR_DE_LA_LOGIQUE_FLOUE \ ,EXP2(fD(x,a)) \ ) \ ) \ ) \ ) \ ) \ /* Test de 'x=a' : */ \ /* */ \ /* 2 */ \ /* -k.d(x,a) */ \ /* fIFEQ(x,a) = e */ \ /* */ \ /* */ \ /* fIFEQ(x,a) ^ */ \ /* | x = a */ \ /* | . */ \ /* | . */ \ /* |. */ \ /* 1 * */ \ /* *|* */ \ /* | */ \ /* * | * */ \ /* * | * */ \ /* * | * */ \ /* * | * */ \ /* * | * */ \ /* x # a * | * x # a */ \ /* * | * */ \ /* * * * * * | * * * * * */ \ /* ------------------------------O----------------------------> */ \ /* | d(x,a) */ \ /* */ #define fIFNE(x,a) \ fNOTL(fIFEQ(x,a)) \ /* Test de 'x#a'. */ #define fIFGE(x,a) \ ADD2(fFAUX \ ,MUL2(SOUS(fVRAI,fFAUX) \ ,DIVI(MUL2(SEUIL_DE_LA_LOGIQUE_FLOUE \ ,EXPX(NEGA(MUL2(MODULATEUR_DE_LA_LOGIQUE_FLOUE,fD(x,a)))) \ ) \ ,BARY(EXPX(NEUT(MUL2(MODULATEUR_DE_LA_LOGIQUE_FLOUE,fD(x,a)))) \ ,EXPX(NEGA(MUL2(MODULATEUR_DE_LA_LOGIQUE_FLOUE,fD(x,a)))) \ ,SEUIL_DE_LA_LOGIQUE_FLOUE \ ) \ ) \ ) \ ) \ /* Test de 'x>=a' : */ \ /* */ \ /* -k.d(x,a) */ \ /* S.e */ \ /* fIFGE(x,a) = --------------------------------- */ \ /* +k.d(x,a) -k.d(x,a) */ \ /* (1-S).e + S.e */ \ /* */ \ /* */ \ /* fIFGE(x,a) ^ */ \ /* | */ \ /* - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - */ \ /* * * * * | */ \ /* * | */ \ /* x > a * | */ \ /* * | x = a */ \ /* | . */ \ /* * | . */ \ /* |. */ \ /* S * */ \ /* | x < a */ \ /* | * */ \ /* | * * * * * * * * */ \ /* ------------------------------O----------------------------> */ \ /* | d(x,a) */ \ /* */ #define fIFGT(x,a) \ fIFGE(x,a) \ /* Test de 'x>a'. */ #define fIFLT(x,a) \ fNOTL(fIFGE(x,a)) \ /* Test de 'x<a'. */ #define fIFLE(x,a) \ fIFLT(x,a) \ /* Test de 'x<=a'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T E U R S D ' I T E R A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define DoQu(index,index_de_depart,index_d_arrivee,pas_index) \ BblockV \ DEFV(Int,INIT(pas_index_effectif,pas_index)); \ /* Introduit le 20110908103354 suite a un probleme avec 'v $xci/genere$K pas_des_images' */ \ /* dans 'v $Falias_execALBUM 20110908102935' ou le '$xci/genere$X' avait recu "pas=0"... */ \ \ Test(IZEQ(pas_index_effectif)) \ Bblock \ EGAL(pas_index_effectif,I); \ PRINT_ATTENTION("une boucle a un pas nul et une valeur par defaut est forcee pour eviter une division par 0"); \ CAL1(Prer1("(pas force pour la boucle : %d)\n",pas_index_effectif)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(NON_DIVISIBLE(bSOU(index_d_arrivee,index_de_depart) \ ,MEME_SIGNE_QUE(bSOU(index_d_arrivee,index_de_depart),pas_index_effectif) \ ) \ ) \ /* ATTENTION ; ce sont bien deux 'SOUS(...)' qu'il faut ci-dessus et non pas des 'NBRE(...)' */ \ /* car il s'agit ici d'un probleme de piquets et d'intervalles. A titre d'exemple, il est */ \ /* bien exact que l'on ne peut aller de 1 a 512 par pas de 8 (par contre un pas de 7 est */ \ /* bon...). */ \ Bblock \ Test(IL_FAUT(DoQu_____editer_le_message_d_une_possible_boucle_infinie)) \ /* Test introduit le 20120419143132... */ \ Bblock \ PRINT_ATTENTION("une boucle 'DoQu' risque de ne pas se terminer"); \ CAL1(Prer3("(depart,arrivee,pas) = (%g,%g,%g)\n" \ ,FLOT(index_de_depart),FLOT(index_d_arrivee),FLOT(pas_index_effectif) \ ) \ ); \ /* On notera l'utilisation de 'FLOT(...)' pour permettre une utilisation valide de "%g" ; on */ \ /* permet ainsi tous les types possibles pour les bornes de l'index. Malgre tout, cela est */ \ /* certainement inutile car 'DIVISIBLE(...)' utilise 'REST(...)' qui doit n'etre utilisable */ \ /* qu'avec des arguments 'Int'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Bouc(INIT(index,index_de_depart) \ ,IFOU(IFET(IFLE(index_de_depart,index_d_arrivee),IFLE(index,index_d_arrivee)) \ ,IFET(IFGT(index_de_depart,index_d_arrivee),IFGE(index,index_d_arrivee)) \ ) \ ,INCR(index,MEME_SIGNE_QUE(bSOU(index_d_arrivee,index_de_depart),pas_index_effectif)) \ ) \ /* DoQu : iteration avec ordre indifferent des bornes, le test d'arret se faisant sur une */ \ /* egalite ; il faut donc faire attention au relation entre les bornes et le pas (par */ \ /* exemple 'DoQu(n,1,7,4)' ne peut pas se terminer...). */ \ /* */ \ /* Exemple : */ \ /* */ \ /* DoQu(n,1,4,1) */ \ /* */ \ /* genere : */ \ /* */ \ /* n=(1,2,3,4) */ \ /* */ \ /* alors que : */ \ /* */ \ /* DoQu(n,4,1,1) */ \ /* */ \ /* genere : */ \ /* */ \ /* n=(4,3,2,1) */ \ /* */ \ /* ATTENTION : on fait preceder le "DoQu" d'un debut de block, afin que la fin du "for" */ \ /* (c'est-a-dire le "EDoQ") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ Bblock #define EDoQ \ Eblock \ EblockV #define DoIn(index,minimum_index,maximum_index,pas_index) \ BblockV \ Bouc(INIT(index,minimum_index),IFLE(index,maximum_index),INCR(index,pas_index)) \ /* DoIn : iteration incrementale... */ \ /* */ \ /* Exemple : */ \ /* */ \ /* DoIn(n,1,4,1) */ \ /* */ \ /* genere : */ \ /* */ \ /* n=(1,2,3,4) */ \ /* */ \ /* ATTENTION : on fait preceder le "DoIn" d'un debut de block, afin que la fin du "for" */ \ /* (c'est-a-dire le "EDoI") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ /* */ \ /* ATTENTION : a la fin de la boucle (apres le 'EDoI'), on a : */ \ /* */ \ /* index = maximum_index+pas_index si : minimum_index <= maximum_index */ \ /* index = minimum_index si : minimum_index > maximum_index */ \ /* */ \ Bblock #define EDoI \ Eblock \ EblockV #define IDoIn(index,minimum_index,maximum_index,pas_index) \ Bblock \ DEFV(Int,INIT(index,UNDEF)); \ DoIn(index,minimum_index,maximum_index,pas_index) #define EIDoI \ EDoI \ Eblock /* IDoIn : iteration incrementale avec declaration automatique de l'index de type 'Int'. */ /* Ceci fut introduit le 20060602110719... */ #define FDoIn(index,minimum_index,maximum_index,pas_index) \ Bblock \ DEFV(Float,INIT(index,FLOT__UNDEF)); \ DoIn(index,minimum_index,maximum_index,pas_index) #define EFDoI \ EDoI \ Eblock /* FDoIn : iteration incrementale avec declaration automatique de l'index de type 'Float'. */ /* Ceci fut introduit le 20060602110719... */ #define DoDe(index,minimum_index,maximum_index,pas_index) \ BblockV \ Bouc(INIT(index,maximum_index),IFGE(index,minimum_index),DECR(index,pas_index)) \ /* DoDe : iteration decrementale... */ \ /* */ \ /* Exemple : */ \ /* */ \ /* DoDe(n,1,4,1) */ \ /* */ \ /* genere : */ \ /* */ \ /* n=(4,3,2,1) */ \ /* */ \ /* ATTENTION : on fait preceder le "DoDe" d'un debut de block, afin que la fin du "for" */ \ /* (c'est-a-dire le "EDoD") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ /* */ \ /* ATTENTION : a la fin de la boucle (apres le 'EDoD'), on a : */ \ /* */ \ /* index = minimum_index-pas_index si : minimum_index <= maximum_index */ \ /* index = maximum_index si : minimum_index > maximum_index */ \ /* */ \ Bblock #define EDoD \ Eblock \ EblockV #define IDoDe(index,minimum_index,maximum_index,pas_index) \ Bblock \ DEFV(Int,INIT(index,UNDEF)); \ DoDe(index,minimum_index,maximum_index,pas_index) #define EIDoD \ EDoD \ Eblock /* IDoDe : iteration decrementale avec declaration automatique de l'index de type 'Int'. */ /* Ceci fut introduit le 20060602110719... */ #define FDoDe(index,minimum_index,maximum_index,pas_index) \ Bblock \ DEFV(Float,INIT(index,FLOT__UNDEF)); \ DoDe(index,minimum_index,maximum_index,pas_index) #define EFDoD \ EDoD \ Eblock /* FDoDe : iteration decrementale avec declaration automatique de l'index de type 'Float'. */ /* Ceci fut introduit le 20060602110719... */ #define DoVa(index,minimum_index,maximum_index,pas_index,il_faut_incrementer) \ BblockV \ Bouc(INIT(index \ ,COND(EST_VRAI(il_faut_incrementer) \ ,minimum_index \ ,maximum_index \ ) \ ) \ ,IFOU(IFET(EST_VRAI(il_faut_incrementer) \ ,IFLE(index,maximum_index) \ ) \ ,IFET(EST_FAUX(il_faut_incrementer) \ ,IFGE(index,minimum_index) \ ) \ ) \ ,INCR(index \ ,COND(EST_VRAI(il_faut_incrementer) \ ,NEUT(pas_index) \ ,NEGA(pas_index) \ ) \ ) \ ) \ /* DoVa : iteration incrementale ou decrementale ("Variable")... */ \ /* */ \ /* ATTENTION : on fait preceder le "DoVa" d'un debut de block, afin que la fin du "for" */ \ /* (c'est-a-dire le "EDoV") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ /* */ \ /* Ceci fut introduit le 20070906140106 pour 'v $xrv/polynome.01$K DoVa'... */ \ /* */ \ /* On notera qu'il est impossible d'ecrire : */ \ /* */ \ /* COND(EST_VRAI(il_faut_incrementer) */ \ /* ,INCR(index,pas_index) */ \ /* ,DECR(index,pas_index) */ \ /* ) */ \ /* */ \ /* par definition de 'Bouc(...)'. */ \ /* */ \ /* En resume, 'DoVa' equivaut a : */ \ /* */ \ /* DoIn(...) si 'EST_VRAI(il_faut_incrementer)' */ \ /* DoDe(...) si 'EST_FAUX(il_faut_incrementer)' */ \ /* */ \ Bblock #define EDoV \ Eblock \ EblockV #define IDoVa(index,minimum_index,maximum_index,pas_index,incrementer) \ Bblock \ DEFV(Int,INIT(index,UNDEF)); \ DoVa(index,minimum_index,maximum_index,pas_index,incrementer) #define EIDoV \ EDoV \ Eblock /* IDoVa : iteration "Variable" avec declaration automatique de l'index de type 'Int'. */ /* Ceci fut introduit le 20070906140106... */ #define FDoVa(index,minimum_index,maximum_index,pas_index,incrementer) \ Bblock \ DEFV(Float,INIT(index,FLOT__UNDEF)); \ DoVa(index,minimum_index,maximum_index,pas_index,incrementer) #define EFDoV \ EDoV \ Eblock /* FDoVa : iteration "Variable" avec declaration automatique de l'index de type 'Float'. */ /* Ceci fut introduit le 20070906140106... */ #if ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # define Loop \ /* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \ /* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \ /* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \ /* ('Bblock','Eblock')... */ \ Bblock \ DEFV(Logical,INIT(controleur_du_Loop,VRAI)); \ /* Variable toujours VRAI... */ \ Tant(EST_VRAI(controleur_du_Loop)) \ /* On fait preceder le "Loop" d'un debut de block, afin que la fin du "Tant" */ \ /* (c'est-a-dire le "ELoo") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! D'autre part, le compilateur de 'SYSTEME_SG4D..._IRIX_CC' */ \ /* n'accepte pas les boucles infinies (par 'for ( ; ; )') et donne un mesage : */ \ /* "uopt: Warning: xxxx: part(s) of procedure have no exit point", d'ou ce subterfuge... */ \ /* ATTENTION : on notera que ce defaut n'apparait pas sur le 'SYSTEME_NWS3000_NEWSOS_CC' */ \ /* ni sur 'SYSTEME_NWS3000_NEWSOS_2CC', ce qui est paradoxal, puisque theoriquement, il */ \ /* s'agit la du meme compilateur (d'origine 'Mips'). */ \ Bblock # define ELoo \ Eblock \ /* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \ /* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \ /* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \ /* ('Bblock','Eblock')... */ \ ETan \ Eblock #Aif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # define Loop \ BblockV \ Bouc(VIDE,EST_VRAI(VRAI),VIDE) \ /* On fait preceder le "Loop" d'un debut de block, afin que la fin du "for" */ \ /* (c'est-a-dire le "ELoo") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! La sequence 'EST_VRAI(VRAI)' est destinee a eviter l'ecriture */ \ /* 'for ( ; ; )' qui serait fatale a cause de l'adjonction d'une nouvelle commande de */ \ /* pre-processing '$xcp/redondants$X' dans '$xcc/cpp$Z'... */ \ Bblock # define ELoo \ Eblock \ EblockV #Eif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A N S M I S S I O N D ' U N B L O C D ' I N S T R U C T I O N S : */ /* */ /*************************************************************************************************************************************/ #define BLOC(block) \ block \ /* Permet de transmettre elegamment un bloc d'instructions a une macro. ATTENTION, pour une */ \ /* utilisation en tant qu'argument d'une fonction, il conviendra d'ecrire : */ \ /* */ \ /* #define fonction1(argument1,argument2,...,argumentP,...,argumentN) \ */ \ /* Bblock \ */ \ /* . \ */ \ /* . \ */ \ /* . \ */ \ /* fonction2(argument1 \ */ \ /* ,argument2 \ */ \ /* ,... \ */ \ /* ,BLOC(argumentP) <----------- \ */ \ /* ,... | \ */ \ /* ,argumentN | \ */ \ /* ); | \ */ \ /* . | \ */ \ /* . | \ */ \ /* . | \ */ \ /* BLOC(VIDE;); | \ */ \ /* . | \ */ \ /* . | \ */ \ /* . | \ */ \ /* Eblock | */ \ /* */ \ /* (ou 'argumentP' est une sequence d'instructions elle-meme argument d'appel de la */ \ /* fonction 'fonction1(...)') */ \ /* | */ \ /* ou encore : | */ \ /* | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* fonction1(argument1 | */ \ /* ,argument2 | */ \ /* ,... | */ \ /* ,BLOC(VIDE;) <-----------------------------------| */ \ /* ,... | */ \ /* ,argumentN | */ \ /* ); | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* BLOC(VIDE;); | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* | */ \ /* ou encore : | */ \ /* | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* fonction1(argument1 | */ \ /* ,argument2 | */ \ /* ,... | */ \ /* ,BLOC(instruction1; | */ \ /* ,instruction2; | */ \ /* ,...; | */ \ /* ,instructionM; | */ \ /* ) <----------------------------------------| */ \ /* ,... | */ \ /* ,argumentN | */ \ /* ); | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* */ \ /* et on notera bien l'absence de point-virgule apres 'BLOC(...)'. Par contre, lorsqu'il */ \ /* d'une sequence de code figurant dans un bloc, le point-virgule devra apparaitre : */ \ /* */ \ /* Bblock | */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* BLOC(instruction1; | */ \ /* ,instruction2; | */ \ /* ,...; | */ \ /* ,instructionM; | */ \ /* ); <-------------------------------------------------| */ \ /* . | */ \ /* . | */ \ /* . | */ \ /* Eblock | */ \ /* | */ \ /* et encore : | */ \ /* */ \ /* #define fonction1(argument1,argument2,...,argumentP,...,argumentN) \ */ \ /* Bblock \ */ \ /* . | \ */ \ /* . | \ */ \ /* . | \ */ \ /* BLOC(argumentP); <-------------------- \ */ \ /* . \ */ \ /* . \ */ \ /* . \ */ \ /* Eblock */ \ /* */ \ /* (ou 'argumentP' est une sequence d'instructions elle-meme argument d'appel de la */ \ /* fonction 'fonction1(...)') */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A R I A N T E P L U S G E N E R A L E D E " C A S E " A V E C V A R I A B L E S : */ /* */ /*************************************************************************************************************************************/ #define gCHoi(expression_de_CHoi,valeur_initiale,pas_d_incrementation) \ BblockV \ BblockV \ /* On fait preceder le "CHoi" de deux debuts de block, afin que la fin du "CHoi" */ \ /* (c'est-a-dire le "ECHo") et la presence du traitement par default (c'est-a-dire */ \ /* 'DEfo') puissent etre detectes par le compilateur ; en effet, s'il s'agissait */ \ /* d'une instruction vide, son absence ne serait pas diagnostiquee !!! */ \ Bblock \ DEFV(Float,INIT(expression_cherchee,FLOT(expression_de_CHoi))); \ /* Creation d'une variable locale (incluant les 'Int' et les 'Float') destinee a memoriser */ \ /* pour les differents 'CAse' la valeur recherchee. */ \ DEFV(Logical,INIT(on_a_trouve_l_expression_cherchee,FAUX)); \ /* Afin de savoir si un 'CAse' a ete "positif"... */ \ DEFV(Int,INIT(CAse_courant_SEQUENTIEL,valeur_initiale)); \ DEFV(Int,INIT(pas_des_CAse_SEQUENTIEL,pas_d_incrementation)); \ /* Pour indexer sequentiellement les 'CAse' lors d'une utilisation sequentielle (a ce */ \ /* propos 'v $xcp/substitue.01$K gCHoi'). */ #define CHoi(expression_de_CHoi) \ gCHoi(expression_de_CHoi,ZERO,I) \ /* On notera que les valeurs 'ZERO' et 'I' sont inutiles et donc arbitraires... */ #define CAse(expression_de_CAse) \ Test(IFET(EST_FAUX(on_a_trouve_l_expression_cherchee) \ ,IFEQ(expression_cherchee,FLOT(expression_de_CAse)) \ ) \ ) \ Bblock \ /* Traitement du cas courant, */ #define ECAs \ EGAL(on_a_trouve_l_expression_cherchee,VRAI); \ /* Ainsi, on sait que la recherche est terminee (les autres 'CAse' seront sautes). */ \ Eblock \ ATes \ Bblock \ INCR(CAse_courant_SEQUENTIEL,pas_des_CAse_SEQUENTIEL); \ /* Au cas ou l'on serait dans un 'gCHoi(...)'... */ \ Eblock \ ETes \ /* Fin de traitement du cas courant. */ #define CAge(expression_test) \ Test(IFET(EST_FAUX(on_a_trouve_l_expression_cherchee) \ ,expression_test \ ) \ ) \ Bblock #define ECAg \ ECAs \ /* Traitement General du cas courant (introduit le 20241126101752)... */ #define CA1e(c1) \ CAge(IFEQ(expression_cherchee,FLOT(c1)) \ ) #define ECA1 \ ECAg \ /* Traitement de 01 cas courant (introduit le 20220404154702). */ #define CA2e(c1,c2) \ CAge(IFOU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ) \ ) #define ECA2 \ ECAg \ /* Traitement de 02 cas courant (introduit le 20220404154702). */ #define CA3e(c1,c2,c3) \ CAge(I3OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ) \ ) #define ECA3 \ ECAg \ /* Traitement de 03 cas courant (introduit le 20220404154702). */ #define CA4e(c1,c2,c3,c4) \ CAge(I4OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ) \ ) #define ECA4 \ ECAg \ /* Traitement de 04 cas courant (introduit le 20220404154702). */ #define CA5e(c1,c2,c3,c4,c5) \ CAge(I5OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ,IFEQ(expression_cherchee,FLOT(c5)) \ ) \ ) #define ECA5 \ ECAg \ /* Traitement de 05 cas courant (introduit le 20220404154702). */ #define CA6e(c1,c2,c3,c4,c5,c6) \ CAge(I6OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ,IFEQ(expression_cherchee,FLOT(c5)) \ ,IFEQ(expression_cherchee,FLOT(c6)) \ ) \ ) #define ECA6 \ ECAg \ /* Traitement de 06 cas courant (introduit le 20220404165910). */ #define CA7e(c1,c2,c3,c4,c5,c6,c7) \ CAge(I7OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ,IFEQ(expression_cherchee,FLOT(c5)) \ ,IFEQ(expression_cherchee,FLOT(c6)) \ ,IFEQ(expression_cherchee,FLOT(c7)) \ ) \ ) #define ECA7 \ ECAg \ /* Traitement de 07 cas courant (introduit le 20220404165910). */ #define CA8e(c1,c2,c3,c4,c5,c6,c7,c8) \ CAge(I8OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ,IFEQ(expression_cherchee,FLOT(c5)) \ ,IFEQ(expression_cherchee,FLOT(c6)) \ ,IFEQ(expression_cherchee,FLOT(c7)) \ ,IFEQ(expression_cherchee,FLOT(c8)) \ ) \ ) #define ECA8 \ ECAg \ /* Traitement de 08 cas courant (introduit le 20220404165910). */ #define CA9e(c1,c2,c3,c4,c5,c6,c7,c8,c9) \ CAge(I9OU(IFEQ(expression_cherchee,FLOT(c1)) \ ,IFEQ(expression_cherchee,FLOT(c2)) \ ,IFEQ(expression_cherchee,FLOT(c3)) \ ,IFEQ(expression_cherchee,FLOT(c4)) \ ,IFEQ(expression_cherchee,FLOT(c5)) \ ,IFEQ(expression_cherchee,FLOT(c6)) \ ,IFEQ(expression_cherchee,FLOT(c7)) \ ,IFEQ(expression_cherchee,FLOT(c8)) \ ,IFEQ(expression_cherchee,FLOT(c9)) \ ) \ ) #define ECA9 \ ECAg \ /* Traitement de 09 cas courant (introduit le 20220404165910). */ #define CAse_SEQUENTIEL \ CAse(CAse_courant_SEQUENTIEL) #define ECAs_SEQUENTIEL \ ECAs #define DEfo \ Test(EST_FAUX(on_a_trouve_l_expression_cherchee)) \ Bblock \ /* Traitement du cas par defaut, */ #define EDEf \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EblockV \ /* Fin de traitement du cas par defaut. */ #define EgCHo \ EblockV \ /* Fin de l'instruction 'gCHoi'. */ #define ECHo \ EgCHo \ /* Fin de l'instruction 'CHoi'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S U I T E D E T E S T S D O N T S E U L L E P R E M I E R V R A I E S T P R I S E N C O M P T E : */ /* */ /*************************************************************************************************************************************/ /* Ce qui suit a ete introduit le 20161128143705 afin de permettre la definition d'une */ /* suite de tests dits "Uniques" dont l'un seulement (le premier rencontre avec une */ /* certaine condition VRAIe) s'executera... */ #define TestU \ BblockV \ BblockV \ /* On fait preceder le "TestU" de deux debuts de block, afin que la fin du "TestU" */ \ /* (c'est-a-dire le "ETestU") et la presence du traitement par default (c'est-a-dire */ \ /* 'UDEfo') puissent etre detectes par le compilateur ; en effet, s'il s'agissait */ \ /* d'une instruction vide, son absence ne serait pas diagnostiquee !!! */ \ Bblock \ DEFV(Logical,INIT(on_a_trouve_la_condition_cherchee,FAUX)); \ /* Afin de savoir si un 'CAse' a ete "positif"... */ #define UCAse(condition) \ Test(IFET(EST_FAUX(on_a_trouve_la_condition_cherchee) \ ,EST_VRAI(condition) \ ) \ ) \ Bblock \ /* Traitement du cas courant, */ #define EUCAs \ EGAL(on_a_trouve_la_condition_cherchee,VRAI); \ /* Ainsi, on sait que la recherche est terminee (les autres 'UCAse' seront sautes). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* Fin de traitement du cas courant. */ #define UDEfo \ Test(EST_FAUX(on_a_trouve_la_condition_cherchee)) \ Bblock \ /* Traitement du cas par defaut, */ #define EUDEf \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EblockV \ /* Fin de traitement du cas par defaut. */ #define ETestU \ EblockV \ /* Fin de l'instruction 'TestU'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T R U C T E U R S D ' I T E R A T I O N S : */ /* */ /*************************************************************************************************************************************/ #define PREMIERE_ITERATION_D_UN_Komp \ UN \ /* Numero de le premiere iteration d'un 'Komp(...)'. */ #define Komp(compteur_des_repetitions_du_Komp,nombre_de_repetitions) \ Bblock \ /* ATTENTION : 'Bblock' et non pas 'BblockV', et ce a cause du compteur local defini apres. */ \ DEFV(Int,INIT(nombre_de_repetitions_du_Komp,nombre_de_repetitions)); \ /* Variable introduite pour 'v $xig/fonct$vv$FON nombre_de_repetitions_du_Komp' le */ \ /* 20210401165114... */ \ DEFV(Int,INIT(compteur_des_repetitions_du_Komp,UNDEF)); \ /* Cette variable locale va servir d'indice pour la boucle 'DoIn' qui suit, mais */ \ /* ATTENTION : elle ne peut etre un 'Positive' au cas ou un nombre de repetitions */ \ /* negatif serait communique... */ \ DoIn(compteur_des_repetitions_du_Komp,PREMIERE_ITERATION_D_UN_Komp,nombre_de_repetitions_du_Komp,I) \ /* On fait debuter le "Komp" par un debut de block ('Bblock'), afin que la fin de la */ \ /* boucle (c'est-a-dire le "EKom") puisse etre validee par le compilateur ; en effet, */ \ /* s'il s'agissait d'une instruction vide, son absence ne serait pas diagnostiquee !!! */ \ Bblock #define EKom \ Eblock \ EDoI \ Eblock #define PREMIERE_ITERATION_D_UN_Repe \ PREMIERE_ITERATION_D_UN_Komp \ /* Numero de le premiere iteration d'un 'Repe(...)'. */ #define nombre_de_repetitions_du_Repe \ nombre_de_repetitions_du_Komp \ /* Nombre de repetitions d'un 'Repe(...)' (introduit le 20210401171123 pour etre utilise */ \ /* dans 'v $xig/fonct$vv$FON 20210401144342')... */ #define Repe(nombre_de_repetitions) \ BblockV \ Komp(compteur_des_repetitions_du_Repe,nombre_de_repetitions) \ /* On fait preceder le "Repe" d'un debut de block, afin que la fin de la boucle */ \ /* (c'est-a-dire le "ERep") puisse etre valide par le compilateur ; en */ \ /* effet, s'il s'agissait d'une instruction vide, son absence ne serait */ \ /* pas diagnostiquee !!! */ \ Bblock #define ERep \ Eblock \ EKom \ EblockV /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E Q U E N C E S P R O V I S O I R E M E N T I N C O M P L E T E S */ /* E T C E A F I N D E F A C I L I T E R L E " P R O T O T Y P A G E " : */ /* */ /*************************************************************************************************************************************/ #define SEQUENCE_INCOMPLETE(message) \ Bblock \ BLOC(VIDE;); \ /* Il n'y a donc a priori aucune instruction... */ \ PRINT_MESSAGE("sequence incomplete",message); \ Eblock \ /* Definition d'une sequence incomplete, et edition d'un message si 'message' n'est pas */ \ /* le message VIDE... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S T R U C T U R E S D E C O N T R O L E D ' U N M O D E " D E B U G " : */ /* */ /*************************************************************************************************************************************/ #ifdef MODE_DEBUG # define DEBU(block) \ block \ /* Permet de faire la compilation conditionnelle, suivant que 'DEBU' ne */ \ /* fait rien, ou equivaut a 'block' (comme 'BLOC')... */ \ /* */ \ /* ATTENTION, ne pas mettre de point-virgule ou autre parce que l'on ne sait pas dans quel */ \ /* contexte 'DEBU(...)' va etre utilise, et donc ne pas ecrire en particulier : */ \ /* */ \ /* BLOC(block); */ \ /* */ #Aifdef MODE_DEBUG # define DEBU(block) \ VIDE \ /* Permet de faire la compilation conditionnelle, suivant que 'DEBU' ne */ \ /* fait rien, ou equivaut a 'block' (comme 'BLOC')... */ \ /* */ \ /* ATTENTION, ne pas mettre de point-virgule ou autre parce que l'on ne sait pas dans quel */ \ /* contexte 'DEBU(...)' va etre utilise, et donc, en particulier, ne pas definir 'DEBU(...)' */ \ /* par : */ \ /* */ \ /* BLOC(VIDE;); */ \ /* */ #Eifdef MODE_DEBUG #define DBOF(block) \ /* Permet de ne pas compiler un module (s'utilise en "bascule" avec 'DBON')... */ #define DBON(block) \ block \ /* Permet de compiler un module (s'utilise en "bascule" avec 'DBOF')... */ \ /* */ \ /* ATTENTION, ne pas mettre de point-virgule ou autre parce que l'on ne sait pas dans quel */ \ /* contexte 'DEBU(...)' va etre utilise... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O B J E T S A N E P A S E X T E R I O R I S E R : */ /* */ /*************************************************************************************************************************************/ TypedefT(Local,Static) /* Ce mot clef doit etre mis devant les "objets" locaux a un fichier (structures, fonctions, */ /* donnees diverses...). */ /* */ /* ATTENTION, l'utilisation de 'Local' est dangereux a l'interieur d'une boucle, au cas */ /* ou la variable definie est simultanement initialisee. En effet, cette initialisation */ /* n'aura lieu qu'une seule fois ('v $xrk/rdn_walk.52$K 19991116105451'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O B J E T S A E X T E R I O R I S E R : */ /* */ /*************************************************************************************************************************************/ TypedefP(Common,VIDE) /* Ce mot clef vide devra etre mis devant tous les objets (donnees, */ /* structures, fonctions,...) dont la portee est superieure au */ /* fichier courant ; mais ATTENTION, c'est la chaine "Common " (c'est-a-dire */ /* le mot "Common" suivi d'un "ESPACE" qui est recherche, et ce afin de pouvoir */ /* l'utiliser dans un commentaire, par exemple sous la forme "Common" ou */ /* 'Common' (donc entre apostrophes). En general, on trouvera "Common " en */ /* tete de ligne (tel "^Common int..."), ou en milieu de ligne a l'interieur */ /* d'un commentaire (tel dans un "#define ...). */ TypedefP(LoF,VIDE) /* Introduit le 20170117140001 pour, par exemple, 'v $xci/valeurs_Hilbert2D$K LoF' */ /* ces fichiers eux-memes en ayant besoin pour 'v $xi/DICO_Fonction$Z LoF'. */ /* */ /* L'usage de 'Local' (a la place de 'LoF' donnait lors de la compilation du fichier */ /* 'v $xci/valeurs_Hilbert2D$K LoF' le message d'erreur suivant : */ /* */ /* error: static declaration of 'GenerationDeLaCourbeDeHilbert_L' */ /* follows non-static declaration */ /* */ /* C'est cela qui a rendu necessaire la definition de 'SuperLocal' (le nom peut paraitre */ /* "curieux", mais je n'ai rien trouve de mieux a cette date...). */ /* */ /* Le 20170124114631, il a fallu remplacer le 'SuperLocal' du 20170117140001 par quelque */ /* chose de plus court ('LoF' pour "LOcal Fovction") afin que les appels a */ /* 'GENERE__Fonction__OPT(...)' tiennent tous sur une seule ligne afin que des espaces */ /* ne s'introduisent pas dans la liste des arguments d'appel... */ /* */ /* En fait, le probleme venait de 'v $xrq/particle.M1$I 20170124134356', donc le changement */ /* de 'SuperLocal' en 'LoF' n'etait pas utile... */ #define PARENTHESES_DES_FONCTIONS \ /* Ce mot clef vide est utilise pour la generation des fichiers ".ext" pour le traitement */ \ /* des 'GENERE__FonctionI_GRAPHIQUES'... */ TypedefAES(Ailleurs,___Extern E___ <><> ) /* Ce mot clef doit etre mis devant toutes les definitions des objets externes a un module. */ /* On notera la syntaxe tres particuliere 'Extern E___ <><> ' destinee a obtenir la */ /* concatenation du prefixe 'E___' des modules "personnels" mais definis ailleurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' O P E R A T E U R S D I T S " S I G N E S " : */ /* */ /*************************************************************************************************************************************/ #define SOPER(operateur,variable,translation) \ MEME_SIGNE_QUE(variable,operateur(ADD2(ABSO(variable),translation))) #define fSOPER(operateur,variable,translation) \ MEME_SIGNE_QUE(variable,operateur(ADD2(fABSO(variable),translation))) /* Introduit le 20160616181059 pour definir d'une facon generale des operateurs tels */ /* 'SRACX(...)' ou encore 'SLOGX(...)'... */ /* */ /* Le 20160617153646 fut introduit 'fSOPER(...)' utilisant 'fABSO(...)' de facon a */ /* accelerer les compilations correspondantes. Evidemment, cela implique une utilisation */ /* avec des variables de type 'Float', mais ce n'est pas limitatif puisque cela n'est */ /* utilise que dans des procedures du type 'SRACX(...)' ou encore 'SLOGX(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S " V I S I B L E S " D E S F O N C T I O N S M A T H E M A T I Q U E S */ /* N E P O S A N T P A S D E P R O B L E M E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, bien noter la difference entre les definitions : */ /* */ /* #define FONCTION(...) \ */ /* DEFINITION(...) \ */ /* */ /* qui correspondent a des fonctions dont la derivee va etre definie explicitement */ /* ci-apres, et les definitions : */ /* */ /* -define FONCTION(...) \ */ /* -_-_-_- DEFINITION(...) */ /* */ /* qui correspondent a des fonctions dont la derivee va etre calculee formellement a */ /* l'aide des regles deja enregistrees... */ #define EXPn(x,p) \ x_a_la_puissance_p(FLOT(x),INTE(p)) \ /* Fonction 'exponentielle entiere' (introduite le 20100602090456). */ #define FACT(x) \ factorielle_non_recursive(INTE(x)) \ /* Fonction 'factorielle'. Deux possibilites sont disponibles : */ \ /* */ \ /* #define FACT(x) \ */ \ /* FLOT(factorielle_recursive(INTE(x))) */ \ /* */ \ /* et : */ \ /* */ \ /* #define FACT(x) \ */ \ /* factorielle_non_recursive(INTE(x)) */ \ /* */ \ /* la premiere etant plus elegante, alors que la seconde est plus rapide. ATTENTION, on */ \ /* notera bien que dans les deux cas, le resultat est de type 'Float', alors que la premiere */ \ /* fonction est de type 'Int', alors que la seconde est de type 'Float'. Dans les deux cas, */ \ /* au dela de 12, le resultat est faux dans le premier cas, et approxime dans le second... */ #define RACX(x) \ RACD(x) \ /* Fonction 'racine carree'. Des tests montrent que le rapport entre les temps d'execution */ \ /* de 'RACX(...)' et 'EXP2(...)' est legerement inferieur a 3 et 5 sur '$LACT29' et sur */ \ /* '$LACT27' respectivement. */ #define RACO(x) \ RACX(ABSO(x)) \ /* Fonction 'racine carree de la valeur absOlue' (introduite le 20220130102415)... */ #define SRACX(x) \ SOPER(RACX,x,FZERO) \ /* Fonction 'racine carree de x' "Signee" : */ \ /* */ \ /* __ */ \ /* x>0 : SRACX(x,y) = \/x */ \ /* */ \ /* ____ */ \ /* x<0 : SRACX(x,y) = -\/|x| */ \ /* */ \ /* Ceci a ete introduit le 20150407092509... */ \ /* */ \ /* L'introduction de 'fOPIR0n(...)' a permis de remettre 'SOPER(...)' plutot que */ \ /* 'fSOPER(...)' le 20160618111504, ce qui est plus general... */ #if ( (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # TestADef BUG_SYSTEME_SGIND_C_log \ /* La fonction 'log(...)' fait une division par 0 lorsque son argument est nul (voir */ \ /* 'v $Dbugs/SGIND424$D/IRIX$D/CC$D/log.01$c')... */ #Aif ( (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) #Eif ( (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) #define EXPONENTIELLE_DE_0 \ EXPX(FZERO) \ /* Exponentielle de 0 (introduit le 20220522165734)... */ #define LOGX(x) \ LOGD(x) \ /* Fonction 'logarithme neperien'. */ #define LOGO(x) \ LOGX(ADD2(ABSO(x),EXPONENTIELLE_DE_0)) \ /* Fonction 'logarithme de valeur absOlue de 'x' (introduite le 20220130102415)... */ #define SLOGX(x) \ SOPER(LOGX,x,EXPONENTIELLE_DE_0) \ /* Fonction 'logarithme de x' "Signee" : */ \ /* */ \ /* x>0 : SLOGX(x) = log(x+1) */ \ /* */ \ /* x<0 : SLOGX(x) = -log(|x|+1) */ \ /* */ \ /* On notera donc que cette fonction conserve d'une part le 0 et d'autre part le signe : */ \ /* */ \ /* SLOGX(0) = 0 */ \ /* */ \ /* Signe(x) = Signe(SLOGX(x)) */ \ /* */ \ /* SLOGX(-x) = -SLOGX(x) */ \ /* */ \ /* Ceci a ete introduit le 20150407092509 et modifie le 20150407115843 en introduisant le */ \ /* "+1" afin d'eviter le probleme de 'log(0)'... */ \ /* */ \ /* Le 20160609083413 je mets en evidence le fait que 'LOGX(...)' et 'EXPX(...)' sont deux */ \ /* fonctions inverses l'une de l'autre... */ \ /* */ \ /* L'introduction de 'fOPIR0n(...)' a permis de remettre 'SOPER(...)' plutot que */ \ /* 'fSOPER(...)' le 20160618111504, ce qui est plus general... */ #define LOGXfs(x,traiter_les_valeurs_negatives) \ COND(IL_NE_FAUT_PAS(traiter_les_valeurs_negatives) \ ,LOGX(x) \ ,bMUL(SIGN(x),LOGX(ABSO(x))) \ ) \ /* Fonction 'logarithme neperien' dite "Faussement Signee" (introduite le 20121022095146). */ \ /* */ \ /* On notera que si 'IL_NE_FAUT_PAS(traiter_les_valeurs_negatives)', alors un 'x' negatif */ \ /* peut donner la valeur : */ \ /* */ \ /* nan */ \ /* */ \ /* On pourrait evidemment utiliser 'LOGX(ABSO(x))' plutot que 'LOGX(x)', mais c'est une */ \ /* erreur que d'utiliser un 'x' negatif ; il faut donc que cela apparaisse... */ #if ( (defined(BUG_SYSTEME_SGIND_C_log)) \ ) # undef LOGX # define LOGX(x) \ COND(IZNE(x),LOGD(x),F_MOINS_L_INFINI) \ /* Fonction 'logarithme neperien'. ATTENTION, on notera que l'on ne prend en compte que */ \ /* l'erreur 'x=0' ; pour les valeurs negatives de 'x' on laisse ce soin a l a fonction */ \ /* logarithme elle-meme. Ceci a ete rendu necessaire pour eviter une division par 0... */ #Aif ( (defined(BUG_SYSTEME_SGIND_C_log)) \ ) #Eif ( (defined(BUG_SYSTEME_SGIND_C_log)) \ ) -define LOIN(x) \ -_-_-_- DIVI(x,LOGX(x)) /* Approximation du LOgarithme INtegral (introduit le 20171030111459) : */ /* */ /* /x */ /* | */ /* | 1 x */ /* li(x) = | -------dt ~ ------- (avec x # 1) */ /* | ln(t) ln(x) */ /* | */ /* /0 */ /* */ /* qui donne a la limite (x --> infini) le nombre de nombres premiers inferieurs ou */ /* egaux a 'x'... */ -define LObX(x,b) \ -_-_-_- DIVI(LOGX(x),LOGX(b)) /* Fonction 'logarithme base b'. */ -define LO2X(x) \ -_-_-_- LObX(x,FBASE2) /* Fonction 'logarithme base 2'. */ #define EST_UNE_PUISSANCE_DE_2(x) \ EST_ENTIER(LO2X(x)) \ /* Le nombre 'x' est-il une puissance de 2 (introduit le 20060313100414) ? */ #if ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ ) # TestADef BUG_SYSTEME_SGIND_C_log10 \ /* La fonction 'log10(...)' peut renvoyer en certaines circonstances le logarithme neperien */ \ /* de son argument (voir 'v $Dbugs/SGIND424$D/IRIX$D/CC$D/log10.02$c'). */ #Aif ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ ) #Eif ( ((defined(SYSTEME_SGIND308_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && ((nSYSTEM_RELEASE >= 500000000) && (nSYSTEM_RELEASE < 502000000))) \ ) #define LO1X(x) \ LO1D(x) \ /* Fonction 'logarithme decimal'. */ #if ( (defined(BUG_SYSTEME_SGIND_C_log10)) \ ) # undef LO1X # define LO1X(x) \ LObX(x,FBASE10) \ /* Fonction 'logarithme decimal'. On notera que l'option '-O2' de compilation est aussi */ \ /* une facon d'eviter le probleme (voir 'v $Fcompilers'). */ #Aif ( (defined(BUG_SYSTEME_SGIND_C_log10)) \ ) #Eif ( (defined(BUG_SYSTEME_SGIND_C_log10)) \ ) #define PUIX(x,y) \ COND(IFET(IZEQ(x),IZEQ(y)),FU,PUID(x,y)) \ /* Fonction 'x a la puissance y'. */ \ /* */ \ /* ATTENTION, jusqu'au 1994120800, la definition suivante etait utilise : */ \ /* */ \ /* #define PUIX(x,y) \ */ \ /* PUID(x,y) */ \ /* */ \ /* J'ai malheureusement trouve le probleme suivant : sur 'SYSTEME_HP???_HPUX_CC' la */ \ /* valeur : */ \ /* */ \ /* 0 */ \ /* 0 */ \ /* */ \ /* ne vaut pas 1 (par continuite), mais 'NaN', et donne simultanement le message : */ \ /* */ \ /* pow: DOMAIN error */ \ /* */ \ /* Or a cause des problemes de derivation formelle, la definition de 'PUIX(...)' ne peut */ \ /* etre rendue conditionnelle ; c'est pourquoi elle prend cette nouvelle forme sur tous */ \ /* les SYSTEMEs... */ #define SPUIX(x,y) \ MEME_SIGNE_QUE(x \ ,COND(IFET(IZEQ(x),IZLT(y)) \ ,MEME_SIGNE_QUE(y,F_INFINI) \ ,PUIX(ABSO(x),y) \ ) \ ) \ /* Fonction 'x a la puissance y' etendue et "Signee" : */ \ /* */ \ /* y */ \ /* x>0 : SPUIX(x,y) = x */ \ /* */ \ /* */ \ /* x=0, y<0 : SPUIX(x,y) = +/-infini (valeur infinie introduite */ \ /* le 20080104162535 a cause de */ \ /* 'v $xig/fonct$vv$DEF SPUIX') */ \ /* y */ \ /* x<0 : SPUIX(x,y) = -|x| */ \ /* */ \ /* Ceci a ete introduit le 20030510184549 pour 'v $xiii/di_image$FON Fpolynomial_Fermat'. */ \ /* */ \ /* Le 20080104152848 le nom 'sPUIX(...)' a ete change en 'SPUIX(...)' par soucis */ \ /* d'homogeneite dans 'v $xig/fonct$vv$DEF GENERE__FonctionF_UNI2_02' (tous les noms de */ \ /* procedures {ADD2,SOUS,...} commencant par une majuscule...). */ #define PUIXfs(x,y,traiter_les_valeurs_negatives) \ COND(IL_NE_FAUT_PAS(traiter_les_valeurs_negatives) \ ,PUIX(x,y) \ ,bMUL(SIGN(x),PUIX(ABSO(x),y)) \ ) \ /* Fonction 'x a la puissance y' dite "Faussement Signee" (introduite le 20121022095146 */ \ /* par symetrie avec 'v $xil/defi_K2$vv$DEF LOGXfs'...). */ \ /* */ \ /* On notera que si 'IL_NE_FAUT_PAS(traiter_les_valeurs_negatives)', alors un 'x' negatif */ \ /* peut donner la valeur : */ \ /* */ \ /* nan */ \ /* */ \ /* Ici, contrairement a 'LOGXfs(...)', on ne pourrait pas utiliser 'PUIX(ABSO(x),y)' */ \ /* puisque certaines valeurs de l'exposant 'y' autorisent ses valeurs negatives de 'x'... */ #define MONX(x,n) \ COND(IFET(IZEQ(x),IZEQ(n)),FU,MOND(x,n)) \ /* Fonction 'x a la puissance n'. Cette fonction en apparence inutile a ete introduite pour */ \ /* permettre de definir sa derivee. En effet, on verra lors de la definition de la derivee */ \ /* de la fonction 'PUIX(...)' que se pose un probleme delicat lorsque 'x' est negatif */ \ /* puisque l'on prend son logarithme. Pour resoudre partiellement ce probleme, on fait donc */ \ /* un cas particulier de celui ou 'y' est un nombre entier 'n', puisqu'alors il est possible */ \ /* de calculer sa derivee formelle sans passer par la derivee logarithmique... */ \ /* D'autre part, on notera que l'on ne definit pas 'MONX(...)' par : */ \ /* */ \ /* #define MONX(x,n) \ */ \ /* PUID(x,n) */ \ /* */ \ /* ce qu'explique le commentaire relatif a 'MOND(...)' dans '$xil/defi_c1$vv$DEF' */ \ /* */ \ /* ATTENTION, jusqu'au 1994120800, la definition suivante etait utilise : */ \ /* */ \ /* #define MONX(x,y) \ */ \ /* MOND(x,y) */ \ /* */ \ /* J'ai malheureusement trouve le probleme suivant : sur 'SYSTEME_HP???_HPUX_CC' la */ \ /* valeur : */ \ /* */ \ /* 0 */ \ /* 0 */ \ /* */ \ /* ne vaut pas 1 (par continuite), mais 'NaN', et donne simultanement le message : */ \ /* */ \ /* pow: DOMAIN error */ \ /* */ \ /* Or a cause des problemes de derivation formelle, la definition de 'MONX(...)' ne peut */ \ /* etre rendue conditionnelle ; c'est pourquoi elle prend cette nouvelle forme sur tous */ \ /* les SYSTEMEs... */ #define EXPX(x) \ EXPD(x) \ /* Fonction 'exponentielle'. */ #define COSX(x) \ COSD(x) \ /* Fonction 'cosinus' circulaire dans [-1,+1], */ #define COS1(cosinus_de_x) \ NORM(cosinus_de_x,COSINUS_DE_PI,COSINUS_DE_0) \ /* Mise d'une fonction 'cosinus' circulaire dans [0,+1]. */ #define SECX(x) \ fINVZ(COSX(x)) \ /* Fonction 'secante' circulaire (introduite le 20070727103657). */ #define SINX(x) \ SIND(x) \ /* Fonction 'sinus' circulaire dans [-1,+1], */ #define SIN1(sinus_de_x) \ NORM(sinus_de_x,SINUS_DE_3_PI_SUR_2,SINUS_DE_PI_SUR_2) \ /* Mise d'une fonction 'sinus' circulaire dans [0,+1]. */ #define CSEX(x) \ fINVZ(SINX(x)) \ /* Fonction 'cosecante' circulaire (introduite le 20070727103657). */ #if ( (defined(BUG_SYSTEME_SG_C_sin)) \ ) # undef SINX # define SINX(x) \ COND(IFNE(ABSO(COSX(x)),COSX(FZERO)),SIND(x),SIND(FZERO)) \ /* Fonction 'sinus' circulaire, */ #Aif ( (defined(BUG_SYSTEME_SG_C_sin)) \ ) #Eif ( (defined(BUG_SYSTEME_SG_C_sin)) \ ) -define SICX(u) \ -_-_-_- COND(IZNE(u),DIVI(SINX(MUL2(PI,u)),MUL2(PI,u)),FU) /* Fonction 'sinc' definie comme suit. Soit R(x) la fonction suivante : */ /* */ /* R(x) ^ */ /* | */ /* 1| */ /* * * *|* * * */ /* * | * */ /* * | * */ /* * | * */ /* * | * */ /* -*-*-*-*-*-*-*-*----+----*-*-*-*-*-*-*-*> */ /* 1 | 1 x */ /* - --- | + --- */ /* 2 | 2 */ /* | */ /* */ /* 'R(x)' definit donc un creneau unite. Sa transformee de Fourier est 'sinc(u)', soit : */ /* */ /* / +oo */ /* | */ /* sin(pi.u) | -2.i.pi.u.x */ /* sinc(u) = ----------- = | R(x).e dx */ /* pi.u | */ /* | */ /* / -oo */ /* */ /* le nom 'sinc' signifiant apparemment 'SINus Cardinal'... */ -define SINC(x) \ -_-_-_- COND(IZNE(x),DIVI(SINX(x),x),FU) /* Fonction 'sinc' (introduite le 20230204101019 pour 'v $ximcd/operator$FON SINC') ou */ /* notera la disparition de 'PI' qui figurait dans 'SICX(...)'... */ -define TANX(x) \ -_-_-_- fDIVZ(SINX(x),COSX(x)) /* Fonction 'tangente' circulaire. On notera que la 'tangente' est definie par le rapport */ /* du 'sinus' au 'cosinus', et non pas en referencant une fonction de bibliotheque, afin de */ /* pouvoir en calculer la derivee formelle... */ -define CTGX(x) \ -_-_-_- fDIVZ(COSX(x),SINX(x)) /* Fonction 'cotangente' circulaire (introduite le 20070713185306)... */ /* */ /* On notera que l'on ne la definit pas par : */ /* */ /* 1 */ /* cotg(theta) = ----------- */ /* tg(theta) */ /* */ /* afin d'alleger l'ecriture et simplifier la gestion du cas ou 'SINX(x)' est nul... */ -define PI_SUR_2 \ -_-_-_- fMOIT(PI) /* Valeur en radians d'un quart du cercle trigonometrique. On notera le passage de la */ /* fonction 'MOIT(...)' a 'fMOIT(...)' suite a l'introduction du nouveau programme */ /* 'v $xrs/cube.11$I PI_SUR_2' et de problemes de derivation formelle de 'FRAn(...)' */ /* via 'DIVn(...)'. */ -define PI_SUR_3 \ -_-_-_- fTIER(PI) /* Valeur en radians d'un sixieme du cercle trigonometrique. Ceci fut introduit le */ /* 20070213092213 pour 'v $xiii/di_album$FON PI_SUR_3'... */ -define PI_SUR_4 \ -_-_-_- fQUAR(PI) /* Valeur en radians d'un huitieme du cercle trigonometrique. On notera le passage de la */ /* fonction 'QUAR(...)' a 'fQUAR(...)' suite a l'introduction du nouveau programme */ /* 'v $xrs/cube.11$I PI_SUR_4' et de problemes de derivation formelle de 'FRAn(...)' */ /* via 'DIVn(...)'. */ -define PI_SUR_5 \ -_-_-_- fFRAn(PI,CINQ) -define PI_SUR_6 \ -_-_-_- fFRAn(PI,SIX) -define PI_SUR_7 \ -_-_-_- fFRAn(PI,SEPT) -define PI_SUR_8 \ -_-_-_- fFRAn(PI,HUIT) -define PI_SUR_9 \ -_-_-_- fFRAn(PI,NEUF) -define PI_SUR_10 \ -_-_-_- fFRAn(PI,DIX) -define PI_SUR_11 \ -_-_-_- fFRAn(PI,ONZE) -define PI_SUR_12 \ -_-_-_- fFRAn(PI,DOUZE) /* Definitions introduites le 20230722115035... */ #define RAYON_DU_CERCLE_TRIGONOMETRIQUE \ FU \ /* Rayon du cercle trigonometrique (introduit le 20120522151842)... */ #define CERCLE_TRIGONOMETRIQUE \ DOUB(PI) \ /* Valeur en radians d'un tour complet du cercle trigonometrique... */ #define CERCLE_TRIGONOMETRIQUE_EN_DEGRES \ FLOT(360) \ /* Valeur en degres d'un tour complet du cercle trigonometrique... */ \ /* */ \ /* Le 20050111160612, 'PARE(...)' a ete remplace par 'FLOT(...)' afin de permettre une */ \ /* edition correcte dans 'v $xig/edite$vv$FON CERCLE_TRIGONOMETRIQUE_EN_DEGRES'... */ #define CONVERSION_DEGRES_EN_RADIANS(angle) \ SCAL(angle,CERCLE_TRIGONOMETRIQUE_EN_DEGRES,CERCLE_TRIGONOMETRIQUE) #define CONVERSION_RADIANS_EN_DEGRES(angle) \ SCAL(angle,CERCLE_TRIGONOMETRIQUE,CERCLE_TRIGONOMETRIQUE_EN_DEGRES) /* Conversion d'un angle exprime en degres en sa valeur en radians et inverse (introduit */ /* le 20050710123536). */ #define CERCLE_TRIGONOMETRIQUE_EN_GRADES \ FLOT(400) \ /* Valeur en grades d'un tour complet du cercle trigonometrique... */ \ /* */ \ /* Le 20050111160612, 'PARE(...)' a ete remplace par 'FLOT(...)' afin de permettre une */ \ /* edition correcte dans 'v $xig/edite$vv$FON CERCLE_TRIGONOMETRIQUE_EN_GRADES'... */ #define CONVERSION_GRADES_EN_RADIANS(angle) \ SCAL(angle,CERCLE_TRIGONOMETRIQUE_EN_GRADES,CERCLE_TRIGONOMETRIQUE) #define CONVERSION_RADIANS_EN_GRADES(angle) \ SCAL(angle,CERCLE_TRIGONOMETRIQUE,CERCLE_TRIGONOMETRIQUE_EN_GRADES) /* Conversion d'un angle exprime en grades en sa valeur en radians et inverse (introduit */ /* le 20050710123536). */ #define CERC(x) \ ATAN(SINX(x),COSX(x)) \ /* Mise d'un angle dans [0,2.PI[... */ #define ACOX(x) \ ACOD(x) \ /* Fonction 'arc-cosinus' definie dans [-1,+1] et a valeurs dans [0,pi], */ #define ASIX(x) \ ASID(x) \ /* Fonction 'arc-sinus' definie dans [-1,+1] et a valeurs dans [-pi/2,+pi/2]. */ #define gATAN(y,x) \ COND(IZGE(ARTG(y,x)),ARTG(y,x),ADD2(ARTG(y,x),CERCLE_TRIGONOMETRIQUE)) #define ATAN(y,x) \ Farc_tangente(FLOT(y),FLOT(x)) /* Arc-tangente de l'argument y/x dans [0,2xPI]. */ /* */ /* La fonction 'Farc_tangente(...)' a introduite le 20161202134722 pour accelerer la */ /* compilation de 'v $xrs/huit.11$I ATAN'... */ -define COHX(x) \ -_-_-_- DIVI(ADD2(EXPX(NEUT(x)),EXPX(NEGA(x))),DEUX) /* Fonction 'cosinus' hyperbolique. ATTENTION, autrefois, il y avait la definition : */ /* */ /* -define COHX(x) \ */ /* -_-_-_- MOIT(ADD2(EXPX(NEUT(x)),EXPX(NEGA(x)))) */ /* */ /* mais a cause de la derivation formelle, et de l'operateur tres special 'FRAn(...)' qui */ /* sert a definir 'MOIT(...)', il vaut mieux expliciter la division par 2... */ -define SIHX(x) \ -_-_-_- DIVI(SOUS(EXPX(NEUT(x)),EXPX(NEGA(x))),DEUX) /* Fonction 'sinus' hyperbolique. ATTENTION, autrefois, il y avait la definition : */ /* */ /* -define SIHX(x) \ */ /* -_-_-_- MOIT(SOUS(EXPX(NEUT(x)),EXPX(NEGA(x)))) */ /* */ /* mais a cause de la derivation formelle, et de l'operateur tres special 'FRAn(...)' qui */ /* sert a definir 'MOIT(...)', il vaut mieux expliciter la division par 2... */ -define SIHC(x) \ -_-_-_- COND(IZNE(x),DIVI(SIHX(x),x),FU) /* Fonction 'sinus' hyperbolique 'Cardinal' (introduite le 20230206104233)... */ -define TAHX(x) \ -_-_-_- DIVI(SIHX(x),COHX(x)) /* Fonction 'tangente' hyperbolique dans [-1,+1]... */ /* */ /* ATTENTION, cette definition presente un certain danger. En effet, bien que sa valeur */ /* soit dans [-1,+1], le fait que l'on passe par des calculs de 'EXPX(...)' implique que si */ /* la valeur de l'argument est trop grande (par exemple 1000), les calculs intermediaires */ /* sont en "overflow", alors que le resultat encore une fois ne devrait pas l'etre... */ /* Ceci s'est vu dans 'v $xrv/map_ND_2D.11$K TAHX' le 19970616184033. */ /* */ /* On notera que l'on ne teste pas la non nullite de 'COHX(x)' car, en effet, par */ /* definition le cosinus hyperbolique, en tant que somme d'exponentielles, ne peut */ /* etre nul... */ -define CSHX(x) \ -_-_-_- INVE(COHX(x)) /* Fonction 'secante' hyperbolique (introduite le 20201017115142)... */ -define SSHX(x) \ -_-_-_- fINVZ(SIHX(x)) /* Fonction 'cosecante' hyperbolique (introduite le 20201017115142)... */ -define CTHX(x) \ -_-_-_- fDIVZ(COHX(x),SIHX(x)) /* Fonction 'cotangente' hyperbolique (introduite le 20070713185306)... */ /* */ /* On notera que l'on ne la definit pas par : */ /* */ /* 1 */ /* coth(theta) = ----------- */ /* th(theta) */ /* */ /* afin d'alleger l'ecriture et simplifier la gestion du cas ou 'SIHX(x)' est nul... */ -define ATAH(x) \ -_-_-_- MOIT(LOGX(DIVI(ADD2(FU,x),SOUS(FU,x)))) /* Fonction 'arc-tangente' hyperbolique (introduite le 20120519173050)... */ -define gCOHX_SIHX(ex,ax,x,bx,ey,ay,y,by,t) \ -_-_-_- LIN2(ex,EXPX(AXPB(ax,x,bx)),ey,EXPX(AXPB(ay,y,by)),t) /* Fonction 'cosinus/sinus' hyperbolique generalisee (introduite le 20180820172821). */ /* */ /* On notera que : */ /* */ /* gCOHX_SIHX(+1/2,+1,x,0,+1/2,-1,x,0,0) = COHX(x) */ /* gCOHX_SIHX(+1/2,+1,x,0,-1/2,-1,x,0,0) = SIHX(x) */ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S " V I S I B L E S " D E S F O N C T I O N S M A T H E M A T I Q U E S */ /* U T I L E S P O U R L E S R E S E A U X D E N E U R O N N E S : */ /* */ /*************************************************************************************************************************************/ -define HEAV(x) \ -_-_-_- COND(IZLT(x),FZERO,COND(IZGT(x),FU,FLOT__UNDEF)) /* Fonction de Heaviside ou "fonction echelon unite" (introduite le 20230603135732)... */ -define SIGM(x) \ -_-_-_- INVE(ADD2(FU,EXPX(NEGA(x)))) /* Fonction 'sigmoide' dans [0,1] (introduite le 20230603135732)... */ -define RELU(x) \ -_-_-_- MAX2(FZERO,x) /* Fonction 'ReLU' ou "Rectified Linear Unit" (introduite le 20230603135732)... */ -define TAHX01(x) \ -_-_-_- AXPB(FDU,TAHX(x),FDU) /* Fonction 'tangente' hyperbolique dans [0,1] (introduite le 20220509134706)... */ -define TANH01(x) \ -_-_-_- AXPB(FDU,TANH(x),FDU) /* Fonction 'tangente' hyperbolique dans [0,1] (introduite le 20230605142323), version qui */ /* ne craint pas les debordements contrairement a 'TAHX01(...)' a cause de la definition */ /* de 'TAHX(...)' via des exponentielles 'EXPX(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S " V I S I B L E S " D E S F O N C T I O N S M A T H E M A T I Q U E S : */ /* P O S A N T D E S P R O B L E M E S : */ /* */ /*************************************************************************************************************************************/ #define TROP_PETIT(x,epsilon) \ COND(IFGT(ABSO(x),epsilon),x,ZERO) \ /* Fonction ramenant les petites valeurs a 0 pour eviter les 'underflow's... */ #define TROP_GRAND(x,anti_epsilon) \ COND(IFLT(ABSO(x),anti_epsilon),x,MEME_SIGNE_QUE(x,anti_epsilon)) \ /* Fonction ramenant les grandes valeurs au seuil de test ('anti_epsilon')... */ #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define PETI(x) \ TROP_PETIT(x,pEPSILON) \ /* Fonction ramenant les petites valeurs a 0 pour eviter les 'underflow's lors des passages */ \ /* de double en simple precision... */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define PETI(x) \ NEUT(x) \ /* Cette fonction est inutile en double precision... */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) /* ATTENTION, jusqu'au 20000918172204, il y avait systematiquement ci-apres : */ /* */ /* ((defined(SYSTEME_SG..._IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) */ /* */ /* or il apparait (grace a 'v $Dbugs/SGIND424$D/IRIX$D/CC$D/exp.01$c' ou encore a */ /* 'v $Dbugs/SGO200A2$D/IRIX$D/CC$D/exp.01$c') que toutes les releases subissent ce */ /* mechant "bug", d'ou la modification... */ #if ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) # TestADef BUG_SYSTEME_SG_C_pow \ /* 'pow(...)' peut faire un UNDERFLOW ('v $Dbugs/SGIND424$D/IRIX$D/CC$D/exp.01$c'). */ #Aif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) #Eif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ ) /* ATTENTION, je conserve la definition 'EXPX(...)' qui suit, en la rebaptisant 'EXEX(...)', */ /* simplement parce que je n'aime pas jeter les choses sophistiquees... */ #if ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_pow)) \ ) \ ) # define EXEX(x) \ PUIX(EN,x) \ /* Exponentielle de 'x'. */ \ /* */ \ /* ATTENTION, on notera que la conditionnalite de la definition de 'EXEX(...)' empeche */ \ /* (provisoirement ?) d'en definir la derivee puisque l'extraction des definitions faite */ \ /* lors de '$PASSE_D' par '$xcc/cpp$Z' ne prend pas en compte les conditionnalites... */ #Aif ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_pow)) \ ) \ ) /* ATTENTION, la methode actuellement implementee ne corrige le defaut que lorsque la */ /* fonction 'pow(...)' est appelee via 'EXEX(...)'. Dans le cas ou elle est appelee via */ /* 'PUIX(...)' rien n'est fait, car en effet, je ne vois pas comment faire, si ce n'est */ /* en la reprogrammant... */ # define BORNE_INFERIEURE_DE_L_ARGUMENT_D_UNE_EXPONENTIELLE \ FLOT(NEGA(708)) \ /* Voir le programme 'v $Dbugs/SGIND424$D/IRIX$D/CC$D/exp.01$c' pour plus de commentaires... */ # define EXEX(x) \ COND(IFGE(x,BORNE_INFERIEURE_DE_L_ARGUMENT_D_UNE_EXPONENTIELLE),PUIX(EN,x),FZERO) \ /* Exponentielle de 'x'. ATTENTION, il ne faut surtout pas ecrire : */ \ /* */ \ /* fCOND(IFGE(x,...),PUIX(EN,x),FZERO) */ \ /* */ \ /* car, en effet, 'fCOND(...)' etant une "vraie" fonction, ses trois arguments sont evalues */ \ /* et en particulier 'PUIX(EN,x)' l'est systematiquement, quel que soit le resultat du test */ \ /* 'IFGE(...)', ce que l'on souhaite precisemment eviter... */ \ /* */ \ /* ATTENTION, on notera que la conditionnalite de la definition de 'EXEX(...)' empeche */ \ /* (provisoirement ?) d'en definir la derivee puisque l'extraction des definitions faite */ \ /* lors de '$PASSE_D' par '$xcc/cpp$Z' ne prend pas en compte les conditionnalites... */ #Eif ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_pow)) \ ) \ ) #if ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) # TestADef BUG_SYSTEME_SG_C_exp \ /* 'exp(...)' peut faire un UNDERFLOW ('v $Dbugs/SGIND424$D/IRIX$D/CC$D/exp.01$c'). */ #Aif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) #Eif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE < 503000000)) \ ) #if ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_exp)) \ ) \ ) # define EXPB(x) \ EXPX(x) \ /* Exponentielle de 'x'. */ \ /* */ \ /* ATTENTION, on notera que la conditionnalite de la definition de 'EXPB(...)' empeche */ \ /* (provisoirement ?) d'en definir la derivee puisque l'extraction des definitions faite */ \ /* lors de '$PASSE_D' par '$xcc/cpp$Z' ne prend pas en compte les conditionnalites... */ #Aif ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_exp)) \ ) \ ) # define EXPB(x) \ EXEX(x) \ /* Exponentielle de 'x'. */ \ /* */ \ /* ATTENTION, on notera que la conditionnalite de la definition de 'EXPB(...)' empeche */ \ /* (provisoirement ?) d'en definir la derivee puisque l'extraction des definitions faite */ \ /* lors de '$PASSE_D' par '$xcc/cpp$Z' ne prend pas en compte les conditionnalites... */ #Eif ( (! defined(MODE_TEST_OVERFLOW_ET_UNDERFLOW)) \ || ( (! defined(BUG_SYSTEME_SG_C_exp)) \ ) \ ) #define EXba(base,x) \ PUIX(base,x) \ /* Exponentielle de 'x' en base quelconque (introduite le 20230321184059). */ #define EX10(x) \ EXba(FBASE10,x) \ /* Exponentielle de 'x' en base 10. */ #define EX02(x) \ EXba(FBASE2,x) \ /* Exponentielle de 'x' en base 2 (introduite le 20171129104549). */ #define GAUS(x,esperance,ecart_type) \ EXPB(NEGA(DIVI(EXP2(SOUS(x,esperance)),DOUB(EXP2(ecart_type))))) #define DGAUS(x,esperance,ecart_type) \ DIVI(GAUS(x,esperance,ecart_type) \ ,MUL2(ecart_type,RACX(CERCLE_TRIGONOMETRIQUE)) \ ) /* Distribution normale dite "gaussienne" (introduite le 20091116160705). Au passage, */ /* 'esperance' est la moyenne de 'x' et 'EXP2(ecart_type)' est la 'variance' (quand */ /* cette derniere augmente, la courbe en cloche s'aplatit et s'elargit...). La 'variance' */ /* est egale a la somme des carres des ecarts a la moyenne ponderes par les probabilites */ /* correspondantes. */ /* */ /* En resume : */ /* */ /* i=N */ /* ----- */ /* 1 \ */ /* M = --- / X Esperance (Moyenne) */ /* N ----- i */ /* i=1 */ /* */ /* */ /* i=N */ /* ----- */ /* 1 \ 2 */ /* V = --- / (X - M) Variance */ /* N ----- i */ /* i=1 */ /* */ /* */ /* ___ */ /* / */ /* S = \/ V Sigma (EcartType) */ /* */ /* */ /* 2 */ /* (x-M) */ /* - -------- */ /* 2 */ /* 1 2.S */ /* P(x) = -------------.e DensiteProbabilite */ /* ______ */ /* / */ /* S.\/ 2.pi */ /* */ /* */ /* Pour une raison mysterieuse, jusqu'au 20110325100259 etait utilisee 'SQRT(...)' ci-dessus */ /* (qui n'a jamais existe me semble-t-il...) a la place de 'RACX(...)'. */ /* */ /* On notera que 'GAUS(...)' donne une valeur dans [0,1] contrairement a 'DGAUS(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A N A L Y S E C O M B I N A T O I R E : */ /* */ /*************************************************************************************************************************************/ #define ARnm(n,m) \ DIVI(INTE(FACT(n)),INTE(FACT(SOUS(n,m)))) \ /* Nombre d'ARrangements de 'n' objets 'm' a 'm' (introduit le 20090426121205) avec */ \ /* evidemment n<=m... */ \ /* */ \ /* Exemple (m=2, n=3) : */ \ /* */ \ /* arrangements 2 a 2 des 3 elements {a,b,c} = {ab,ac,bc,ba,ca,cb} */ \ /* */ \ /* en notant donc que l'ordre intervient. */ \ /* */ \ /* On rappelle que : */ \ /* */ \ /* m n! */ \ /* A = -------- */ \ /* n (n-m)! */ \ /* */ #define PERn(n) \ ARnm(n,n) \ /* Nombre de PERmutations de 'n' objets (introduit le 20090426121205). */ \ /* */ \ /* Exemple : */ \ /* */ \ /* permutations des 3 elements {a,b,c} = {abc,bca,cab,cba,bac,acb} */ \ /* */ \ /* en notant donc que l'ordre intervient. */ #define COnm(n,m) \ DIVI(ARnm(n,m),PERn(m)) \ /* Nombre de COmbinaisons de 'n' objets 'm' a 'm' (introduit le 20090426121205). */ \ /* */ \ /* Exemple (m=2, n=3) : */ \ /* */ \ /* combinaisons 2 a 2 des 3 elements {a,b,c} = {ab,ac,bc} */ \ /* */ \ /* en notant donc que l'ordre n'intervient pas. */ \ /* */ \ /* On rappelle que : */ \ /* */ \ /* m */ \ /* A */ \ /* m | n | n n! */ \ /* C = | | = ---- = ---------- */ \ /* n | m | m! m!(n-m)! */ \ /* */ \ /* */ \ /* Le 20200321111808, je rappelle de plus que : */ \ /* */ \ /* */ \ /* n 0 n-0 0 1 n-1 1 2 n-2 2 n n-n n */ \ /* (a+b) = C .a .b + C .a .b + C .a .b + (...) + C .a .b */ \ /* n n n n */ \ /* */ \ /* */ \ /* C'est le binome de Newton... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P R O X I M A T I O N D E C E R T A I N E S F O N C T I O N S M A T H E M A T I Q U E S : */ /* */ /*************************************************************************************************************************************/ -define COSA(x) \ -_-_-_- SOUS(DIVI(EXP0(x),MUL0(FZERO)) \ -_-_-_- ,DIVI(EXP2(x),MUL2(FU,FDEUX)) \ -_-_-_- ) /* Approximation du cosinus de 'x' par un developpement limite a 2 termes : */ /* */ /* 0 2 */ /* x x */ /* cos(x) = ---- - ---- */ /* 0! 2! */ /* */ /* mais ATTENTION, cela n'ayant de sens que pour les faibles valeurs de 'x' (devant 1)... */ -define SINA(x) \ -_-_-_- SOUS(DIVI(EXP1(x),MUL1(FU)) \ -_-_-_- ,DIVI(EXP3(x),MUL3(FU,FDEUX,FTROIS)) \ -_-_-_- ) /* Approximation du sinus de 'x' par un developpement limite a 2 termes : */ /* */ /* 1 3 */ /* x x */ /* sin(x) = ---- - ---- */ /* 1! 3! */ /* */ /* mais ATTENTION, cela n'ayant de sens que pour les faibles valeurs de 'x' (devant 1)... */ #define RACA(x) \ DIVI(GRO1(HORNER_1_02(x,UN,SIX,UN)) \ ,GRO4(HORNER_1_01(x,UN,UN)) \ ) \ /* Approximation de la racine carree de 'x' par la methode de Newton : */ \ /* */ \ /* 1 x */ \ /* U = ---.(U + ---) */ \ /* n+1 2 n U */ \ /* n */ \ /* avec : */ \ /* */ \ /* U = 1. */ \ /* 0 */ \ /* */ \ /* logarithme base 2 de 'x' en double-precision. */ #define FACA(x) \ MUL2(SPUIX(DIVI(x,EN),x),SRACX(MUL3(FDEUX,PI,x))) \ /* Approximation de la fonction 'factorielle' par la formule de Stirling (ceci fut introduit */ \ /* le 20180826093441 juste pour voir...). On notera le traitement du cas ou 'x' est negatif. */ \ /* */ \ /* Le 20180827093316, le nom 'FACT_Stirling(...)' a ete remplace par 'FACA(...)' qui */ \ /* correspond mieux aux noms des fonctions "Approchees"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D E R I V E E S D E S F O N C T I O N S M A T H E M A T I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define d_F_de_G(derivee_de_F,G) \ MUL2(derivee_de_F,d#G) \ /* Derivee d'une fonction de fonction : */ \ /* */ \ /* d(F(G(x)) d(F(u)) du */ \ /* ---------- = -------- .---- */ \ /* dx du dx */ \ /* */ \ /* avec : */ \ /* */ \ /* u = G(x) */ \ /* */ #define d_RACX(x) \ d_F_de_G(INVE(GRO2(RACX(x))),x) \ /* Derivee de la fonction racine carree : */ \ /* */ \ /* _ 1 */ \ /* d(\/x ) = ------- .dx */ \ /* _ */ \ /* 2.\/x */ \ /* */ #define d_LOGX(x) \ d_F_de_G(INVZ(x),x) #define d_LO1X(x) \ DIVI(d_LOGX(x),LOGX(FBASE10)) /* Derivee de la fonction logarithme : */ /* */ /* 1 */ /* d(log(x)) = ---.dx */ /* x */ /* */ #define d_PUIX(x,y) \ d_F_de_G(PUIX(x,y),MUL2(y,LOGX(x))) \ /* Derivee de la fonction exponentielle generalisee : */ \ /* */ \ /* y */ \ /* f(x,y) = x */ \ /* */ \ /* log(f(x,y)) = y.log(x) */ \ /* */ \ /* d(log(f(x,y))) = d(y.log(x)) */ \ /* */ \ /* or : */ \ /* */ \ /* d(f(x,y)) */ \ /* d(log(f(x,y))) = ----------- */ \ /* f(x,y) */ \ /* */ \ /* d'ou : */ \ /* */ \ /* d(f(x,y)) */ \ /* ----------- = d(y.log(x)) */ \ /* f(x,y) */ \ /* */ \ /* et donc : */ \ /* */ \ /* d(f(x,y)) = f(x,y).d(y.log(x)) */ \ /* */ \ /* Mais ATTENTION, il faut : */ \ /* */ \ /* x > 0 */ \ /* */ \ /* puisque l'on prend son logarithme, d'ou l'introduction de la fonction 'MONX(...)' pour */ \ /* traiter simplement le cas des exponentiations entieres... */ \ /* */ #define d_MONX(x,n) \ d_F_de_G(COND(IZNE(n),MUL2(n,MONX(x,PRED(n))),ZERO),x) \ /* Derivee de la fonction puissance entiere : */ \ /* */ \ /* n n-1 */ \ /* d(x ) = n.x .dx */ \ /* */ \ /* ATTENTION, on notera bien que la fonction 'MONX(...)' n'a ete introduite que pour */ \ /* resoudre le cas ou 'x' est negatif dans 'PUIX(...)', malheureusement uniquement lorsque */ \ /* 'y' est entier ('n'). Enfin, le test de nullite de l'exposant 'n' est destine a eviter */ \ /* alors l'execution de : */ \ /* */ \ /* MONX(x,PRED(n)) */ \ /* */ \ /* soit : */ \ /* */ \ /* MONX(x,PRED(0)) */ \ /* */ \ /* ou encore : */ \ /* */ \ /* MONX(x,-1) */ \ /* */ \ /* ce qui serait problematique dans le cas ou 'x' serait nul, puisque cela reviendrait a */ \ /* diviser par 0... */ \ /* */ #define d_EXPX(x) \ d_F_de_G(EXPX(x),x) \ /* Derivee de la fonction exponentielle : */ \ /* */ \ /* d(exp(x)) = exp(x).dx */ \ /* */ #define d_COSX(x) \ d_F_de_G(NEGA(SINX(x)),x) \ /* Derivee de la fonction cosinus : */ \ /* */ \ /* d(cos(x)) = -sin(x).dx */ \ /* */ #define d_SINX(x) \ d_F_de_G(NEUT(COSX(x)),x) \ /* Derivee de la fonction sinus : */ \ /* */ \ /* d(sin(x)) = +cos(x).dx */ \ /* */ #define d_ATAN(y,x) \ ADD2(d_F_de_G(INVE(ADD2(FU,EXP2(DIVI(y,x)))),x),d_F_de_G(INVE(ADD2(FU,EXP2(DIVI(y,x)))),y)) \ /* Derivee de la fonction arc-tangente : */ \ /* */ \ /* 1 */ \ /* d(arctg(y,x)) = ---------- */ \ /* 2 */ \ /* y */ \ /* 1 + ---- */ \ /* 2 */ \ /* x */ \ /* */ \ /* Elle a ete introduite le 20161202134722... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S P R I M I T I V E S : */ /* */ /*************************************************************************************************************************************/ #define p_PUIX(x,n) \ MUL2(INVE(SUCC(INTE(n))),MUL2(x,PUIX(x,INTE(n)))) \ /* Primitive de 'x' a la puissance entiere 'n' (introduite le 20200321112442), en notant */ \ /* que l'on neglige le "+constante" evidemment... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O P T M I S A T I O N " S P A T I A L E " E T " T E M P O R E L L E " */ /* D E C E R T A I N S O P E R A T E U R S : */ /* */ /*************************************************************************************************************************************/ /* Introduit le 20190730152917 suite a des tests avec 'v $xtc/BlocInstructions.03$c' (par */ /* exemple). Le but etant donc de ne calculer qu'une seule fois les arguments {a,b,...} ce */ /* qui Optimise donc a la fois spatialement (en nombre d'instructions) et temporellement */ /* l'operateur correspondant. En contre-partie, il faut fixer un type a priori et c'est */ /* 'Float', le plus "general", qui a ete choisi... Un autre inconvenient est qu'il est */ /* impossible de deriver formellement... */ #define oDIV0(a,b,c,d) \ PARE( \ Bblock \ DEFV(Float,INIT(a_optimise,FLOT(a))); \ DEFV(Float,INIT(b_optimise,FLOT(b))); \ DEFV(Float,INIT(c_optimise,FLOT(c))); \ DEFV(Float,INIT(d_optimise,FLOT(d))); \ /* Calcul une seule fois des quatre arguments {a,b,c,d}. */ \ \ DIV0(a_optimise,b_optimise,c_optimise,d_optimise); \ /* Division Optimisee... */ \ Eblock \ ) \ /* Introduit le 20190730152917... */ #define oMIN2(a,b) \ PARE( \ Bblock \ DEFV(Float,INIT(a_optimise,FLOT(a))); \ DEFV(Float,INIT(b_optimise,FLOT(b))); \ /* Calcul une seule fois des deux arguments {a,b}. */ \ \ MIN2(a_optimise,b_optimise); \ /* Minimum Optimise... */ \ Eblock \ ) \ /* Introduit le 20190731093101... */ #define oMAX2(a,b) \ PARE( \ Bblock \ DEFV(Float,INIT(a_optimise,FLOT(a))); \ DEFV(Float,INIT(b_optimise,FLOT(b))); \ /* Calcul une seule fois des deux arguments {a,b}. */ \ \ MAX2(a_optimise,b_optimise); \ /* Maximum Optimise... */ \ Eblock \ ) \ /* Introduit le 20190731093101... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* B A S E S D E N U M E R A T I O N : */ /* */ /*************************************************************************************************************************************/ #define BASE2 \ DEUX \ /* Definition de la base binaire. */ -define FBASE2 \ -_-_-_- FLOT(BASE2) /* Definition de la base binaire (en flottant...). */ #define BASE10 \ DIX \ /* Definition de la base decimale. */ #define FBASE10 \ FLOT(BASE10) \ /* Definition de la base decimale (en flottant...). Elle fut introduite le 20171129104549... */ #define BASE16 \ SLLS(BIT,NBITHX) \ /* Definition de la base hexa-decimale. */ #define DEUXp2 \ EXP2(BASE2) #define DEUXp3 \ EXP3(BASE2) #define DEUXp4 \ bMUL(DEUXp3,BASE2) #define DEUXp5 \ bMUL(DEUXp4,BASE2) #define DEUXp6 \ bMUL(DEUXp5,BASE2) #define DEUXp7 \ bMUL(DEUXp6,BASE2) #define DEUXp8 \ bMUL(DEUXp7,BASE2) #define DEUXp9 \ bMUL(DEUXp8,BASE2) #define DEUXp10 \ bMUL(DEUXp9,BASE2) #define DEUXp15 \ bMUL(DEUXp8,DEUXp7) \ /* Definition de 2 a la puissance 15 (en entier), */ #define DEUXp16 \ EXP2(DEUXp8) \ /* Definition de 2 a la puissance 16 (en entier), */ #define DEUXp31M1 \ PRED(bMUL(DEUXp16,DEUXp15)) \ /* Definition de 2 a la puissance 31 moins 1 (en entier) qui est notons le un */ \ /* nombre premier du type "de Mersenne". ATTENTION, l'ecriture : */ \ /* */ \ /* VINTE(DEUXp31M1) */ \ /* */ \ /* est fausse car 'DEUXp31M1' est vu alors comme un nombre entier negatif, et la valeur */ \ /* renvoyee est egale a 'DEUXp31M1 - 2'... */ #define FDEUXp2 \ bMUL(FBASE2,FBASE2) #define FDEUXp3 \ bMUL(FDEUXp2,FBASE2) #define FDEUXp4 \ bMUL(FDEUXp3,FBASE2) #define FDEUXp7 \ bMUL(FDEUXp4,FDEUXp3) \ /* Definition de 2 a la puissance 7 (en flottant), */ #define FDEUXp8 \ bMUL(FDEUXp7,FBASE2) \ /* Definition de 2 a la puissance 8 (en flottant), */ #define FDEUXp15 \ bMUL(FDEUXp8,FDEUXp7) \ /* Definition de 2 a la puissance 15 (en flottant), */ #define FDEUXp16 \ bMUL(FDEUXp15,FBASE2) \ /* Definition de 2 a la puissance 16 (en flottant), */ #define k___FDEUXp30 \ bMUL(FDEUXp15,FDEUXp15) \ /* Definition de 2 a la puissance 30 (en flottant), */ \ /* */ \ /* ATTENTION : la constante 'FDEUXp30' est pre-generee dans '$xcp/Konstantes$K'. */ \ /* */ \ /* Cette pre-generation a ete introduite pour lutter contre le bug rencontre la premiere */ \ /* fois dans la fonction 'chain_numero(...)' de '$xig/fonct$vv$FON' via la commande */ \ /* '$xci/nombres$K'. Ce bug est decrit dans 'v $Dbugs/SGIND424$D/IRIX$D/CC$D/log10.01$c' de */ \ /* facon synthetique... Mais ATTENTION, elle avait ete introduite pour 'FDEUXp31' ; or cela */ \ /* a pose deux problemes : d'une part la procedure 'DEFINEF(...)' de '$xig/definit.2$DEF' */ \ /* utilisee par '$xcp/Konstantes$K' utilise 'VINTE(...)' ce qui ne convient pas pour la */ \ /* constante 'FDEUXp31' qui peut etre vue comme une constante entiere negative ; d'autre */ \ /* part dans le fonction 'chain_numero(...)' il vaut mieux utiliser la constante 'FDEUXp30' */ \ /* que 'FDEUXp31' pour connaitre la capacite d'un mot... */ #define FDEUXp31 \ bMUL(FDEUXp16,FDEUXp15) \ /* Definition de 2 a la puissance 31 (en flottant), */ #define FDEUXp32 \ bMUL(FDEUXp31,FBASE2) \ /* Definition de 2 a la puissance 32 (en flottant). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef FDEUXp30 \ k___FDEUXp30 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S M A T H E M A T I Q U E S D E B A S E : */ /* */ /*************************************************************************************************************************************/ #define VERITABLE_PREMIER_NOMBRE_PREMIER \ DEUX \ /* Definition du premier nombre premier, qui est pair (introduit le 20130112102534)... */ -define PI \ -_-_-_- PARE(3.14159265358979323846) /* Fabuleuse constante universelle qui me fait rever... */ #if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) /* Pour les compilateurs ne supportant pas dans les dimensionnements de tableaux de */ /* constantes flottantes (meme castees en entier...), la solution sera de passer pour */ /* les dimensions qui contiennent des valeurs flottantes, par des constantes "pre-generees" */ /* via le programme '$xcp/constantes$K' ; on verra par exemple 'LONGUEUR_DE_L_ONDELETTE_1D' */ /* avec profit... */ # TestADef BUG_SYSTEME_C_dimensions_flottantes \ /* Le compilateur 'cc' ne supporte pas, dans les dimensionnements de tableaux, de */ \ /* constantes flottantes (meme castees en entier...). ATTENTION, ce bug est defini, mais */ \ /* n'est pas utilise (car je ne sais pas comment le prendre en compte automatiquement). */ #Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) #Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) #define k___COSINUS_DE_0 \ COSX(FZERO) \ /* Constante 'cos(0)'. */ \ /* */ \ /* ATTENTION : la constante 'COSINUS_DE_0' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___COSINUS_DE_PI \ COSX(PI) \ /* Constante 'cos(pi)'. */ \ /* */ \ /* ATTENTION : la constante 'COSINUS_DE_PI' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___SINUS_DE_PI_SUR_2 \ SINX(PI_SUR_2) \ /* Constante 'sin(pi/2)'. */ \ /* */ \ /* ATTENTION : la constante 'SINUS_DE_PI_SUR_2' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___SINUS_DE_3_PI_SUR_2 \ SINX(bADD(PI_SUR_2,PI)) \ /* Constante 'sin(3.pi/2)'. */ \ /* */ \ /* ATTENTION : la constante 'SINUS_DE_3_PI_SUR_2' est pre-generee dans '$xcp/Konstantes$K'. */ #define EULER \ PARE(0.57721566490) \ /* Constante d'Euler (ou d'Euler-Mascheroni) definie comme la limite de : */ \ /* */ \ /* 1 1 1 1 */ \ /* --- + --- + --- + ... + --- - log(m) */ \ /* 1 2 3 m */ \ /* */ \ /* lorsque 'm' tend vers l'infini... */ #define EN \ PARE(2.7182818284590452354) \ /* Base des logarithmes neperiens. */ #define k___NOMBRE_D_OR \ RACINE_REELLE_p_DE_L_EQUATION_DU_SECOND_DEGRE(NEUT(UN),NEGA(UN),NEGA(UN)) #define k___INVERSE_DU_NOMBRE_D_OR \ INVE(k___NOMBRE_D_OR) /* Nombre d'or et son inverse (introduit le 20120501080412). Rappelons que le Nombre d'Or */ /* est solution de l'equation : */ /* */ /* 2 */ /* x = x + 1 */ /* */ /* soit : */ /* */ /* 2 */ /* x - x - 1 = 0 */ /* */ /* dont la solution positive : */ /* */ /* ____________________ ___ */ /* / 2 / */ /* -(-1) + \/ (-1) - 4x(+1)x(-1) 1 + \/ 5 */ /* --------------------------------- = ------------ */ /* 2x(+1) 2 */ /* */ /* est le Nombre d'Or... */ /* */ /* Une bonne approximation qui m'a ete indiquee par Nicolas Witkowski le 20140120 est 8/5. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N S T A N T E S P H Y S I Q U E S D E B A S E : */ /* */ /*************************************************************************************************************************************/ #define VITESSE_DE_LA_LUMIERE \ PARE(299792458.0) \ /* Definition de la vitesse de la lumiere dans le vide (page 546 du dictionnaire de la */ \ /* physique) exprimee en metres par seconde. */ #define CONSTANTE_DE_LA_GRAVITATION \ PARE(6.6720e-11) \ /* Definition de la constante de la gravitation (page 92 du dictionnaire de la physique) */ \ /* exprimee en : */ \ /* */ \ /* 2 -2 */ \ /* Nm kg */ \ /* */ #define CONSTANTE_DE_PLANCK \ PARE(6.626176e-34) \ /* Definition de la vitesse de la constante de Planck 'h' (page 92 du dictionnaire de la */ \ /* physique) exprimee en Joule par Hertz. */ #define CONSTANTE_DE_BOLTZMANN \ PARE(1.38066e-23) \ /* Constante de Boltzmann (page 40 du dictionnaire de la physique) exprimee en : */ \ /* */ \ /* 1 -1 */ \ /* J K */ \ /* */ #define CHARGE_ELECTRIQUE_ELEMENTAIRE \ PARE(1.6021892e-19) \ /* Charge electrique elementaire 'q' (en Coulomb) ; il s'agit de celle de l'electron qui */ \ /* est utilisee lors du calcul de la force de Lorentz. Dans les autres circonstances, */ \ /* ce sont des valeurs du type '1' ou '1/3' (...) qui seront utilisees afin de permettre, */ \ /* par exemple, de prendre en compte le fait que la charge electrique est la somme de la */ \ /* charge faible et de la charge 'U(1)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef COSINUS_DE_0 \ k___COSINUS_DE_0 #TestADef COSINUS_DE_PI \ k___COSINUS_DE_PI #TestADef SINUS_DE_PI_SUR_2 \ k___SINUS_DE_PI_SUR_2 #TestADef SINUS_DE_3_PI_SUR_2 \ k___SINUS_DE_3_PI_SUR_2 #TestADef NOMBRE_D_OR \ k___NOMBRE_D_OR #TestADef INVERSE_DU_NOMBRE_D_OR \ k___INVERSE_DU_NOMBRE_D_OR /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R C O N S E R V E R D E S D E F I N T I O N S E T D E S S E Q U E N C E S A R C H A I Q U E S */ /* S A N S L E S D E T R U I R E : */ /* */ /*************************************************************************************************************************************/ #define DEFINITION_ARCHAIQUE(definition) \ BLOC(VIDE) \ /* Pour ne pas generer une definition archaique ou l'on notera bien l'absence du couple */ \ /* {Bblock,Eblock} et de tous les ";" afin de permettre son utilisation sans probleme, */ \ /* par exemple dans 'v $xig/fonct$vv$FON DEFINITION_ARCHAIQUE'. Ceci fut introduit le */ \ /* 20061116120230... */ #define SEQUENCE_ARCHAIQUE(sequence) \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Pour ne pas generer une sequence de code archaique... */ \ /* */ \ /* Le 20061116120230 'ARCHAIQUE(...)' a ete rebaptisee 'SEQUENCE_ARCHAIQUE(...)' afin de */ \ /* permettre l'introduction de 'DEFINITION_ARCHAIQUE(...)'. */ \ /* */ \ /* On n'oubliera pas aussi l'existence de 'SUPPRIMER(...)', de 'AAAAMMJJhhmmss(...)' (ou */ \ /* 'AAAAMMJJhhmmss' est une date a laquelle fut supprimee une certaine sequence...) ainsi */ /* que de 'SUPPRIME_LE_AAAAMMJJhhmmss(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P E L D E T Y P E " S O U S - P R O G R A M M E " D ' U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define nCALS(fonction) \ Bblock \ SEQUENCE_ARCHAIQUE(CALS(fonction);); \ Eblock \ /* Pour ne pas effectuer l'appel d'une fonction... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O T S C L E F S P O U R L E S F O N C T I O N S : */ /* */ /*************************************************************************************************************************************/ /* Permet d'introduire le nom d'une fonction et son type ("Logical", "CHAR", */ /* "Int", "Float", "Double" ou "genere_p") ce qui permet de retrouver rapidement */ /* toutes les fonctions definies dans un fichier. */ /* */ /* Le 20040514101701, j'ai introduit les 'gFonction...' ; elles permettent dorenavant de */ /* definir les 'E___Fonction...' non plus a partir de 'Fonction...', mais a partir de */ /* 'gFonction...'. L'avantage est le suivant : il est alors possible d'introduire dans la */ /* definition des 'Fonction...' un marqueur de "debut de definition de fonction", sans que */ /* cela ne perturbe les definitions des 'E___Fonction...'. L'idee en cours a cette date */ /* etant de remplacer les : */ /* */ /* type Fonction(arg1,arg2,...) */ /* type1 arg1; */ /* type2 arg2; */ /* (...) */ /* { */ /* */ /* par des : */ /* */ /* type Fonction(type1 arg1,type2 arg2,...) */ /* { */ /* */ /* qui possedent l'avantage de faire verifier la concordance des types des arguments d'une */ /* fonction entre sa definition et ses utilisations. */ /* */ /* Ainsi, pouvoir marquer le "debut de definition d'une fonction", connaissant sa fin, */ /* constituee par la premiere "{" rencontree, permettrait d'automatiser cela sans avoir */ /* a modifier les codes sources... */ /* */ /* Evidemment, si cette solution etait utilisee, cela demanderait d'agir aussi de facon */ /* importante au niveau de 'v $xcg/gen$ARG$Z' et de 'v $xcg/gen$EXT$Z'... */ #define VraiBeginFonction(type) \ /* Le 20111201110158 je note que l'argument 'type' ne sert qu'a generer ci-apres le */ \ /* symbole 'ValidationDesCouples_____VraiBeginFonction__EndFonction``type&&&' qui lui-meme */ \ /* fait ensuite l'objet d'un 'undef' dans 'EndFonction(type)' afin de bien verifier que */ \ /* c'est le meme type que l'on trouve dans 'VraiBeginFonction(...)' et 'EndFonction(...)'. */ \ &define ValidationDesCouples_____VraiBeginFonction__EndFonction``type&&& \ \ %ifdef LISTE_DES_ARGUMENTS_IMPLICITES \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ Bblock ERREUR_SINS_SINT LISTE_DES_ARGUMENTS_IMPLICITES ERREUR_SINS_SINT Eblock \ %Aifdef LISTE_DES_ARGUMENTS_IMPLICITES \ %Eifdef LISTE_DES_ARGUMENTS_IMPLICITES \ \ INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES \ /* Pour marquer le debut de la definition d'une fonction (introduit le 20071114152817) */ \ /* dans le but de gerer automatiquement la reinitialisation des arguments implicites */ \ /* ('v $xil/defi_c1$vv$DEF 20071114104738'), ceci etant inutilise a cette date... */ \ /* */ \ /* On notera la difference entre 'VraiBeginFonction' et 'BeginFonction' : la premiere */ \ /* precede tout y compris les 'SINS(...)' et les 'SINT(...)' (ou du moins cela devra */ \ /* etre vrai lors de l'utilisation de 'v $xil/defi_c1$vv$DEF 20071114104738'), alors que */ \ /* la seconde apparait au point d'entree... */ \ /* */ \ /* Le 20071115131928 a ete introduite la validation, via un {&define,&undef}, du couple */ \ /* {VraiBeginFonction,EndFonction}. On notera la "brievete" du symbole 'ValBEF' (sachant */ \ /* que j'ai cherche a utiliser 'ValidationDesCouples_____VraiBeginFonction__EndFonction'). */ \ /* Celle-ci est actuellement rendue necessaire a cause d'interferences entre cette longueur */ \ /* et le processus de decoupage ('v $xcc/cpp$Z .xcp.decoupage.X') qui donne alors une valeur */ \ /* vide a 'NomDeLaFonctionCourante'. Ce probleme est particulirement lie aux definitions */ \ /* de fonctions via des procedures ('v $xig/fonct$vv$FON GENERE__FonctionC_FconversionC' */ \ /* par exemple) car, alors on rencontre ensuite des choses du type : */ \ /* */ \ /* DEFV(Common,GENERE__Fonction...(...)) */ \ /* */ \ /* ce qui donne des lignes de grandes longueur et donc decoupees... */ \ /* */ \ /* Le 20071116174926, le symbole 'ValidationDesCouples_____VraiBeginFonction__EndFonction' */ \ /* a pu etre retabli a la place de l'insignifiant 'ValBEF' suite a un changement de */ \ /* "philosophie" concernant la generation automatique des fonctions. A compter de cette */ \ /* date, on trouvera : */ \ /* */ \ /* BFonctionX */ \ /* DEFV(Common,GENERE__FonctionX...(...)) */ \ /* EFonctionX */ \ /* */ \ /* pour generer automatiquement une fonction de type 'X' (soit {C,I,F,L,...}) et cela */ \ /* exactement comme pour les fonctions "normales" pour lesquelles on trouvait deja : */ \ /* */ \ /* BFonctionX */ \ /* DEFV(Common,DEFV(...,SINT(...))); */ \ /* (...) */ \ /* DEFV(Common,DEFV(...,SINT(...))); */ \ /* */ \ /* DEFV(Common,DEFV(FonctionX,...)) */ \ /* EFonctionX */ \ /* */ \ /* et le tour est joue... */ \ /* */ \ /* Le 20071117085132 fut introduite la gestion des arguments implicites... */ \ /* */ \ /* Le 20100521154239 fut introduite un test sur 'LISTE_DES_ARGUMENTS_IMPLICITES' afin de */ \ /* s'assurer que {SINS,SINT} ne sont utilisees qu'entre {BFonction,...,EFonction...}. Ceux */ \ /* qui sont localises a l'exterieur de {BFonction,...,EFonction...} doivent etre remplaces */ \ /* par {ZINS,ZINT}. Malheureusement, je ne sais pas localiser le defaut dans le fichier */ \ /* argument, si ce n'est en generant 'ERREUR_SINS_SINT' qui cause une erreur avec '$Cc' */ \ /* (on notera que la ligne 'Bblock ... Eblock' doit etre ainsi et ne peut utiliser qu'un */ \ /* seul '_____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____' sous peine d'avoir le message : */ \ /* */ \ /* 'undef' d'un symbole ('NomDeLaFonctionCourante') non defini */ \ /* */ \ /* lors de la compilation d'un '$K'). */ #define BFonctionV \ VraiBeginFonction(TypeV) #define BFonctionC \ VraiBeginFonction(TypeC) #define BFonctionP \ VraiBeginFonction(TypeP) #define BPointeurFonctionP \ VraiBeginFonction(TypeP) #define BFonctionIB \ VraiBeginFonction(TypeIB) #define BFonctionI \ VraiBeginFonction(TypeI) #define BFonctionUB \ VraiBeginFonction(TypeUB) #define BFonctionU \ VraiBeginFonction(TypeU) #define BFonctionL \ VraiBeginFonction(TypeL) #define BFonctionF \ VraiBeginFonction(TypeF) #define BFonctionD \ VraiBeginFonction(TypeD) #define BFonctionJ \ VraiBeginFonction(TypeJ) #define BFonctionHJ \ VraiBeginFonction(TypeHJ) #define BFonctionHHJ \ VraiBeginFonction(TypeHHJ) #define BFonctionE \ VraiBeginFonction(TypeE) /* Introduits le 20071114152817... */ /* */ /* Avant le 20071116213833, les types ci-dessus etaient {V,C,P,I,U,L,F,D,J,HJ,E}. Mais */ /* a cause de 'v $xrk/rdn_walk.52$K .define...F.fonction.coordonnees.', le type 'F' de */ /* cette liste etait remplace par la definition de 'F(...)' dans '$xrk/rdn_walk.52$K', */ /* d'ou ces extensions 'Type...'. Notons au passage qu'il en etait de meme de 'I' (qui */ /* vaut 1 ('v $xil/defi_K1$vv$DEF .define...I') et d'autres peut-etre... */ /* */ /* Le 20100317142723 fut introduit 'FonctionIB' afin d'acceder a 'vrai_Int_de_base'... */ /* */ /* Le 20111201105002 fut introduit 'FonctionHHJ'... */ /* */ /* Le 20180425154540 fut introduit 'PointeurFonctionP' (cela a demande la modification */ /* 'v $xcg/LArgTypFo$vv$Z Pointeur..Fonction.'). */ @define DebutDeDefinitionDeFonction VIDE /* ATTENTION : on notera l'absence de ligne suite ci-dessus ('\') du a l'utilisation de la */ /* '$PASSE_5' pour la definition 'DebutDeDefinitionDeFonction'... */ @define NomDeLaFonctionCourante "FonctionInconnue" /* Introduit le 20051124105521 au cas ou... */ /* */ /* ATTENTION : on notera l'absence de ligne suite ci-dessus ('\') du a l'utilisation de la */ /* '$PASSE_5' pour la definition 'DebutDeDefinitionDeFonction'... */ #ifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 # define BeginFonction \ &define NomDeLaFonctionCourante&&&DebutDeDefinitionDeFonction # define BeginPointeurFonction \ BeginFonction #Aifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 #Eifdef DEFINITION_DE__BeginFonction__RETU_VERSION_01 #ifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 # define BeginFonction_1 \ &define CompteurDeLaFonctionCourante DEFV(Common,DEFV(Positive,INIT(NomDeLaFonctionCourante QD@@__ NbreAcces,ZERO))); # define BeginFonction_2 \ &define NomDeLaFonctionCourante&&&DebutDeDefinitionDeFonction # define BeginFonction \ BeginFonction_1 \ BeginFonction_2 # define BeginPointeurFonction \ BeginFonction_2 \ /* Introduit le 20180425154540 pour 'v $xiipf/fonction.2$FON Fvariable' par exemple... */ #Aifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 #Eifdef DEFINITION_DE__BeginFonction__RETU_VERSION_02 /* Pour marquer le debut de la definition d'une fonction (introduit le 20040515111509). */ /* */ /* Le 20040603103829, la definition : */ /* */ /* #define BeginFonction \ */ /* VIDE */ /* */ /* a evolue dans le but de pouvoir detecter sans ambiguite le debut de la definition d'une */ /* fonction et de ses arguments grace a 'DebutDeDefinitionDeFonction' qui sera ensuite */ /* efface (grace a '$PASSE_5' avant la compilation...). */ /* */ /* Le 20051124091012, la definition : */ /* */ /* #define BeginFonction \ */ /* DebutDeDefinitionDeFonction */ /* */ /* a evolue dans le but de pouvoir memoriser le nom de la fonction courante... */ /* */ /* On notera bien que la valeur de 'NomDeLaFonctionCourante' est une chaine de caracteres */ /* et qu'elle est donc "double-quotee". C'est cela qui justifie l'usage qui en est fait */ /* dans 'v $ximcf/conformes$FON NomDeLaFonctionCourante.QD@@__.'... */ /* */ /* La "VERSION_02" a ete introduite le 20180411104621 et on notera l'ordre "illogique" : */ /* */ /* &define CompteurDeLaFonctionCourante (...) */ /* &define NomDeLaFonctionCourante */ /* */ /* impose par le fait que 'NomDeLaFonctionCourante' doit etre imperativement la derniere */ /* procedure appelee avant la declaration de la fonction. L'ordre correct : */ /* */ /* &define NomDeLaFonctionCourante */ /* &define CompteurDeLaFonctionCourante (...) */ /* CompteurDeLaFonctionCourante; */ /* */ /* est retabli par 'v $xcc/cpp$Z 20180411121208'... */ TypedefP(gFonction,VIDE) TypedefS(Fonction,BeginFonction gFonction) TypedefS(E___Fonction,gFonction) /* Pour introduire une fausse fonction dans un fichier de type "defines". */ /* ATTENTION : seules les 'FonctionP' seront declarables en type 'POINTERp', */ /* afin d'eviter des erreurs de type lorsqu'une fonction "image" est argument */ /* d'une autre fonction... */ TypedefT(gFonctionV,Void) TypedefS(FonctionV,BeginFonction gFonctionV) TypedefS(E___FonctionV,gFonctionV) TypedefT(gFonctionC,CHAR) TypedefS(FonctionC,BeginFonction gFonctionC) TypedefS(E___FonctionC,gFonctionC) TypedefS(gFonctionP,genere_p) TypedefS(FonctionP,BeginFonction gFonctionP) TypedefS(E___FonctionP,gFonctionP) TypedefS(PointeurFonctionP,BeginPointeurFonction gFonctionP) TypedefS(E___PointeurFonctionP,gFonctionP) /* Pour 'v $xiipf/fonction.2$FON Fvariable' par exemple, le 20180425154540, le type */ /* 'PointeurFonctionP' a ete introduit (cela a demande la modification */ /* 'v $xcg/LArgTypFo$vv$Z Pointeur..Fonction.'). */ TypedefS(gFonctionIB,vrai_Int_de_base) TypedefS(FonctionIB,BeginFonction gFonctionIB) TypedefS(E___FonctionIB,gFonctionIB) /* Introduit le 20100317142723 en particulier pour 'Main(...)' et 'print_defaut(...)'. */ TypedefS(gFonctionI,Int) TypedefS(FonctionI,BeginFonction gFonctionI) TypedefS(E___FonctionI,gFonctionI) TypedefS(gFonctionUB,vrai_Positive_de_base) TypedefS(FonctionUB,BeginFonction gFonctionUB) TypedefS(E___FonctionUB,gFonctionUB) TypedefS(gFonctionU,LPositive) TypedefS(FonctionU,BeginFonction gFonctionU) TypedefS(E___FonctionU,gFonctionU) /* ATTENTION, jusqu'au 1996080100, il y avait : */ /* */ /* TypedefS(FonctionU,Positive) */ /* */ /* mais il faut etre homogene avec 'imageU'... */ TypedefS(gFonctionL,Logical) TypedefS(FonctionL,BeginFonction gFonctionL) TypedefS(E___FonctionL,gFonctionL) TypedefS(gFonctionF,Float) TypedefS(FonctionF,BeginFonction gFonctionF) TypedefS(E___FonctionF,gFonctionF) TypedefS(gFonctionD,Double) TypedefS(FonctionD,BeginFonction gFonctionD) TypedefS(E___FonctionD,gFonctionD) TypedefS(gFonctionJ,complexe) TypedefS(FonctionJ,BeginFonction gFonctionJ) TypedefS(E___FonctionJ,gFonctionJ) TypedefS(gFonctionHJ,hyper_complexe) TypedefS(FonctionHJ,BeginFonction gFonctionHJ) TypedefS(E___FonctionHJ,gFonctionHJ) TypedefS(gFonctionHHJ,hyper_hyper_complexe) TypedefS(FonctionHHJ,BeginFonction gFonctionHHJ) TypedefS(E___FonctionHHJ,gFonctionHHJ) /* Introduit le 20111201105002... */ TypedefS(gFonctionE,l_element) TypedefS(FonctionE,BeginFonction gFonctionE) TypedefS(E___FonctionE,gFonctionE) /* Introduit le 20040529121807 suite a la creation de 'v $xcg/LArgTypFo$vv$Z'... */ #ifdef DEFV_CAST_VERSION_01 # message "La version 'DEFV_CAST_VERSION_01' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_01 #Eifdef DEFV_CAST_VERSION_01 #ifdef DEFV_CAST_VERSION_02 # message "La version 'DEFV_CAST_VERSION_02' n'est plus disponible." #Aifdef DEFV_CAST_VERSION_02 #Eifdef DEFV_CAST_VERSION_02 #ifdef DEFV_CAST_VERSION_03 # define FonctionX(type) \ type \ /* Pour introduire une fausse fonction d'un type quelconque. */ #Aifdef DEFV_CAST_VERSION_03 #Eifdef DEFV_CAST_VERSION_03 #define EndFonction(type) \ &undef NomDeLaFonctionCourante&&& \ INITIALISATION_DE_LA_RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES \ &undef ValidationDesCouples_____VraiBeginFonction__EndFonction``type&&& \ /* Pour marquer la fin de la definition d'une fonction (introduit le 20040515111509). */ \ /* */ \ /* Le 20051124091012, la definition : */ \ /* */ \ /* #define BeginFonction \ */ \ /* VIDE */ \ /* */ \ /* a evolue dans le but de pouvoir memoriser le nom de la fonction courante... */ \ /* */ \ /* Le 20071115131928 a ete introduite la validation, via un {&define,&undef}, du couple */ \ /* {VraiBeginFonction,EndFonction}. */ \ /* */ \ /* Le 20071117085132 fut introduite la gestion des arguments implicites... */ #define EFonctionV \ EndFonction(TypeV) #define EFonctionC \ EndFonction(TypeC) #define EFonctionP \ EndFonction(TypeP) #define EPointeurFonctionP \ EndFonction(TypeP) #define EFonctionIB \ EndFonction(TypeIB) #define EFonctionI \ EndFonction(TypeI) #define EFonctionUB \ EndFonction(TypeUB) #define EFonctionU \ EndFonction(TypeU) #define EFonctionL \ EndFonction(TypeL) #define EFonctionF \ EndFonction(TypeF) #define EFonctionD \ EndFonction(TypeD) #define EFonctionJ \ EndFonction(TypeJ) #define EFonctionHJ \ EndFonction(TypeHJ) #define EFonctionHHJ \ EndFonction(TypeHHJ) #define EFonctionE \ EndFonction(TypeE) /* Introduit le 20040529121807 suite a la creation de 'v $xcg/LArgTypFo$vv$Z'... */ /* */ /* Avant le 20071116213833, les types ci-dessus etaient {V,C,P,I,U,L,F,D,J,HJ,E}. Mais */ /* a cause de 'v $xrk/rdn_walk.52$K .define...F.fonction.coordonnees.', le type 'F' de */ /* cette liste etait remplace par la definition de 'F(...)' dans '$xrk/rdn_walk.52$K', */ /* d'ou ces extensions 'Type...'. Notons au passage qu'il en etait de meme de 'I' (qui */ /* vaut 1 ('v $xil/defi_K1$vv$DEF .define...I') et d'autres peut-etre... */ /* */ /* Le 20100317142723 fut introduit 'FonctionIB' afin d'acceder a 'vrai_Int_de_base'... */ /* */ /* Le 20111201105002 fut introduit 'FonctionHHJ'... */ /* */ /* Le 20180425154540 fut introduit 'PointeurFonctionP' (cela a demande la modification */ /* 'v $xcg/LArgTypFo$vv$Z Pointeur..Fonction.'). */ #define EFonction(type) \ EndFonction(type) \ /* Permet de definir la fin d'une fonction. Le 'EndFonction' a ete introduit par symetrie */ /* avec 'BeginFonction' le 20040515111509. */ #define ARGUMENT_FACULTATIF(argument) \ argument \ /* Permet d'indiquer visuellement dans les arguments d'appels d'une fonction */ \ /* que l'un de ceux-ci (entre parentheses) est facultatif ; bien entendu, cela */ \ /* n'a de sens que pour le dernier... */ #define ARGUMENT_INUTILE \ ADRESSE_NON_DEFINIE \ /* Permet d'indiquer visuellement un argument inutile (on ne peut utiliser 'VIDE' a cause */ \ /* du compilateur qui n'accepte pas une zone argument vide...). Ceci est utilise par exemple */ \ /* dans '$xiidX/fonct.vA$FON' pour compatibilite avec '$xiidX/fonct$vv$FON'... */ \ /* */ \ /* ATTENTION, le 19990816153437, la valeur est passee de 'UNDEF' a 'ADRESSE_NON_DEFINIE' */ \ /* qui semble plus general, et surtout plus astucieux car cela peut correspondre a un */ \ /* pointeur nul comme cela s'est vu dans 'v $xil/defi_c1$vv$DEF gettimeofday'... */ #define FLOT__ARGUMENT_INUTILE \ FLOT(ARGUMENT_INUTILE) \ /* Permet d'indiquer visuellement un argument flottant inutile... */ #define ARGUMENT_INDIFFERENT(argument) \ argument \ /* Permet d'indiquer visuellement un argument inutile dans les cas ou l'on ne peut utiliser */ \ /* 'UNDEF' ('v $xiii/di_image$FON SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS'). */ #define ARGUMENT_ABSENT \ ADRESSE_NON_DEFINIE \ /* Permet d'indiquer visuellement un argument absent (on ne peut utiliser 'VIDE' a cause */ \ /* du compilateur qui n'accepte pas une zone argument vide...). */ \ /* */ \ /* ATTENTION, le 19990816153437, la valeur est passee de 'UNDEF' a 'ADRESSE_NON_DEFINIE' */ \ /* qui semble plus general, et surtout plus astucieux car cela peut correspondre a un */ \ /* pointeur nul comme cela s'est vu dans 'v $xil/defi_c1$vv$DEF gettimeofday'... */ #define FLOT__ARGUMENT_ABSENT \ FLOT(ARGUMENT_ABSENT) \ /* Permet d'indiquer visuellement un argument flottant absent (on ne peut utiliser 'VIDE' */ \ /* a cause du compilateur qui n'accepte pas une zone argument vide...). On notera que */ \ /* 'FLOT__ARGUMENT_ABSENT' et 'FLOT(ARGUMENT_ABSENT)' ont le meme nombre de caracteres, et */ \ /* afin de simplifier les mises a jour... ; cette definition a ete rajoutee a cause de */ \ /* 'SYSTEME_ES9000_AIX_CC' dans le fichier '$ximf/aleatoires$FON'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S A R G U M E N T S D ' U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ TypedefAES(Argument,A___ <><> ) /* Ce mot clef doit etre mis devant toutes les definitions des arguments d'une fonction. On */ /* notera la syntaxe tres particuliere 'A___ <><> ' destinee a obtenir la concatenation du */ /* prefixe 'A___' des arguments d'une fonction a un type quelconque ('Int', 'Float',...). */ /* Avant d'introduire cette notion, on trouvait 'TypedefP(Argument,VIDE)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E P O I N T E U R S D O N T L A V A L E U R */ /* N E P E U T E T R E C O N N U E Q U ' A L ' E X E C U T I O N : */ /* */ /*************************************************************************************************************************************/ #define NoMalloc \ Argument \ /* Ceci a ete introduit le 20150227141829 afin de pouvoir, par exemple, declarer des */ \ /* images sans leur allouer de memoire (dans le cas ou {dimX,dimY} ne sont pas encore */ \ /* connus). On ecrira ainsi (avec une syntaxe un peu speciale : 'INIS(DEFV(...))') : */ \ /* */ \ /* DEFV(Common,DEFV(NoMalloc,INIS(DEFV(image,ImageADefinirUlterieurement) */ \ /* ,ADRESSE_NON_ENCORE_DEFINIE */ \ /* ) */ \ /* ) */ \ /* ); */ \ /* */ \ /* puis, on ecrira ensuite (et ailleurs...) : */ \ /* */ \ /* DEFV(image,ImageDefinition); */ \ /* (...) */ \ /* EGAL(ImageADefinirUlterieurement,ImageDefinition); */ \ /* (...) */ \ /* EGAL(ImageADefinirUlterieurement,ADRESSE_PLUS_DEFINIE); */ \ /* */ \ /* qui definira proprement 'ImageADefinirUlterieurement' (grace a 'ImageDefinition' pour */ \ /* laquelle il y a eu allocation memoire...). */ #define BMalloc(pointeur_non_encore_defini,type) \ BblockV \ BDEFV(type,PointeurTemporaire_____`pointeur_non_encore_defini); \ /* Ceci doit etre inconditionnel a cause du 'BblockV' de 'BDEFV'... */ \ \ Test(IFOU(IFEQ(pointeur_non_encore_defini,ADRESSE_NON_ENCORE_DEFINIE) \ ,IFEQ(pointeur_non_encore_defini,ADRESSE_PLUS_DEFINIE) \ ) \ ) \ Bblock \ EGAL(pointeur_non_encore_defini,PointeurTemporaire_____`pointeur_non_encore_defini); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("un pointeur est deja defini alors qu'on veut le definir"); \ Eblock \ ETes #define EMalloc(pointeur_a_dereferencer,type) \ Test(IFET(IFNE(pointeur_a_dereferencer,ADRESSE_NON_ENCORE_DEFINIE) \ ,IFNE(pointeur_a_dereferencer,ADRESSE_PLUS_DEFINIE) \ ) \ ) \ Bblock \ EGAL(pointeur_a_dereferencer,ADRESSE_PLUS_DEFINIE); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("un pointeur a dereferencer n'est pas defini"); \ Eblock \ ETes \ \ EDEFV(type,PointeurTemporaire_____`pointeur_a_dereferencer); \ /* Ceci doit etre inconditionnel a cause du 'EblockV' de 'EDEFV'... */ \ EblockV /* Gestion (definition et dereferencement) d'un pointeur defini via 'NoMalloc'. Ceci a ete */ /* introduit le 20150227185652... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S R E T O U R S E T D E S C O D E S D ' E R R E U R : */ /* */ /*************************************************************************************************************************************/ #define RETU_VIDE \ RETU_comptage_acces_eventuel; \ VIDE \ /* Retour d'une 'FonctionV' (introduit le 20071130134247 afin que ces fonctions disposent */ \ /* malgre tout d'un 'RETU'...). */ #define INIT_ERROR \ DEFV(Int,INIT(CODE_ERREUR,OK)) \ /* Implantation de l'indicateur d'erreur local a chaque fonction, initialise sur */ \ /* "pas d'erreurs". ATTENTION : on aura interet a placer 'INIT_ERROR' en tete des variables */ \ /* locales, et ce au cas ou des couples ('BDEFV','EDEFV') suivraient. Enfin, on ne peut */ \ /* faire preceder 'INIT_ERROR' de 'BblockV', et faire suivre 'RETU_ERROR' de 'EblockV' car */ \ /* en effet, certaines procedures (telle 'ATTENDRE_AU_FEU_ROUGE(...)' contenue dans le */ \ /* fichier 'v $xiii/files$DEF') utilisent 'INIT_ERROR' sans 'RETU_ERROR'... */ #define CODE_ERROR(code_d_erreur) \ EGAL(CODE_ERREUR,gestion_de_la_liste_des_CODE_ERREUR_rencontres(code_d_erreur)) \ /* Positionnement du code d'erreur ; on notera l'absence de ";" a la fin de l'affectation, */ \ /* afin de permettre l'insertion de 'CODE_ERROR' dans un 'Test' par exemple, de meme que */ \ /* l'absence de : */ \ /* */ \ /* Bblock */ \ /* (...) */ \ /* Eblock */ \ /* */ \ /* pour la meme raison... */ \ /* */ \ /* La fonction 'gestion_de_la_liste_des_CODE_ERREUR_rencontres(...)' a ete introduite */ \ /* le 20110224151649. Elle est programmee de facon que : */ \ /* */ \ /* gestion_de_la_liste_des_CODE_ERREUR_rencontres(code_d_erreur)=code_d_erreur */ \ /* */ \ /* et ainsi, cette fonction semble neutre, alors qu'elle fait des "choses" (elle empile */ \ /* le code d'erreur courant...). */ #define RETU_ERROR \ RETU(CODE_ERREUR) \ /* Renvoi du code d'erreur courant pour chaque fonction. ATTENTION : on ne peut faire */ \ /* preceder 'INIT_ERROR' de 'BblockV', et faire suivre 'RETU_ERROR' de 'EblockV' car, en */ \ /* effet, certaines procedures (telle 'ATTENDRE_AU_FEU_ROUGE(...)' contenue dans le fichier */ \ /* 'v $xiii/files$DEF') utilisent 'INIT_ERROR' sans 'RETU_ERROR'... */ #define ABORT_Commande \ Bblock \ CALS(desallocation_memoire_des_format_EGAr()); \ /* Dedefinition des 'format_EGAr' utiles (introduit le 20180330132318)... */ \ \ EDITION_DE_LA_VALEUR_DES_COMPTEURS_DE_REFERENCE_LORS_DU__RETU_Commande; \ \ Exit(CODE_ERREUR); \ Eblock \ /* Introduit le 20180316104639 afin de remplacer des 'Exit(OK);'... */ #define CHECK_CODE_ERREUR \ Bblock \ Test(IFEXff(CODE_ERREUR,VALEUR_MINIMALE_DANS_UN_OCTET,VALEUR_MAXIMALE_DANS_UN_OCTET)) \ /* Le 19990930144100, j'ai decouvert un phenomene inattendu : 'RETU(...)' est donc utilise */ \ /* en sortie de toutes les 'BCommande(...)' ; l'argument de 'RETU(...)' devient lors du */ \ /* retour au 'C-Shell' la variable '$status'. Mais en fait alors que cet argument est un */ \ /* 'vrai_int_de_base', la variable '$status' n'en recupere que l'octet de poids le plus */ \ /* faible et suivant les SYSTEMEs celui est signe (sur 'SYSTEME_HP???_HPUX_CC' par exemple) */ \ /* et donc dans [-128,+127], ou non signe (sur 'SYSTEME_SG.*_CC' par exemple) et donc dans */ \ /* [0,255]. */ \ Bblock \ PRINT_ATTENTION("le 'CODE_ERREUR' est incompatible avec la gestion de la variable '$status'"); \ CAL1(Prer1("CODE_ERREUR.................... = %d\n",CODE_ERREUR)); \ CAL1(Prer0("la variable '$status' vaudra suivant les 'SYSTEME's :\n")); \ CAL1(Prer1("$status (cas non signe)........ = %d\n" \ ,ETLO(CODE_ERREUR,MOCD) \ ) \ ); \ CAL1(Prer1("$status (cas signe)............ = %d\n" \ ,SARS(SCRS(ETLO(CODE_ERREUR,MOCD),NBITOC),bSOU(NBITMO,NBITOC)) \ ) \ ); \ CAL1(Prer1("VALEUR_MINIMALE_DANS_UN_OCTET.. = %d\n",VALEUR_MINIMALE_DANS_UN_OCTET)); \ CAL1(Prer1("VALEUR_MAXIMALE_DANS_UN_OCTET.. = %d\n",VALEUR_MAXIMALE_DANS_UN_OCTET)); \ /* L'edition des parametres {VALEUR_MINIMALE_DANS_UN_OCTET,VALEUR_MAXIMALE_DANS_UN_OCTET} */ \ /* a ete introduite le 20041208115524 pour '$LACT17'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20230405181904 pour 'v $xil/defi_c1$vv$DEF CHECK_CODE_ERREUR', mais plus */ \ /* utilise dans ce contexte le 20230406093923... */ #define RETU_Commande \ Bblock \ Eclock("Duree d'execution totale",chronometrer_la_commande_courante); \ /* Edition eventuelle de la duree d'execution de la commande courante (introduite le */ \ /* 20170518115823)... */ \ /* */ \ /* ATTENTION : on notera que ce 'Eclock(...)' n'est pas au meme niveau de {Bblock,Eblock} */ \ /* que le 'Bclock(...)' associe ('v $xil/defi_c1$vv$DEF Bclock') associe : */ \ /* */ \ /* BCommande(...) <-- Bclock(...) */ \ /* Bblock */ \ /* (....) */ \ /* RETU_Commande; <-- Eclock(...) */ \ /* Eblock */ \ /* ECommande */ \ /* */ \ /* Cela parait donc quasiment impossible de les mettre au meme niveau. Au passage, c'est */ \ /* cela qui explique la suppression d'un 'Bblock' en tete de 'Bclock(...)' et d'un 'Eblock' */ \ /* en queue de 'Eclock(...)'. */ \ \ CALS(desallocation_memoire_des_format_EGAr()); \ /* Dedefinition des 'format_EGAr' utiles (introduit le 20180330132318)... */ \ \ EDITION_DE_LA_VALEUR_DES_COMPTEURS_DE_REFERENCE_LORS_DU__RETU_Commande; \ /* Introduit le 20130518213351... */ \ \ Test(IL_FAUT(editer_____liste_des_CODE_ERREUR_rencontres)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme1("Liste des codes d'erreur rencontres (dans l'ordre d'apparition)={%s}\n" \ ,liste_des_CODE_ERREUR_rencontres \ ) \ ); \ CALS(Fsauts_de_lignes(UN)); \ /* Edition optionnelle introduite le 20110224151649... */ \ /* */ \ /* On notera que dans la liste peuvent apparaitre des codes d'erreur "intermediaire" */ \ /* qui sont normaux et qui n'on pas de consequences quant au comportement de la commande. */ \ /* Ainsi, la commande '$xci/acces$X' voit la liste suivante editee : */ \ /* */ \ /* {0 0 0 0 0 0 0 8 8 8 0 0 0 0} */ \ /* */ \ /* alors que tout marche bien. Cela montre donc que l'on ne peut pas faire, par exemple, */ \ /* une recherche du maximum des valeurs contenues dans cette liste, puis donner a la */ \ /* variable 'CODE_ERREUR' la valeur de ce maximum afin de definir en retour '$status'. En */ \ /* effet dans ce cas, nous serions toujours en erreur, meme lorsque tout s'est bien passe, */ \ /* comme c'est le cas ici... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CHECK_CODE_ERREUR; \ /* Mis sous cette forme le 20230405181904... */ \ \ CALZ_FreCC(nom_de_la_commande_courante); \ /* Introduit le 20180407103647 meme si cela ne sert pas a grand chose... */ \ \ RETU_ERROR; \ Eblock \ /* Renvoi du code d'erreur courant d'une 'Commande'. Ceci a ete introduit le 19990930144100. */ \ /* et le 19991001090449 en ce qui concerne le 'PRINT_ATTENTION(...)'. */ \ /* */ \ /* Je rappelle le 20221115160404 que ce 'CODE_ERREUR' renvoye par 'RETU_ERROR' doit tenir */ \ /* sur un octet et donc etre dans [0,255]... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S C O D E S D ' E R R E U R : */ /* */ /*************************************************************************************************************************************/ Den36( /* On notera le 20170622135106 que l'on ne peut pas utiliser 'DeT36(...)' a cause de */ /* l'usage de 'INIS(...)' en tant que premier argument... */ INIS(_OK,ZERO) /* Lorsqu'une operation s'est bien terminee. */ ,_ERREUR01 /* Lors d'un "load_fichier", le fichier demande n'existe pas. */ ,_ERREUR02 /* Lors d'un "load_fichier", on ne peut acceder a l'etat du fichier. */ ,_ERREUR03 /* Lors d'un "load_fichier", le format (taille) n'est pas correct. */ ,_ERREUR04 /* Lors d'un "store_fichier", le fichier a creer existe deja. */ ,_ERREUR05 /* Lors d'un "store_fichier", le fichier a creer n'existe pas, */ /* et on ne peut le creer. */ ,_ERREUR06 /* Lors d'un "store_point", le point argument {X,Y} est hors-image. */ ,_ERREUR07 /* Lors d'une entree "STANDARD", le fichier recupere est vide (c'est-a-dire */ /* qu'il contient 'FICHIER_VIDE' octets). */ ,_ERREUR08 /* Lors d'un "size_fichier", le fichier demande n'existe pas. */ ,_ERREUR09 /* Lors d'un "size_fichier", on ne peut acceder a l'etat du fichier. */ ,_ERREUR10 /* Lors d'un "Fliste_Pelement", les chainages sont mauvais. */ ,_ERREUR11 /* Lors d'un "Fliste_Delement", le bloc a detruire n'est pas "auto-chaine". */ ,_ERREUR12 /* Lors d'un acces a un element (quelqu'il soit) d'une liste (ou d'une pile), */ /* l'adresse fournie est indefinie. */ ,_ERREUR13 /* Lors d'une lecture d'un fichier-image sur l'entree standard ("pipe"), */ /* le nombre d'octets lus est mauvais. */ ,_ERREUR14 /* Lors d'un acces en lecture/ecriture aux listes de substitution, la */ /* liste demandee n'est pas 'L_SUBSTITUTION_VARIABLE', 'L_SUBSTITUTION_ROUGE', */ /* 'L_SUBSTITUTION_VERTE' ou 'L_SUBSTITUTION_BLEUE'. */ ,_ERREUR15 /* Dans une transformee de Fourier mono-dimensionnelle, la dimension du */ /* vecteur definissant la fonction et sa transformee est erronee. */ ,_ERREUR16 /* Lors d'un "Fdelete_fichier", le fichier est en mode "lecture seule". */ ,_ERREUR17 /* Lors d'un "Fdelete_fichier", on ne peut acceder a l'etat. */ ,_ERREUR18 /* Une commande non implementee, ou incomplete est referencee. */ ,_ERREUR19 /* Dans une commande (par exemple 'v $xci/feu_attendre$K') un "time-out" a ete detecte. */ ,_ERREUR20 /* Le format d'un fichier 'SGI' est mauvais, ou ce fichier n'existe pas... */ ,_ERREUR21 /* Lors du pilotage d'un disque video, le code d'erreur mis en place dans deux situations */ /* differentes ; la premiere lorsque : */ /* */ /* CODE_ERROR(PREMIER_CARACTERE_ITb1(buffer_de_reception)); */ /* */ /* dans '$xiidP/fonct$vv$FON' est nul ; on lui substitue cette valeur arbitraire. La */ /* seconde, lorsque le nombre de caracteres recus du disque n'est pas le nombre attendu */ /* (a savoir 'LONGUEUR_DE_L_ACQUITTEMENT_DU_DISQUE')... */ ,_ERREUR22 /* Une commande (par exemple '$xci/Sdisplay_RVB$X' n'est pas disponible sur un certain */ /* SYSTEME -par exemple 'SYSTEME_SGO200A2_IRIX_CC'-). */ ,_ERREUR23 /* Code d'abort brutal d'un programme apres la detection d'une anomalie d'allocation */ /* memoire dans 'v $xiii/mono_image$FON ERREUR23' (ajoute le 19991129083831). */ ,_ERREUR24 /* Code d'abort brutal d'un programme apres la detection d'une anomalie d'allocation */ /* memoire dans 'v $xig/fonct$vv$FON allocation_memoire_avec_validation' (ceci a ete */ /* ajoute le 20000224152926). */ ,_ERREUR25 /* Une commande n'a pas fait correctement son travail (ceci a ete ajoute le 20000906101952 */ /* principalement pour 'v $xcg/remote.01$K ERREUR25'). */ ,_ERREUR26 /* Lors de 'Fstore_non_securise_fichier_non_formatte(...)' le nombre d'octets ecrits n'est */ /* pas correct (introduit le 20020522163359). */ ,_ERREUR27 /* Lors de 'IGload_image_au_format_SGI(...)' les dimensions de l'image au format 'SGI' */ /* n'est pas compatible avec '$formatI' (introduit le 20020909093225). */ ,_ERREUR28 /* Lors de 'IXpalette(...)' le mode demande n'est pas disponible (introduit pour '$LACT15' */ /* le 20021223110345). */ ,_ERREUR29 /* Code d'abort brutal d'un programme apres la detection d'une anomalie d'allocation */ /* memoire dans 'v $xig/fonct$vv$FON ERREUR29' lors de l'entree interactive d'une valeur */ /* (ceci a ete ajoute le 20051111130738). */ ,_ERREUR30 /* Code d'abort brutal d'un programme apres la detection d'une anomalie d'allocation */ /* memoire dans 'v $xig/fonct$vv$FON ERREUR30' lors de la detection des eventuels */ /* caracteres parasites apparaissant derriere la valeur des parametres (ceci a ete ajoute */ /* le 20051114142932). */ ,_ERREUR31 /* Un (le ?) "pipe" d'entree semble absent (introduit le 20110224094349). */ ,_ERREUR32 /* Le "pipe" de sortie semble absent (introduit le 20110224094349). */ ,_ERREUR33 /* Un ou plusieurs arguments non reconnus sont presents dans l'appel a une commande */ /* (introduit le 20110224110203). */ ,_ERREUR34 /* Un descripteur d'image 'X-Window' n'est pas valide et le '$K' appelant est donc aborte */ /* afin d'eviter que l'anomalie se propage (introduit le 20170620094311). */ ,DERNIERE_ERREUR ,codes_d_erreurs ); #define k___OK \ ENUM(_OK) \ /* ATTENTION : la constante 'OK' est pre-generee dans '$xcp/Konstantes$K'. */ #define ERREUR01 \ ENUM(_ERREUR01) #define ERREUR02 \ ENUM(_ERREUR02) #define ERREUR03 \ ENUM(_ERREUR03) #define ERREUR04 \ ENUM(_ERREUR04) #define ERREUR05 \ ENUM(_ERREUR05) #define ERREUR06 \ ENUM(_ERREUR06) #define ERREUR07 \ ENUM(_ERREUR07) #define ERREUR08 \ ENUM(_ERREUR08) #define ERREUR09 \ ENUM(_ERREUR09) #define ERREUR10 \ ENUM(_ERREUR10) #define ERREUR11 \ ENUM(_ERREUR11) #define ERREUR12 \ ENUM(_ERREUR12) #define ERREUR13 \ ENUM(_ERREUR13) #define ERREUR14 \ ENUM(_ERREUR14) #define ERREUR15 \ ENUM(_ERREUR15) #define ERREUR16 \ ENUM(_ERREUR16) #define ERREUR17 \ ENUM(_ERREUR17) #define ERREUR18 \ ENUM(_ERREUR18) #define ERREUR19 \ ENUM(_ERREUR19) #define ERREUR20 \ ENUM(_ERREUR20) #define ERREUR21 \ ENUM(_ERREUR21) #define ERREUR22 \ ENUM(_ERREUR22) #define ERREUR23 \ ENUM(_ERREUR23) #define ERREUR24 \ ENUM(_ERREUR24) #define ERREUR25 \ ENUM(_ERREUR25) #define ERREUR26 \ ENUM(_ERREUR26) #define ERREUR27 \ ENUM(_ERREUR27) #define ERREUR28 \ ENUM(_ERREUR28) #define ERREUR29 \ ENUM(_ERREUR29) #define ERREUR30 \ ENUM(_ERREUR30) #define ERREUR31 \ ENUM(_ERREUR31) #define ERREUR32 \ ENUM(_ERREUR32) #define ERREUR33 \ ENUM(_ERREUR33) #define ERREUR34 \ ENUM(_ERREUR34) #define PROBLEMES \ PRED(OK) \ /* Ce que renvoie une fonction lorsqu'il y a des problemes. */ #define CANNOT_OPEN \ PROBLEMES \ /* Valeur d'un "file_pointer" lorsqu'un "open" ne peut avoir lieu... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef OK \ k___OK /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E S T I O N D E L ' E S P A C E M E M O I R E : */ /* */ /*************************************************************************************************************************************/ #define EGAp(pointeur,chaine_allouee) \ EGAL(pointeur,chaine_allouee) \ /* Introduit le 20180321091304 pour initialiser un Pointeur et deplace le 20180323090738 */ \ /* depuis 'v $xil/defi_c1$vv$DEF'... */ #nodefine EGAq_VERSION_01(chaine_allouee) \ NEUT(chaine_allouee) #nodefine EGAq_VERSION_02(chaine_allouee) \ EGAL(pointeur_provisoire,chaine_allouee) #nodefine EGAq(chaine_allouee) \ EGAq_VERSION_01(chaine_allouee) /* Introduit le 20180323090929 afin de reperer dans un premier temps les chaines allouees */ /* qui ne sont pas attribuees explicitement a un pointeur... On notera le "q" qui suit dans */ /* l'alphabet le "p" de 'EGAp(...)'. */ /* */ /* La possibilite de changer de version a ete introduite le 20180323175430, en particulier */ /* a des fins de test (voir si ' EGAL(pointeur_provisoire,chaine_allouee)' etait compatible */ /* avec "tout le reste"...). */ /* */ /* A compter du 20180328144130, ces definitions n'ont plus d'interet... */ #nodefine EGAr_VERSION_01(chaine_allouee) \ NEUT(chaine_allouee) #nodefine EGAr_VERSION_02(chaine_allouee) \ EGAL(pointeur_provisoire,chaine_allouee) #nodefine EGAr(chaine_allouee) \ EGAr_VERSION_01(chaine_allouee) /* Introduit le 20180327104313 afin de poursuivre le traitement des chaines allouees qui */ /* ne sont pas attribuees explicitement a un pointeur... On notera le "r" qui suit dans */ /* l'alphabet le "q" de 'EGAq(...)'. */ /* */ /* Le 20180328112026, je note qu'il semble difficile d'aller plus loin dans cette operation */ /* ainsi qu'on le voit avec la tentative 'v $xig/fonct$vv$FON 20180328110513'... */ #define EGAs_VERSION_01(chaine_allouee) \ NEUT(chaine_allouee) #define EGAs_VERSION_02(chaine_allouee) \ EGAL(pointeur_provisoire,chaine_allouee) #define EGAs(chaine_allouee) \ EGAs_VERSION_01(chaine_allouee) /* Introduit le 20180331074153 afin de poursuivre le traitement des chaines allouees qui */ /* ne sont pas attribuees explicitement a un pointeur... On notera le "s" qui suit dans */ /* l'alphabet le "r" de 'EGAr(...)'. */ #define cMalo(taille_en_octets) \ tMalo(taille_en_octets,Char) \ /* Definition de l'allocateur memoire sur des caracteres 'Char'. */ #define ctMalo(chaine,taille_en_octets,type,compteur) \ Bblock \ EGAp(chaine,tMalo(taille_en_octets,type)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'CHAR' avec comptage (introduit */ \ /* le 20180316130210)... */ #define kMalo(taille_en_octets) \ tMalo(taille_en_octets,CHAR) \ /* Definition de l'allocateur memoire sur des caracteres 'CHAR' (introduit le 20051026144002 */ \ /* lors des tests du probleme 'v $xig/fonct$vv$FON 20051019113924'...). */ #define ckMalo(chaine,taille_en_octets,compteur) \ Bblock \ EGAp(chaine,kMalo(taille_en_octets)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'CHAR' avec comptage (introduit */ \ /* le 20180316130210)... */ #define iMalo(taille_en_octets) \ tMalo(taille_en_octets,Int) \ /* Definition de l'allocateur memoire sur des nombres entiers 'Int'. */ #define ciMalo(chaine,taille_en_octets,compteur) \ Bblock \ EGAp(chaine,iMalo(taille_en_octets)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'Int' avec comptage (introduit */ \ /* le 20180317090215)... */ #define pMalo(taille_en_octets) \ tMalo(taille_en_octets,PointerInt) \ /* Definition de l'allocateur memoire sur des nombres entiers de type pointeur 'PointerInt'. */ #define cpMalo(chaine,taille_en_octets,compteur) \ Bblock \ EGAp(chaine,pMalo(taille_en_octets)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'PointerInt' avec comptage */ \ /* (introduit le 20180317090215)... */ #define lMalo(taille_en_octets) \ tMalo(taille_en_octets,Logical) \ /* Definition de l'allocateur memoire sur des nombres logiques 'Logical'. */ #define clMalo(chaine,taille_en_octets,compteur) \ Bblock \ EGAp(chaine,lMalo(taille_en_octets)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'Logical' avec comptage (introduit */ \ /* le 20180317090215)... */ #define fMalo(taille_en_octets) \ tMalo(taille_en_octets,Float) \ /* Definition de l'allocateur memoire sur des nombres flottants 'Float'. */ #define cfMalo(chaine,taille_en_octets,compteur) \ Bblock \ EGAp(chaine,fMalo(taille_en_octets)); \ INCK(compteur); \ Eblock \ /* Definition de l'allocateur memoire sur des caracteres 'Float' avec comptage (introduit */ \ /* le 20180317090215)... */ #define AllocIn(dimension,type) \ tMalo(bMUL(dimension,SIZE(type)),type) \ /* Allocation de 'dimension' unites de type 'type'. On notera que cette fonction sera */ \ /* probablement utilisee sur les SYSTEMEs, tel 'SYSTEME_SUN4NCUBE2S_SUNOS_NCC', qui ont */ \ /* une memoire distribuee et pour lesquels, bien evidemment, les grandes structures (telles */ \ /* les images...) doivent etre reparties sur plusieurs processeurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E G E S T I O N D E S P R O C E S S U S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O T S C L E F S P O U R L E S C O M M A N D E S : */ /* */ /*************************************************************************************************************************************/ #define PREMIERE_ENTREE_DANS_LE_PROGRAMME_PRINCIPAL \ ZERO \ /* Indicateur de premiere entree dans le programme principal ; cela est utilise au cas ou */ \ /* il y aurait une "rerentree" (voir 'Iload_image_avec_redimensionnement_eventuel(...)'). */ #define NUMERO_ARGUMENT_COMMANDE \ INDEX0 \ /* Numero de l'argument contenant le nom de la commande. */ #define NOM_DE_LA_COMMANDE \ ITb0(arguments,NUMERO_ARGUMENT_COMMANDE) \ /* Nom de la commande. */ #define NUMERO_PREMIER_ARGUMENT \ SUCC(NUMERO_ARGUMENT_COMMANDE) \ /* Numero de l'argument contenant le premier argument. */ #define ARGUMENT_1 \ ITb0(arguments,NUMERO_PREMIER_ARGUMENT) \ /* Premier argument, */ #define ARGUMENT_2 \ ITb0(arguments,SUCC(NUMERO_PREMIER_ARGUMENT)) \ /* Deuxieme argument, */ #define ARGUMENT_3 \ ITb0(arguments,SUCC(SUCC(NUMERO_PREMIER_ARGUMENT))) \ /* Troisieme argument, */ #define ARGUMENT_4 \ ITb0(arguments,SUCC(SUCC(SUCC(NUMERO_PREMIER_ARGUMENT)))) \ /* Quatrieme argument. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S T I N E E S A N E P L U S V A L I D E R L E N O M B R E */ /* D E S A R G U M E N T S D E S C O M M A N D E S , S A U F D E C E L L E S Q U I */ /* N ' E N O N T P A S ( C ' E S T - A - D I R E Q U I E N O N T ' 0 ' ) : */ /* */ /*************************************************************************************************************************************/ /* Autrefois, il y avait ici des definitions du type : */ /* */ /* #define _____1 _____BEAUCOUP */ /* (...) */ /* #define _____nm _____BEAUCOUP */ /* (...) */ /* #define _____90 _____BEAUCOUP */ /* */ /* qui, elles-memes, remplacaient des definitions du type : */ /* */ /* #define _____nm nm */ /* */ /* avec : */ /* */ /* nm > 0 */ /* */ /* En fait, ces definitions etaient inutiles puisque le nombre d'arguments des commandes */ /* n'est plus valide (sauf lorsqu'il est nul). D'autre part, cela pouvait faire croire a */ /* certains que je definissais ici les nombres entiers d'une maniere "unique", tel ces */ /* peuplades primitives qui comptent : 1, 2, 3, beaucoup... */ #define _____0 \ ZERO \ /* On notera que '_____0' est le seul a avoir sa vraie valeur... */ #define _____BEAUCOUP \ CENT \ /* Des qu'il y a au moins un argument. On notera qu'avant, il y avait la definition */ \ /* suivante : */ \ /* */ \ /* #define _____BEAUCOUP \ */ \ /* MOIT(INFINI) */ \ /* */ \ /* en fait, cela a cree des difficultes considerables dans : */ \ /* */ \ /* #define BCommande(nombre_d_arguments,arguments) \ */ \ /* (...) \ */ \ /* & define NOMBRE`D`ARGUMENTS _____BEAUCOUP \ */ \ /* (...) */ \ /* */ \ /* car en effet, lors de 'PASSE_1', le '_____BEAUCOUP' ci-dessus est expanse, et fait alors */ \ /* beaucoup d'octets. Or a la fin de 'PASSE_3', il y a un appel a '$xcp/decoupage$X' dans */ \ /* '$xcc/cpp$Z'. L'expansion de '_____BEAUCOUP' se trouve alors decoupe en plusieurs lignes */ \ /* et ce sans le caractere de suite pour la definition de 'NOMBRE`D`ARGUMENTS' a prendre en */ \ /* compte lors de 'PASSE_4'. La seule solution (provisoire ?) que j'ai trouve a ce probleme */ \ /* delicat, est de raccourcir l'expansion de '_____BEAUCOUP', et donc de simplifier sa */ \ /* definition ; d'ou ce qu'il y a ci-dessus... */ \ /* */ \ /* Enfin, on notera que la valeur 'DIX_MILLE' choisie est tres superieure (volontairement) */ \ /* a ce que tolere le 'C-Shell' au niveau des arguments d'une commande (quelques milliers */ \ /* d'octets au maximum, ce qui correspond donc a quelques centaines d'arguments...). */ \ /* Le 1995072500, cette valeur a ete reduite a 'MILLE' pour des raisons de decoupage... */ \ /* */ \ /* Le 20230406122329, lors de la compilation de 'v $xcp/Konstantes$K', il a fallu de */ \ /* nouveau et pour les memes raisons d'expansion reduire la valeur de '_____BEAUCOUP' */ \ /* a 'CENT'. Cela est apparu apres 'v $xil/defi_c1$vv$DEF 20050905162854' qui a provoque */ \ /* l'augmentation de la longueur de certaines lignes precedant la definition de */ \ /* 'v $xil/defi_c1$vv$DEF NOMBRE.D.ARGUMENTS', la definition de 'NOMBRE_D_ARGUMENTS' se */ \ /* trouvant alors sur une ligne trop longue devant donc etre (mal...) decoupee... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E C O M M A N D E I N E X I S T A N T E : */ /* */ /*************************************************************************************************************************************/ #define COMMANDE_UNDEF \ CHAINE_UNDEF \ /* Est l'equivalent de 'UNDEF' pour les commandes. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D ' A C C E S A L ' E N V I R O N N E M E N T : */ /* */ /*************************************************************************************************************************************/ #define Gvar(variable) \ GvarDefaut(variable,VALEUR_D_UNE_VARIABLE_UNDEF) \ /* Recuperation d'une variable definie par 'setenv'... */ #define GvalDefaut(variable,valeur_par_defaut) \ COND(IFNE_chaine(Gvar(variable),VALEUR_D_UNE_VARIABLE_UNDEF) \ ,Conversion_Int(Gvar(variable)) \ ,valeur_par_defaut \ ) \ /* Recuperation de la valeur entiere d'une variable definie par 'setenv' avec valeur par */ \ /* defaut... */ #define Gval(variable) \ GvalDefaut(variable,NEXIST) \ /* Recuperation de la valeur entiere d'une variable definie par 'setenv'... */ #define Pvar(variable,valeur) \ PvarDefaut(variable,valeur) \ /* Mise d'une variable "chaine de caracteres" dans l'environnement (introduit le */ \ /* 20120214091937)... */ #define Pval(variable,valeur) \ PvarDefaut(variable,EGAs(chain_numero_exact(valeur))) \ /* Mise d'une variable "numerique" dans l'environnement (introduit le 20120214091937)... */ #define GIntDefaut(variable,valeur_par_defaut) \ GvalDefaut(variable,valeur_par_defaut) \ /* Recuperation de la valeur entiere d'une variable definie par 'setenv' avec valeur par */ \ /* defaut (introduite le 20180218191252...). */ #define GLogDefaut(variable,valeur_par_defaut) \ COND(IFNE_chaine(Gvar(variable),VALEUR_D_UNE_VARIABLE_UNDEF) \ ,Conversion_Logical(Gvar(variable)) \ ,valeur_par_defaut \ ) \ /* Recuperation de la valeur logique d'une variable definie par 'setenv' avec valeur par */ \ /* defaut (introduite le 20180218111846...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E U N I X ( C O M M A N D E S S Y S T E M E ) : */ /* */ /*************************************************************************************************************************************/ #TestADef BUG_SYSTEME_COMMANDE_SYSTEM_1 \ /* Malheureusement, la commande 'SYSTEM(...)' envoie son argument a 'sh' et non pas a 'csh'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I M P R E S S I O N : */ /* */ /* */ /* Utilisation standard : */ /* */ /* CAL1(Prer?(...)); */ /* CAL2(Prin?(...)); */ /* CAL3(Prme?(...)); */ /* */ /* */ /* Verification du bon usage par : */ /* */ /* trouve 'CAL[^1]\(Prer|CAL[^2]\(Prin|CAL[^3]\(Prme' */ /* */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_DE_CHIFFRES_DECIMAUX(nombre) \ bADD(POSI(LO1X(MAX2(nombre,UN))),UN) \ /* Nombre de chiffres necessaires pour representer en decimal le nombre argument. Ceci fut */ \ /* introduit le 20051210181429... */ \ /* */ \ /* Avant le 20060104162911, la definition precedente etait : */ \ /* */ \ /* bADD(INTE(LO1X(nombre)),UN) */ \ /* */ \ /* mais la nouvelle est plus prudente... */ #define PARAMETRER_LES_FORMATS_DES_EDITIONS_FLOTTANTES \ VRAI \ /* Introduit le 20060105120240... */ #define DEBUT_DES_Prin_ET_DES_Prer \ Bblock \ EGAL(PRINT_DEFAUT_____vient_d_apparaitre,FAUX); \ /* Dans tous les cas, on reinitialise 'PRINT_DEFAUT_____vient_d_apparaitre'... */ #define FIN_DES_Prin_ET_DES_Prer \ Eblock #define stream_Prin \ COND(IL_NE_FAUT_PAS(Prin_____changer_le_stream),STREAM_OUT,STREAM_ERREUR) \ /* Introduit le 20001105121808... */ #define DEBUT_DES_Prin(format) \ Bblock \ DEBUT_DES_Prin_ET_DES_Prer; \ PRINT_EN_TETE_Prin_Prer_Prme(Prin_____editer_les_messages_d_en_tete); #define FIN_DES_Prin(format) \ FIN_DES_Prin_ET_DES_Prer; \ Eblock /* Introduit le 20060105114747... */ #define fastPrin0(format) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin0(stream_Prin,NE_PAS_FLUSHER_LE_FILE,format)); \ FIN_DES_Prin(format); \ Eblock #define fastPrin1(format,x1) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin1(stream_Prin,NE_PAS_FLUSHER_LE_FILE,format,x1)); \ FIN_DES_Prin(format); \ Eblock #define fastPrin2(format,x1,x2) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin2(stream_Prin,NE_PAS_FLUSHER_LE_FILE,format,x1,x2)); \ FIN_DES_Prin(format); \ Eblock #define fastPrin3(format,x1,x2,x3) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin3(stream_Prin,NE_PAS_FLUSHER_LE_FILE,format,x1,x2,x3)); \ FIN_DES_Prin(format); \ Eblock #define fastPrin4(format,x1,x2,x3,x4) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin4(stream_Prin,NE_PAS_FLUSHER_LE_FILE,format,x1,x2,x3,x4)); \ FIN_DES_Prin(format); \ Eblock #define Prin0(format) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin0(stream_Prin,FLUSHER_LE_FILE,format)); \ FIN_DES_Prin(format); \ Eblock #define Prin1(format,x1) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin1(stream_Prin,FLUSHER_LE_FILE,format,x1)); \ FIN_DES_Prin(format); \ Eblock #define Prin2(format,x1,x2) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin2(stream_Prin,FLUSHER_LE_FILE,format,x1,x2)); \ FIN_DES_Prin(format); \ Eblock #define Prin3(format,x1,x2,x3) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin3(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3)); \ FIN_DES_Prin(format); \ Eblock #define Prin4(format,x1,x2,x3,x4) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin4(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4)); \ FIN_DES_Prin(format); \ Eblock #define Prin5(format,x1,x2,x3,x4,x5) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin5(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5)); \ FIN_DES_Prin(format); \ Eblock #define Prin6(format,x1,x2,x3,x4,x5,x6) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin6(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6)); \ FIN_DES_Prin(format); \ Eblock #define Prin7(format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin7(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7)); \ FIN_DES_Prin(format); \ Eblock #define Prin8(format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin8(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8)); \ FIN_DES_Prin(format); \ Eblock #define Prin9(format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin9(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9)); \ FIN_DES_Prin(format); \ Eblock #define Prin10(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin10(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA)); \ FIN_DES_Prin(format); \ Eblock #define Prin11(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin11(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB)); \ FIN_DES_Prin(format); \ Eblock #define Prin12(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin12(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC)); \ FIN_DES_Prin(format); \ Eblock #define Prin13(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin13(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD)); \ FIN_DES_Prin(format); \ Eblock #define Prin14(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin14(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE)); \ FIN_DES_Prin(format); \ Eblock #define Prin15(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin15(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF)); \ FIN_DES_Prin(format); \ Eblock #define Prin16(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG) \ Bblock \ DEBUT_DES_Prin(format); \ CALZ(FPrin16(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG)); \ FIN_DES_Prin(format); \ Eblock /* Definition des fonctions d'impression externe sur 'stdout' avec nombre d'arguments... */ /* ATTENTION : on notera l'introduction de la fonction 'Fflush(...)' ; elle est destinee */ /* a garantir que lors de sequences du type : */ /* */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* */ /* l'ordre des sorties (quelles que soient les redirections et les "pipes") soit le meme que */ /* celui qui est donne par cette sequence... */ &define GPrin0(format) \ FPrint(stream_Prin,format) &define GPrin1(format,x1) \ FPrint(stream_Prin,format,x1) &define GPrin2(format,x1,x2) \ FPrint(stream_Prin,format,x1,x2) &define GPrin3(format,x1,x2,x3) \ FPrint(stream_Prin,format,x1,x2,x3) &define GPrin4(format,x1,x2,x3,x4) \ FPrint(stream_Prin,format,x1,x2,x3,x4) &define GPrin5(format,x1,x2,x3,x4,x5) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5) &define GPrin6(format,x1,x2,x3,x4,x5,x6) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6) &define GPrin7(format,x1,x2,x3,x4,x5,x6,x7) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7) &define GPrin8(format,x1,x2,x3,x4,x5,x6,x7,x8) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8) &define GPrin9(format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9) &define GPrin10(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) &define GPrin11(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) &define GPrin12(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) &define GPrin13(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) &define GPrin14(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE) &define GPrin15(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF) &define GPrin16(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG) \ FPrint(stream_Prin,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD,xE,xF,xG) /* Definition des fonctions d'impression externe sur 'stdout' avec nombre d'arguments */ /* introduites le 20071228094627 specialement pour 'v $xci/genere$I GPrin'... */ /* */ /* On notera que l'on ne peut utiliser {Prin0(...),...,Prin16(...)} ci-dessus et ce a cause */ /* de 'v $xcc/cpp$Z .xcp.expressions.X' qui decoupe les lignes derriere les ";"s. Or les */ /* definitions des 'GPrin*(...)'s ci-dessus contiennent de nombreux ";"s. Il faut donc */ /* que ces definitions soient les plus breves possibles. D'ou evidemment de plus l'absence */ /* de {Bblock,Eblock}, de 'CALS(...)' et de ";" en bout de ligne... */ #define stream_Prer \ COND(IL_NE_FAUT_PAS(Prer_____changer_le_stream),STREAM_ERREUR,STREAM_OUT) \ /* Introduit le 20001105121808... */ #define DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(format) \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_utilise) \ ,chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete(format \ ,PRINT_DEFAUT_____vient_d_apparaitre \ ) \ ) \ ); \ /* Format reellement utilise dans les impressions. Dans le cas ou il vient d'y avoir un */ \ /* 'PRINT_DEFAUT(...)' et ou en plus le format courant commence par un 'K_LF', on le */ \ /* supprime en decalant le format d'un caractere car, en effet, 'PRINT_DEFAUT(...)' vient */ \ /* d'en faire un. Dans les cas contraires, le format demande est copie tel quel... */ \ /* */ \ /* ATTENTION : reference dans 'v $xcc/cpp$Z format_utilise'. */ \ \ DEBUT_DES_Prin_ET_DES_Prer; #define FIN_DE_COMPACTAGE_DES_K_LF_DES_Prer(format) \ FIN_DES_Prin_ET_DES_Prer; \ CALZ_FreCC(format_utilise); \ Eblock #define DEBUT_DES_Prer(format) \ Bblock \ DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); \ PRINT_EN_TETE_Prin_Prer_Prme(Prer_____editer_les_messages_d_en_tete); #define FIN_DES_Prer(format) \ FIN_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); \ Eblock /* Introduit le 20060105114747... */ #define fastPrer0(format) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin0(stream_Prer,NE_PAS_FLUSHER_LE_FILE,format_utilise)); \ FIN_DES_Prer(format); \ Eblock #define fastPrer1(format,x1) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin1(stream_Prer,NE_PAS_FLUSHER_LE_FILE,format_utilise,x1)); \ FIN_DES_Prer(format); \ Eblock #define fastPrer2(format,x1,x2) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin2(stream_Prer,NE_PAS_FLUSHER_LE_FILE,format_utilise,x1,x2)); \ FIN_DES_Prer(format); \ Eblock #define fastPrer3(format,x1,x2,x3) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin3(stream_Prer,NE_PAS_FLUSHER_LE_FILE,format_utilise,x1,x2,x3)); \ FIN_DES_Prer(format); \ Eblock #define fastPrer4(format,x1,x2,x3,x4) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin4(stream_Prer,NE_PAS_FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4)); \ FIN_DES_Prer(format); \ Eblock /* Definition des fonctions d'impression externe sur 'stderr' avec nombre d'arguments */ /* et dans leur version "rapide" (c'est-a-dire sans "flush"). */ #define Prer0(format) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin0(stream_Prer,FLUSHER_LE_FILE,format_utilise)); \ FIN_DES_Prer(format); \ Eblock #define Prer1(format,x1) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin1(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1)); \ FIN_DES_Prer(format); \ Eblock #define Prer2(format,x1,x2) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin2(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2)); \ FIN_DES_Prer(format); \ Eblock #define Prer3(format,x1,x2,x3) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin3(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3)); \ FIN_DES_Prer(format); \ Eblock #define Prer4(format,x1,x2,x3,x4) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin4(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4)); \ FIN_DES_Prer(format); \ Eblock #define Prer5(format,x1,x2,x3,x4,x5) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin5(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5)); \ FIN_DES_Prer(format); \ Eblock #define Prer6(format,x1,x2,x3,x4,x5,x6) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin6(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6)); \ FIN_DES_Prer(format); \ Eblock #define Prer7(format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin7(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7)); \ FIN_DES_Prer(format); \ Eblock #define Prer8(format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin8(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8)); \ FIN_DES_Prer(format); \ Eblock #define Prer9(format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin9(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8,x9)); \ FIN_DES_Prer(format); \ Eblock #define Prer10(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin10(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA)); \ FIN_DES_Prer(format); \ Eblock #define Prer11(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin11(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB)); \ FIN_DES_Prer(format); \ Eblock #define Prer12(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin12(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC)); \ FIN_DES_Prer(format); \ Eblock #define PrerD(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD) \ Bblock \ DEBUT_DES_Prer(format); \ CALZ(FPrin13(stream_Prer,FLUSHER_LE_FILE,format_utilise,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC,xD)); \ FIN_DES_Prer(format); \ Eblock /* Definition des fonctions d'impression externe sur 'stderr' avec nombre d'arguments... */ /* */ /* ATTENTION : on notera l'introduction de la fonction 'Fflush(...)' ; elle est destinee */ /* a garantir que lors de sequences du type : */ /* */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* Prer?(...); */ /* Prin?(...); */ /* */ /* l'ordre des sorties (quelles que soient les redirections et les "pipes") soit le meme que */ /* celui qui est donne par cette sequence... */ /* */ /* La procedure 'Prer10(...)' a ete introduite le 20051124111202... */ /* */ /* La procedure 'Prer11(...)' a ete introduite le 20070420113158... */ /* */ /* La procedure 'PrerD(...)' a ete introduite le 20181227121112... */ #define stream_Prme \ COND(IL_NE_FAUT_PAS(Prme_____changer_le_stream),STREAM_ERREUR,STREAM_OUT) \ /* Introduit le 20001105121808 afin de faciliter des ecritures du type : */ \ /* */ \ /* set VARIABLE=`COMMANDE$X Prme=VRAI` */ \ /* */ \ /* ou 'COMMANDE$X' est une commande sortant des messages via 'Prme?(...)'. */ /* ATTENTION, jusqu'au 20010319153838, les definitions de 'Prme?(...)' etaient du type : */ /* */ /* DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); */ /* CALS(FPrin?(stream_Prme,FLUSHER_LE_FILE,format_utilise...)); */ /* FIN_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); */ /* */ /* mais, contrairement aux 'Prer?(...)', ici il est necessaire de conserver la mise en page. */ #define DEBUT_DES_Prme(format) \ Bblock \ PRINT_EN_TETE_Prin_Prer_Prme(Prme_____editer_les_messages_d_en_tete); #define FIN_DES_Prme(format) \ Eblock /* Introduit le 20060105114747... */ #define Prme0(format) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin0(stream_Prme,FLUSHER_LE_FILE,format)); \ FIN_DES_Prme(format); \ Eblock #define Prme1(format,x1) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin1(stream_Prme,FLUSHER_LE_FILE,format,x1)); \ FIN_DES_Prme(format); \ Eblock #define Prme2(format,x1,x2) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin2(stream_Prme,FLUSHER_LE_FILE,format,x1,x2)); \ FIN_DES_Prme(format); \ Eblock #define Prme3(format,x1,x2,x3) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin3(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3)); \ FIN_DES_Prme(format); \ Eblock #define Prme4(format,x1,x2,x3,x4) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin4(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4)); \ FIN_DES_Prme(format); \ Eblock #define Prme5(format,x1,x2,x3,x4,x5) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin5(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5)); \ FIN_DES_Prme(format); \ Eblock #define Prme6(format,x1,x2,x3,x4,x5,x6) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin6(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6)); \ FIN_DES_Prme(format); \ Eblock #define Prme7(format,x1,x2,x3,x4,x5,x6,x7) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin7(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7)); \ FIN_DES_Prme(format); \ Eblock #define Prme8(format,x1,x2,x3,x4,x5,x6,x7,x8) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin8(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8)); \ FIN_DES_Prme(format); \ Eblock #define Prme9(format,x1,x2,x3,x4,x5,x6,x7,x8,x9) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin9(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9)); \ FIN_DES_Prme(format); \ Eblock #define Prme10(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin10(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA)); \ FIN_DES_Prme(format); \ Eblock #define Prme11(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin11(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB)); \ FIN_DES_Prme(format); \ Eblock #define Prme12(format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC) \ Bblock \ DEBUT_DES_Prme(format); \ CALZ(FPrin12(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9,xA,xB,xC)); \ FIN_DES_Prme(format); \ Eblock /* Definition des fonctions d'impression externe sur 'stderr' avec nombre d'arguments mais */ /* qui ne sont pas des sorties d'erreur. Il s'agira de sortie de messages qui ne doivent */ /* pas interferer avec 'stdout'. */ /* */ /* ATTENTION : j'ai decouvert le 19990603190104 que ces procedures 'Prme?(...)' ont un */ /* inconvenient relativement important. En effet, utilisees dans un certain programme, */ /* l'ecriture : */ /* */ /* set VARIABLE=`PROGRAMME ARGUMENTS` */ /* */ /* ne fonctionne pas s'il s'agit de recuperer des objets edites par 'Prme?(...)' car, en */ /* effet, l'utilisation des '$K_QA' ne permet de recuperer que ce qui sort sur 'stdout'. */ /* Or, les procedures 'Prme?(...)' utilisent 'stderr'. Donc leur utilisation ne pourra */ /* qu'etre faite qu'avec precaution et en fonction d'une utilisation ulterieure. On pourra */ /* voir a ce propos 'v $xci/extrema$K Prin' utilise dans 'v $xci/acces_RVB.12$Z extrema'. */ /* */ /* Le 19990607090645, j'ai trouve la solution ; il suffit d'ecrire : */ /* */ /* set VARIABLE=`PROGRAMME ARGUMENTS |& $CA` */ /* */ /* pour recuperer ce qui sort de 'Prme?(...)'... */ /* */ /* Le 20001105121808, j'ai trouve une autre solution qui a consiste a introduire l'option */ /* */ /* Prme=VRAI */ /* */ /* via 'v $xig/fonct$vv$DEF Prme='. */ /* */ /* ATTENTION, jusqu'au 20010319153838, les definitions de 'Prme?(...)' etaient du type : */ /* */ /* DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); */ /* CALS(FPrin?(stream_Prme,FLUSHER_LE_FILE,format_utilise...)); */ /* FIN_DE_COMPACTAGE_DES_K_LF_DES_Prer(format); */ /* */ /* mais, contrairement aux 'Prer?(...)', ici il est necessaire de conserver la mise en page. */ /* */ /* Le 20081002143733 furent introduits 'Prme10(...)' (pour 'v $xci/histogramme$K Prme10' a */ /* priori...) et 'Prme11(...)'. */ /* */ /* Le 20090602082251 furent introduits 'Prme12(...)' (pour 'v $xci/histogramme$K Prme12' a */ /* priori...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E L ' U T I L I S A T I O N O P T I M I S E E E T O P T I O N N E L L E D U ' GooF ' : */ /* */ /*************************************************************************************************************************************/ /* Le nom 'UTILISER_A_PRIORI__LE_GooF(...)', trop long, fut change en 'USE_GooF(...)' */ /* le 20080106084802... */ /* */ /* Le 20080106183801, fut "subdivisee" en deux 'USe_GooF(...)' et 'USs_GooF(...)' suivant */ /* l'usage qui en est fait... */ #ifdef PRAGMA_CPP_____AUTORISER_LE_GooF # define USe_GooF(expression) \ ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF \ \ expression \ \ DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF \ /* Procedure introduite le 20080105225133 permettant de disposer de l'Expression */ \ /* 'expression' en utilisant le 'GooF'... */ # define USs_GooF(sequence) \ Bblock \ USe_GooF(BLOC(sequence)); \ Eblock \ /* Procedure introduite le 20080105225133 permettant de disposer de la Sequence */ \ /* 'sequence' en utilisant le 'GooF'... */ # define USe_GooF______CONDITIONNEL(utiliser_le_GooF,expression) \ COND(IL_FAUT(utiliser_le_GooF) \ ,USe_GooF(expression) \ ,expression \ ) \ /* Procedure introduite le 20080110082529 et destinee a disposer de deux versions de */ \ /* l'expression 'expression' : la premiere utilisant le 'GooF' et la seconde ne */ \ /* l'utilisant pas. */ # define USs_GooF______CONDITIONNEL(utiliser_le_GooF,sequence) \ Bblock \ Test(IL_FAUT(utiliser_le_GooF)) \ Bblock \ USs_GooF(BLOC(sequence)); \ Eblock \ ATes \ Bblock \ BLOC(sequence); \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20071103133020 et destinee a disposer de deux versions de la */ \ /* sequence 'sequence' : la premiere utilisant le 'GooF' et la seconde ne l'utilisant pas. */ \ /* Cette optimisation (issue de 'v $xrv/densite.01$K USs_GooF______CONDITIONNEL' a cette */ \ /* date) permet de ne pas etre penalise par la perte de performance impliquee par le 'GooF'. */ \ /* On pourra donc introduire sans aucune difficulte le 'GooF' a l'interieur de nombreuses */ \ /* fonctions et cela sans avoir a dupliquer "manuellement" les suites d'instructions sur */ \ /* lesquelles le 'GooF' portera... */ \ /* */ \ /* Le 20080110082529 le nom 'UTILISER_EN_OPTION_LE_GooF(...)' fut change en le nom */ \ /* 'USs_GooF______CONDITIONNEL(...)' (de meme longueur afin de simplifier la mise a jour */ \ /* au niveau de la mise en page). Cela est d'une part plus "symetrique" avec 'USs_GooF(...)' */ \ /* et permet l'introduction a la meme date de ''USs_GooF______CONDITIONNEL(...)' d'autre */ \ /* part... */ \ /* */ \ /* Le 20080110135837, on notera le rapport de performance entre la non activation du 'GooF' */ \ /* et son activation sur le tests suivant sur '$LACT18' (au format 'Pal') : */ \ /* */ \ /* $xci/gauss$X standard=FAUX gauss_arithmetique_de_base=VRAI */ \ /* */ \ /* qui donne une duree de 0.264 et : */ \ /* */ \ /* $xci/gauss$X standard=FAUX gauss_arithmetique_etendue=VRAI */ \ /* */ \ /* qui donne une duree de 5.016, soit un facteur de ralentissement de pratiquement 20, ce */ \ /* qui n'est pas si dramatique que cela. Grace a 'v $xig/fonct$vv$DEF 20080111092552', cette */ \ /* duree est passee le 20080111100347 a 2.028, d'ou un nouveau facteur de ralentissement */ \ /* de moins de 8, ce qui n'est pas si mauvais que cela. Le 20080111145152, nouvelle */ /* amelioration grace a 'v $xil/defi_K2$vv$DEF 20080111142631' ; la duree de calcul en */ /* mode arithmetique etendue est passee a 1.856, soit un rapport de 7... */ #Aifdef PRAGMA_CPP_____AUTORISER_LE_GooF # define USe_GooF(expression) \ expression \ /* Procedure introduite le 20080105225133... */ \ /* */ \ /* ATTENTION : il est evidemment impossible de mettre ici un 'PRINT_ATTENTION(...)'... */ # define USs_GooF(sequence) \ Bblock \ USe_GooF(BLOC(sequence)); \ Eblock \ /* Procedure introduite le 20080106183801... */ \ /* */ \ /* Le 20080128100911, le message : */ \ /* */ \ /* PRINT_ATTENTION("le 'GooF' n'est pas autorise ici et n'est donc pas utilisable (1)"); */ \ /* */ \ /* a ete supprime "par symetrie" avec 'USs_GooF______CONDITIONNEL(...)' ci-apres... */ # define USe_GooF______CONDITIONNEL(utiliser_le_GooF,expression) \ expression \ /* Procedure introduite le 20080110082529... */ \ /* */ \ /* ATTENTION : il est evidemment impossible de mettre ici un 'PRINT_ATTENTION(...)'... */ # define USs_GooF______CONDITIONNEL(utiliser_le_GooF,sequence) \ Bblock \ BLOC(sequence); \ Eblock \ /* Procedure introduite le 20071103133020... */ \ /* */ \ /* Le 20080128100911, le message : */ \ /* */ \ /* PRINT_ATTENTION("le 'GooF' n'est pas autorise ici et n'est donc pas utilisable (2)"); */ \ /* */ \ /* a ete supprime a cause de 'v $xrv/champs_5.26$I USs_GooF______CONDITIONNEL' car, en */ \ /* effet, tous les '$K' de '$xr' (et en fait surtout de '$xrs') n'autorisent pas le 'GooF'. */ #Eifdef PRAGMA_CPP_____AUTORISER_LE_GooF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A P P E L C O N D I T I O N N E L D E T Y P E " S O U S - P R O G R A M M E " D ' U N E F O N C T I O N : */ /* */ /*************************************************************************************************************************************/ #define gCALC(condition,sequence_si_VRAI,sequence_si_FAUX) \ Bblock \ Test(EST_VRAI(condition)) \ Bblock \ BLOC(sequence_si_VRAI); \ Eblock \ ATes \ Bblock \ BLOC(sequence_si_FAUX); \ Eblock \ ETes \ Eblock \ /* Pour effectuer le choix entre deux appels, et plus generalement entre deux sequences. */ #define EXECUTER_LES_CALC \ VRAI #define NE_PAS_EXECUTER_LES_CALC \ NOTL(EXECUTER_LES_CALC) /* Valeurs possibles de l'ensemble des indicateurs 'executer_les_CALi' qui sont definis */ /* dans '$xig/common$STR'. */ #define CALC(fonction,appeler_la_fonction) \ Bblock \ gCALC(IL_FAUT(appeler_la_fonction) \ ,BLOC(CALS(fonction);) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Pour effectuer l'appel conditionnel d'une fonction comme un sous-programme (type */ \ /* FORTRAN) suivant l'etat d'un indicateur de controle. */ #define CAL1(fonction) \ Bblock \ CALC(fonction,CAL1_____executer); \ Eblock \ /* Appel conditionnel par 'CAL1_____executer' d'une fonction comme un sous-programme. */ \ /* L'utilisation actuelle est la suivante : */ \ /* */ \ /* CAL1(...) : conditionne tous les appels aux fonctions 'Prer?(...)'. */ \ /* */ \ /* Cela concerne donc aussi : */ \ /* */ \ /* PRINT_ATTENTION(...) */ \ /* PRINT_DEFAUT(...) */ \ /* PRINT_ERREUR(...) */ \ /* */ #define CAL2(fonction) \ Bblock \ CALC(fonction,CAL2_____executer); \ Eblock \ /* Appel conditionnel par 'CAL2_____executer' d'une fonction comme un sous-programme. */ \ /* L'utilisation actuelle est la suivante : */ \ /* */ \ /* CAL2(...) : conditionne tous les appels aux fonctions 'Prin?(...)'. */ \ /* */ #define CAL3(fonction) \ Bblock \ CALC(fonction,CAL3_____executer); \ Eblock \ /* Appel conditionnel par 'CAL3_____executer' d'une fonction comme un sous-programme. */ \ /* L'utilisation actuelle est la suivante : */ \ /* */ \ /* CAL3(...) : conditionne tous les appels aux fonctions 'Prme?(...)'. */ \ /* */ #define CAL4(fonction) \ Bblock \ CALC(fonction,CAL4_____executer); \ Eblock \ /* Appel conditionnel par 'CAL4_____executer' d'une fonction comme un sous-programme. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S M E S S A G E S D ' E R R E U R S : */ /* */ /*************************************************************************************************************************************/ =define MESSAGE_S C_VIDE /* Ceci est un message Secondaire a editer dans 'PRINT_ERREUR', 'PRINT_ATTENTION' et */ /* 'PRINT_DEBUG' ; il est initialise vide, mais peut etre modifie en permanence par une */ /* suite de deux directives '=undef MESSAGE_S' et '=define MESSAGE_S...' ; de plus, */ /* il est defini par '=define' et non pas '#define' afin de pouvoir etre lui-meme genere */ /* par une macro, il doit donc tenir sur une seule ligne (c'est plus prudent), d'ou le */ /* nom tres court qui lui est donne ('MESSAGE_S')... */ #define MESSAGE_T \ C_VIDE \ /* Ceci est un message Tertiaire a editer dans 'PRINT_ERREUR', 'PRINT_ATTENTION' et */ \ /* 'PRINT_DEBUG' ; il est toujours VIDE, mais a ete introduit a cause de 'PRINT_MESSAGE'. */ #define EDITER_LES_MESSAGES_DE_PRINT_MESSAGE \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_MESSAGE \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_MESSAGE) /* Valeurs possibles de l'indicateur 'PRINT_MESSAGE_____editer_les_messages' defini */ /* dans 'v $xig/common$STR'. */ #define PRINT_MESSAGE(message1,message2) \ Bblock \ Test(IFNE_chaine(message2,C_VIDE)) \ Bblock \ PRINT_DEFAUT(MESSAGE_DE_MESSAGE,message1,message2,PRINT_MESSAGE_____editer_les_messages); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Macro d'edition de deux messages si 'message2' n'est pas VIDE et inhibable par */ \ /* 'CAL1_____executer' (via 'gPRINT_DEFAUT(...)'). */ #define EDITER_LES_MESSAGES_DE_PRINT_ATTENTION \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_ATTENTION \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_ATTENTION) /* Valeurs possibles de l'indicateur 'PRINT_ATTENTION_____editer_les_messages' defini */ /* dans 'v $xig/common$STR'. */ #define PRINT_ATTENTION(message) \ Bblock \ PRINT_DEFAUT(MESSAGE_D_ATTENTION,message,MESSAGE_T,PRINT_ATTENTION_____editer_les_messages); \ Eblock \ /* Macro d'edition d'un message d'attention inhibable par 'CAL1_____executer'. */ #define EDITER_LES_MESSAGES_DE_PRINT_AVERTISSEMENT \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_AVERTISSEMENT \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_AVERTISSEMENT) /* Valeurs possibles de l'indicateur 'PRINT_AVERTISSEMENT_____editer_les_messages' defini */ /* dans 'v $xig/common$STR'. Ce nouvel indicateur a ete ajoute le 19990210110724 afin de */ /* (implicitement) tous les messages du type 'PRINT_ATTENTION(...)' qui sortent avec les */ /* programmes de '$xrv' en particulier, et par exemple : */ /* */ /* "'ne=' doit etre defini avant toute entree de fichiers" */ /* "'saut=' doit etre defini avant toute entree de fichiers" */ /* */ /* et qui sont finalement assez inutiles... */ #define PRINT_AVERTISSEMENT(message) \ Bblock \ PRINT_DEFAUT(MESSAGE_D_AVERTISSEMENT,message,MESSAGE_T,PRINT_AVERTISSEMENT_____editer_les_messages); \ Eblock \ /* Macro d'edition d'un message d'avertissement inhibable par 'CAL1_____executer'. */ #define EDITER_LES_MESSAGES_DE_PRINT_ERREUR \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_ERREUR \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_ERREUR) /* Valeurs possibles de l'indicateur 'PRINT_ERREUR_____editer_les_messages' defini */ /* dans 'v $xig/common$STR'. */ #define PRINT_ERREUR(message) \ Bblock \ PRINT_DEFAUT(MESSAGE_D_ERREUR,message,MESSAGE_T,PRINT_ERREUR_____editer_les_messages); \ Eblock \ /* Macro d'edition d'un message d'erreur inhibable par 'CAL1_____executer'. */ #define EDITER_LES_MESSAGES_DE_PRINT_DEBUG \ VRAI #define NE_PAS_EDITER_LES_MESSAGES_DE_PRINT_DEBUG \ NOTL(EDITER_LES_MESSAGES_DE_PRINT_DEBUG) /* Valeurs possibles de l'indicateur 'PRINT_DEBUG_____editer_les_messages' defini */ /* dans 'v $xig/common$STR'. */ #define PRINT_DEBUG(message) \ Bblock \ DEBU(PRINT_DEFAUT(MESSAGE_DE_DEBUG,message,MESSAGE_T,PRINT_DEBUG_____editer_les_messages);); \ Eblock \ /* Macro d'edition d'un message de debug inhibable par 'CAL1_____executer'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R U T I L I S E R L E C H R O N O M E T R E " C L O C K " E N S E C O N D E S : */ /* */ /*************************************************************************************************************************************/ #define CHRONOMETRAGE_D_UN_BLOC(nom_du_BLOC,BLOC_a_chronometrer,chronometrer_le_BLOC) \ Bblock \ Bclock(nom_du_BLOC,chronometrer_le_BLOC); \ BLOC(BLOC_a_chronometrer); \ Eclock(nom_du_BLOC,chronometrer_le_BLOC); \ Eblock \ /* Chronometrage d'un 'BLOC'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S U N I T E S D E T E M P S : */ /* */ /*************************************************************************************************************************************/ #define IMAGES_PAR_SECONDE \ VINGT_CINQ \ /* Nombre d'images par seconde. */ #define milli_secondes \ MILLE \ /* Nombre de milli-secondes dans une seconde. */ #define micro_secondes \ MILLION \ /* Nombre de micro-secondes dans une seconde. */ #define nano_secondes \ MILLIARD \ /* Nombre de nano-secondes dans une seconde. */ #define SECONDES_PAR_MINUTE \ SOIXANTE \ /* Nombre de secondes par minute. */ #define MINUTES_PAR_HEURE \ SOIXANTE \ /* Nombre de minutes par heure. */ #define HEURES_PAR_JOUR \ VINGT_QUATRE \ /* Nombre d'heures par jour. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S L I S T E S ( P R E M I E R T Y P E ) : */ /* */ /* */ /* Definitions : */ /* */ /* On definit ici les structures de */ /* la gestion des listes ; d'une part */ /* l'en-tete (ou "header") qui con- */ /* tient les chainages et la taille */ /* (ou "volume") des octets d'infor- */ /* mation, et d'autre part les infor- */ /* mations utiles memorisees dans cet */ /* element (sous forme d'un tableau */ /* de "CHAR"). Enfin, une clef de */ /* validation est inseree afin de */ /* valider chaque acces a un element */ /* de liste... */ /* */ /* */ /* ATTENTION : */ /* */ /* Ces definitions doivent etre imperativement */ /* ici, et non pas dans '$xig/fonct$vv$DEF', car */ /* les types alors definis sont utilises dans des */ /* fichiers du type '$EXT' avant que le fichier */ /* '$xig/fonct$vv$DEF' ne soit pris en compte... */ /* */ /*************************************************************************************************************************************/ TypedefP(l_header,STRU(liste_header)) TypedefS(A___l_header,l_header) TypedefS(E___l_header,l_header) /* 'l_header' permet de definir l'en-tete de chainage d'un element */ /* de liste vers son predecesseur et son successeur respectivement. */ TypedefP(l_element,STRU(list_element)) TypedefS(A___l_element,l_element) TypedefS(E___l_element,l_element) /* 'l_element' permet de definir un element de liste, c'est-a-dire l'en-tete */ /* et les informations utiles ; mais il doit preceder la definition de la structure */ /* 'liste_header' pour des raisons de recursivite... */ Dstruct04(liste_header ,DEFV(l_element,POINTERs(precedent_chainage)) /* Pointeur vers l'element precedent ("BACKWARD"). */ ,DEFV(l_element,POINTERs(suivant_chainage)) /* Pointeur vers l'element suivant ("FORWARD"). */ ,DEFV(Int,clef_validation) /* Cette entree doit toujours contenir la meme information... */ ,DEFV(Positive,volume) /* Cette entree contient la longueur en octets des informations memorisees */ /* dans cet element de liste. */ ,NOM_VIDE ); #define v_element \ SLLS(BIT,NBITOC) \ /* Nombre d'octets maximal que pourra memoriser un element de liste. */ Dstruct02(list_element ,DEFV(l_header,header) /* En-tete de chainage d'un element de liste. */ ,DEFV(CHAR,DTb1(informations,v_element)) /* Pour contenir les informations que memorise la liste. */ ,NOM_VIDE ); /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S L I S T E S ( D E U X I E M E T Y P E ) : */ /* */ /* */ /* Definitions : */ /* */ /* On definit ici des structures et des */ /* procedures de gestion de listes d'emploi */ /* plus generales que celles du premier */ /* type. En particulier il est possible */ /* de definir les chainages, les descripteurs */ /* de liste, les fonctions d'acces, de */ /* creation, de destruction et enfin de */ /* parcours... */ /* */ /*************************************************************************************************************************************/ #define DEFINITION_D_UNE_STRUCTURE_DE_CHAINAGE(liste,structure) \ Dstruct03($liste \ ,DEFV(structure,POINTERs(suivant)) \ ,DEFV(structure,POINTERs(precedent)) \ ,DEFV(Logical,chainage) \ ,NOM_VIDE \ ); \ Typedef(liste,STRU($liste)) \ /* Definition d'une structure de liste avec chainage avant et arriere. Ce bloc peut bien */ \ /* entendu etre insere dans des structures plus complexes... */ \ /* */ \ /* Le 20031103105541 l'indicateur 'chainage' a ete introduit ; il est a l'etat 'VALIDE' */ \ /* des 'gINSERTION_ELEMENT(...)' et par 'gDESTRUCTION_ELEMENT(...)' a l'etat 'INVALIDE'. */ \ /* Cela signifie de plus que la memoire allouee n'est plus jamais rendue. Cela peut sembler */ \ /* peu economique, mais cela est justifie par certains usages qui est fait de la procedure */ \ /* 'PARCOURS_D_UNE_LISTE(...)'. Ainsi 'v $xrq/nucleon.LH$I STRONG_TRANSFORMATION_GxG___G', */ \ /* par exemple, l'utilise et la sequence d'instruction 'sequence' contient deux ordres de */ \ /* destruction ce qui rend dans certaines circonstances 'element_suivant' non fiable. Soit */ \ /* le cas suivant de liste : */ \ /* */ \ /* */ \ /* element_courant element_suivant */ \ /* */ \ /* | | */ \ /* | | */ \ /* \|/ \|/ */ \ /* */ \ /* --------- --------- --------- --------- */ \ /* | | | | | | | | */ \ /* --> | | --> | gluonD1 | --> | gluonD2 | --> | | -->... */ \ /* | | | | | | | | */ \ /* --------- --------- --------- --------- */ \ /* | | /|\| */ \ /* | | | | */ \ /* | ----------------- | */ \ /* | "D2 voisin de D1" | */ \ /* | | */ \ /* \|/ \|/ */ \ /* */ \ /* 'gluonD1' et 'gluonD2' sont alors detruits */ \ /* */ \ /* */ \ /* Alors, 'element_suivant' n'a plus de sens et donc lors du parcours, le prochain element */ \ /* courant (qui est l'actuel element suivant) ne sera plus valide... */ #define SUIVANT_DANS_UNE_LISTE(element_courant) \ ASD1(element_courant,suivant) #define PRECEDENT_DANS_UNE_LISTE(element_courant) \ ASD1(element_courant,precedent) /* Procedures d'acces aux elements suivants et precedents... */ #define VALIDATION_D_UN_ELEMENT_D_UNE_LISTE(element_courant) \ ASD1(element_courant,chainage) \ /* Acces a un element dans une liste. */ #define ACCES_A_UN_ELEMENT_D_UNE_LISTE(element_courant) \ element_courant \ /* Acces a un element dans une liste. */ #define CREATION_D_UNE_LISTE(structure,Tete,Queue,longueur,debordement,indefini) \ DEFV(Local,DEFV(structure,INIT(POINTERs(Tete),indefini))); \ DEFV(Local,DEFV(structure,INIT(POINTERs(Queue),indefini))); \ /* Definition de la tete et de la queue de la liste a creer. */ \ DEFV(Local,DEFV(Positive,INIT(longueur,ZERO))); \ /* Compteur des elements presents dans la liste et 'VALIDE's... */ \ DEFV(Local,DEFV(structure,debordement)); \ /* Au cas ou la liste serait saturee... */ \ /* */ \ /* definition des differentes donnees necessaires a la gestion d'une liste... */ #define gPARCOURS_D_UNE_LISTE(structure,Tete,Queue,longueur,debordement,indefini,Fsucc,Fpred,Fvalid,element_courant,SeqVAL,SeqINVAL) \ Bblock \ DEFV(structure,INIT(POINTERs(element_precedent),indefini)); \ DEFV(structure,INIT(POINTERs(element_courant_precedent),indefini)); \ /* Element precedent de 'element_courant' (introduit le 20031101142304 lors de problemes */ \ /* avec 'v $xrq/vide.L0$K', ces problemes ayant ete resolus le 20031103105541 avec */ \ /* l'introduction de 'chainage' dans 'DEFINITION_D_UNE_STRUCTURE_DE_CHAINAGE(...)'). */ \ DEFV(structure,INIT(POINTERs(element_courant),Tete)); \ /* Structure courante dans la liste... */ \ DEFV(structure,INIT(POINTERs(element_suivant),indefini)); \ /* Et son suivant. Celui-ci doit etre introduit car en effet, au cas ou dans 'sequence' */ \ /* l'element courant serait detruit, faire apres 'sequence' : */ \ /* */ \ /* EGAL(element_courant,Fsucc(element_courant)); */ \ /* */ \ /* serait donc extremement dangereux... */ \ Tant(IFNE(element_courant,indefini)) \ Bblock \ /* Les tests qui suivent ont ete sintroduit le 20031101142304 lors de problemes avec */ \ /* 'v $xrq/vide.L0$K', ces problemes ayant ete resolus le 20031103105541 avec l'introduction */ \ /* de 'chainage' dans 'DEFINITION_D_UNE_STRUCTURE_DE_CHAINAGE(...)'). */ \ EGAL(element_precedent,Fpred(element_courant)); \ \ Test(IFNE(element_precedent,indefini)) \ Bblock \ Test(IFNE(Fsucc(element_precedent),element_courant)) \ Bblock \ PRINT_ERREUR("probleme de chainage 'AVANT' lors du parcours d'une liste"); \ CAL1(Prer1("veritable element precedent....=0x%x\n",element_courant_precedent)); \ CAL1(Prer1("element precedent..............=0x%x\n",element_precedent)); \ CAL1(Prer1("successeur(element precedent)..=0x%x different de :\n",Fsucc(element_precedent))); \ CAL1(Prer1("element courant................=0x%x\n",element_courant)); \ CAL1(Prer1("predecesseur(element precedent)=0x%x\n",Fpred(element_precedent))); \ CAL1(Prer1("tete de la liste...............=0x%x\n",Tete)); \ CAL1(Prer1("queue de la liste..............=0x%x\n",Queue)); \ CAL1(Prer1("indicateur de fin de liste.....=0x%x\n",indefini)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE(element_precedent,Fpred(element_courant))) \ Bblock \ PRINT_ERREUR("probleme de chainage 'ARRIERE' lors du parcours d'une liste"); \ CAL1(Prer1("element courant................=0x%x\n",element_courant)); \ CAL1(Prer1("predecesseur(element courant)..=0x%x different de :\n",Fpred(element_courant))); \ CAL1(Prer1("veritable element precedent....=0x%x\n",element_courant_precedent)); \ CAL1(Prer1("element precedent..............=0x%x\n",element_precedent)); \ CAL1(Prer1("tete de la liste...............=0x%x\n",Tete)); \ CAL1(Prer1("queue de la liste..............=0x%x\n",Queue)); \ CAL1(Prer1("indicateur de fin de liste.....=0x%x\n",indefini)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(element_suivant,Fsucc(element_courant)); \ /* La premiere chose est de recuperer l'eventuel element suivant (au cas, rappelons-le, ou */ \ /* l'element courant serait detruit...). */ \ \ Test(EST_VALIDE(Fvalid(element_courant))) \ Bblock \ /* Cas ou l'element courant est 'VALIDE' : */ \ BLOC(SeqVAL); \ /* Execution de la sequence argument 'SeqVAL' sur chaque element 'VALIDE'... */ \ Eblock \ ATes \ Bblock \ /* Cas ou l'element courant est 'INVALIDE' : cela signifie qu'il a fait l'objet d'un */ \ /* 'DESTRUCTION_ELEMENT(...)' anterieurement... */ \ BLOC(SeqINVAL); \ /* Execution de la sequence argument 'SeqINVAL' sur chaque element 'INVALIDE'... */ \ Eblock \ ETes \ \ EGAL(element_courant_precedent,element_courant); \ EGAL(element_courant,element_suivant); \ /* Enfin, passage a l'element suivant (si il existe...). */ \ \ Test(IFEQ(Fsucc(element_courant),indefini)) \ Bblock \ Test(IFNE(element_courant,Queue)) \ Bblock \ PRINT_ERREUR("probleme de queue lors du parcours d'une liste"); \ CAL1(Prer1("element precedent=0x%x different de :\n",element_courant)); \ CAL1(Prer1("queue............=0x%x\n",Queue)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETan \ Eblock \ /* Repetition d'une certaine sequence sur un ensemble d'elements appartenant a une liste, */ \ /* 'element_courant' definissant l'element courant (introduit le 20031104090749 afin de */ \ /* permettre une passe de nettoyage des elements 'INVALIDE' dans la procedure */ \ /* 'PARCOURS_D_UNE_LISTE(...)'. */ #define PARCOURS_D_UNE_LISTE(structure,Tete,Queue,longueur,debordement,indefini,Fsucc,Fpred,Fvalid,element_courant,sequence) \ Bblock \ gPARCOURS_D_UNE_LISTE(structure \ ,Tete,Queue \ ,longueur \ ,debordement \ ,indefini \ ,Fsucc,Fpred,Fvalid \ ,element_courant \ ,BLOC(sequence) \ ,BLOC(VIDE;) \ ); \ /* Premiere passe sur tous les elements de la liste 'VALIDE' afin d'executer pour eux la */ \ /* sequence 'sequence'. On notera qu'il peut y avoir ici des 'INSERTION_ELEMENT(...)'s */ \ /* et des 'DESTRUCTION_ELEMENT(...)'s, mais qu'il est essentiel de ne surtout pas toucher */ \ /* alors aux elements mis a l'etat 'INVALIDE' pour ne pas perturber les chainages comme */ \ /* cela est explique lors de la definition de l'element 'chainage' de la structure de la */ \ /* liste 'liste'... */ \ \ gPARCOURS_D_UNE_LISTE(structure \ ,Tete,Queue \ ,longueur \ ,debordement \ ,indefini \ ,Fsucc,Fpred,Fvalid \ ,element_courant \ ,BLOC(VIDE;) \ ,BLOC(Test(IFET(IFEQ(element_courant,Tete),IFEQ(element_courant,Queue))) \ Bblock \ /* Cas ou la liste ne contenait que l'element a detruire : */ \ EGAL(Tete,indefini); \ EGAL(Queue,indefini); \ Eblock \ ATes \ Bblock \ Test(IFEQ(element_courant,Tete)) \ Bblock \ EGAL(Tete,element_suivant); \ \ Test(IFNE(Tete,indefini)) \ Bblock \ /* Cas ou l'element a detruire etait en tete : */ \ EGAL(Fpred(Tete),indefini); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IFEQ(element_courant,Queue)) \ Bblock \ /* Cas ou l'element a detruire etait en queue : */ \ EGAL(Queue,element_precedent); \ \ Test(IFNE(Queue,indefini)) \ Bblock \ EGAL(Fsucc(Queue),indefini); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ /* Cas ou l'element a detruire etait "au milieu" de la liste : */ \ Test(IFNE(element_suivant,indefini)) \ Bblock \ EGAL(Fpred(element_suivant),element_precedent); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE(element_precedent,indefini)) \ Bblock \ EGAL(Fsucc(element_precedent),element_suivant); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETes \ \ CALZ_FreLL(element_courant); \ /* Enfin, on libere l'espace memoire alloue a l'element qui disparait... */ \ ) \ ); \ /* Deuxieme passe sur tous les elements de la liste afin de detruire les eventuels */ \ /* elements 'INVALIDE' qui existent... */ \ Eblock \ /* Repetition d'une certaine sequence sur un ensemble d'elements appartenant a une liste, */ \ /* 'element_courant' definissant l'element courant... */ #define INSERTION_ELEMENT(structure,Tete,Queue,longueur,debordement,indefini,Fsucc,Fpred,Fvalid,element_cree,sequence) \ Bblock \ EGAL(element_cree,tMalo(SIZP($structure),structure)); \ /* Allocation de la memoire necessaire a l'element a creer. */ \ \ Test(IFEQ(element_cree,indefini)) \ Bblock \ PRINT_ERREUR("l'allocation memoire pour l'element a creer n'a pas eu lieu"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEQ(element_cree,PLUS_DE_MEMOIRE_LIBRE)) \ Bblock \ PRINT_ERREUR("la memoire est saturee, on ne peut donc plus inserer d'elements dans une liste"); \ CAL1(Prer1("(%d structures)\n",longueur)); \ EGAL(element_cree,ADRESSE(debordement)); \ /* A priori, on pointe sur la zone de debordement pour eviter les ennuis... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(Fsucc(element_cree),indefini); \ EGAL(Fpred(element_cree),Queue); \ /* Creation des chainages "avant" et "arriere" de l'element que l'on vient de creer. */ \ \ Test(IFEQ(Tete,indefini)) \ Bblock \ EGAL(Tete,element_cree); \ /* Cas ou la liste etait vide : il faut initialiser sa "tete". */ \ Eblock \ ATes \ Bblock \ /* Cas ou la liste n'etait pas vide : la "tete" ne change pas... */ \ Eblock \ ETes \ \ Test(IFEQ(Queue,indefini)) \ Bblock \ /* Cas ou la liste etait vide : il n'y a donc pas d'ancien element a mettre a jour... */ \ Eblock \ ATes \ Bblock \ EGAL(Fsucc(Queue),element_cree); \ /* Cas ou la liste n'etait pas vide : il faut chainer l'ancien dernier element avec celui */ \ /* que l'on vient de creer... */ \ Eblock \ ETes \ \ EGAL(Queue,element_cree); \ /* L'element cree se trouve en "queue" de la structure. */ \ \ EGAL(Fvalid(element_cree),VALIDE); \ /* L'element cree est 'VALIDE' jusqu'a sa 'DESTRUCTION_ELEMENT(...)'... */ \ \ BLOC(sequence); \ /* Et execution d'une sequence specifique... */ \ \ INCR(longueur,I); \ /* Et comptage global des structures en presence... */ \ Eblock \ /* Connexion d'un element 'element_cree' dans une liste et allocation eventuelle de la */ \ /* memoire... */ #define DESTRUCTION_ELEMENT(structure,Tete,Queue,longueur,debordement,indefini,Fsucc,Fpred,Fvalid,Aelement_a_detruire,sequence) \ Bblock \ DEFV(structure,INIT(POINTERs(element_a_detruire),Aelement_a_detruire)); \ /* Il est imperatif de dupliquer ici le pointeur de l'element a detruire si l'on ne veut */ \ /* pas d'ennuis, en particulier, lors du 'FreLL(element_a_detruire)' ci-apres... */ \ \ Test(IFET(IFNE(element_a_detruire,ADRESSE(debordement)) \ ,EST_VALIDE(Fvalid(element_a_detruire)) \ ) \ ) \ Bblock \ Test(I3ET(IFNE(Tete,indefini) \ ,IFNE(Queue,indefini) \ ,IFNE(element_a_detruire,indefini) \ ) \ ) \ Bblock \ DEFV(structure,INIT(POINTERs(element_precedent),indefini)); \ DEFV(structure,INIT(POINTERs(element_suivant),indefini)); \ EGAL(element_precedent,Fpred(element_a_detruire)); \ EGAL(element_suivant,Fsucc(element_a_detruire)); \ /* Ces deux structures sont introduites simplement pour simplifier la mise a jour des */ \ /* differents chainages, l'initialisation en deux temps etant liees aux compilateurs... */ \ \ Test(IFNE(element_precedent,indefini)) \ Bblock \ /* Test introduit le 20031102085818. */ \ Test(IFNE(Fsucc(element_precedent),element_a_detruire)) \ Bblock \ PRINT_ERREUR("probleme de chainage 'AVANT' lors de la destruction d'un element de liste"); \ CAL1(Prer1("element precedent............=0x%x\n",element_precedent)); \ CAL1(Prer1("successeur(element precedent)=0x%x different de :\n",Fsucc(element_precedent))); \ CAL1(Prer1("element a detruire...........=0x%x\n",element_a_detruire)); \ CAL1(Prer1("tete de la liste.............=0x%x\n",Tete)); \ CAL1(Prer1("queue de la liste............=0x%x\n",Queue)); \ CAL1(Prer1("indicateur de fin de liste...=0x%x\n",indefini)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFNE(element_suivant,indefini)) \ Bblock \ /* Test introduit le 20031102085818. */ \ Test(IFNE(element_a_detruire,Fpred(element_suivant))) \ Bblock \ PRINT_ERREUR("probleme de chainage 'ARRIERE' lors de la destruction d'un element de liste"); \ CAL1(Prer1("element suivant..............=0x%x\n",element_suivant)); \ CAL1(Prer1("predecesseur(element suivant)=0x%x different de :\n",Fpred(element_suivant))); \ CAL1(Prer1("element a detruire...........=0x%x\n",element_a_detruire)); \ CAL1(Prer1("tete de la liste.............=0x%x\n",Tete)); \ CAL1(Prer1("queue de la liste............=0x%x\n",Queue)); \ CAL1(Prer1("indicateur de fin de liste...=0x%x\n",indefini)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(Fvalid(element_a_detruire),INVALIDE); \ /* L'element detruit est 'INVALIDE', mais conserve dans la liste afin de ne pas rompre */ \ /* les chainages. On notera donc qu'il n'y a pas de : */ \ /* */ \ /* CALS(FreLL(element_a_detruire)); */ \ /* */ \ /* ci -apres... */ \ \ BLOC(sequence); \ /* Et execution d'une sequence specifique... */ \ \ DECR(longueur,I); \ /* Decomptage des elements en presence... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("probleme lors de la destruction d'un element"); \ CAL1(Prer1("tete..............=0x%x\n",Tete)); \ CAL1(Prer1("queue.............=0x%x\n",Queue)); \ CAL1(Prer1("element_a_detruire=0x%x\n",element_a_detruire)); \ CAL1(Prer1("(indefini=0x%x)\n",indefini)); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IFEQ(element_a_detruire,ADRESSE(debordement))) \ Bblock \ PRINT_ERREUR("la destruction de la zone de debordement est demandee"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_INVALIDE(Fvalid(element_a_detruire))) \ Bblock \ PRINT_ERREUR("la destruction d'un element 'INVALIDE' est demandee"); \ CAL1(Prer1("element a detruire...........=0x%x\n",element_a_detruire)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Deconnexion d'un element 'element_a_detruire' dans une liste et liberation eventuelle */ \ /* de la memoire occupee... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S L O C A L E S E T P R O P R E S A ' $sHOTE ' : */ /* */ /*************************************************************************************************************************************/ #define sHOTE_____NOMBRE_DE_PROCESSEURS \ GvalDefaut("ProcessorNumber",UN) \ /* Nombre de processeurs (introduit le 20170418100108). */ #define VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB \ QUATRE_VINGT #define sHOTE_____TAILLE_DE_LA_MEMOIRE_DE_REFERENCE_EN_MEGA_OCTETS \ GvalDefaut("PCMemorySizeMB",VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB) /* Taille de la memoire en mega-octets (introduit le 20170418100108). */ /* */ /* 'VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB' a ete introduit dans 'v $xig/fonct$vv$DEF' le */ /* 20120201104802, puis deplace ici le 20170418102408... */ #define VALEUR_PAR_DEFAUT_DE_MemorySizeMB \ MILLE #define sHOTE_____TAILLE_DE_LA_MEMOIRE_EN_MEGA_OCTETS \ GvalDefaut("MemorySizeMB",VALEUR_PAR_DEFAUT_DE_MemorySizeMB) /* Taille de la memoire en mega-octets (introduit le 20170418100108). */ /* */ /* Le 20170418101457, 'GvalDefaut(...)' a remplace 'Gval(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y R A C I N E O U " H O M E - D I R E C T O R Y " : */ /* */ /*************************************************************************************************************************************/ #define HOME_DIRECTORY \ GvarDefaut("x" \ ,Gvar("HOME") \ ) \ /* Definition du "home-directory" a l'aide de '$x'. On notera que si cette variable */ \ /* n'existe pas (ce qui peut apparaitre lors de l'utilisation d'une commande via la */ \ /* commande 'v $xcg/remote.01$K shell'), on la definit a l'aide de '$HOME' sachant bien */ \ /* que sur certains SYSTEMEs '$x' et '$HOME' peuvent differer (voir '$EDFR22')... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y C O U R A N T : */ /* */ /*************************************************************************************************************************************/ #define CURRENT_DIRECTORY \ Gvar("CWD") \ /* Definition du "current-directory" (introduit le 20050906091415). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S C O M M A N D E S G E N E R A L E S : */ /* */ /*************************************************************************************************************************************/ #define Direct_xcg \ GvarDefaut("xcg" \ ,EGAs(chain_Aconcaten5(HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,"commandes" \ ,cSEPARATEUR_DES_PATHS \ ,"generales" \ ) \ ) \ ) \ /* Definition du directory '$xcg'. Ceci a ete introduit le 20041221122847 afin de */ \ /* faciliter l'utilisation de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S C O M M A N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define Direct_xci \ GvarDefaut("xci" \ ,EGAs(chain_Aconcaten5(HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,"commandes" \ ,cSEPARATEUR_DES_PATHS,"images" \ ) \ ) \ ) \ /* Definition du directory '$xci'. Ceci a ete introduit le 20020228164122 afin de */ \ /* faciliter l'utilisation de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(...)' sur des */ \ /* MACHINEs qui n'ont pas (ou pas encore) d'environnement... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S C O M M A N D E S D E P R E - P R O C E S S I N G : */ /* */ /*************************************************************************************************************************************/ #define Direct_xcp \ GvarDefaut("xcp" \ ,EGAs(chain_Aconcaten5(HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,"commandes" \ ,cSEPARATEUR_DES_PATHS \ ,EGAs(chain_Aconcaten2("cpp",GvarDefaut("D",".D"))) \ ) \ ) \ ) \ /* Definition du directory '$xcp'. Ceci a ete introduit le 20041221145839 afin de */ \ /* faciliter l'utilisation de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(...)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R I E S T E M P O R A I R E S : */ /* */ /*************************************************************************************************************************************/ #define GvarDirectory(directory) \ GvarDefaut(directory \ ,EGAs(chain_Aconcaten3(HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,"TeMpOrAiReS" \ ) \ ) \ ) \ /* Definition generale d'un directory. ATTENTION : en cas de non existence de celui-ci */ \ /* (en tant que variable d'environnement), il est emule dans '$xTG'. On notera que l'on */ \ /* n'utilise pas cette variable d'environnement ('$xTG') et ce au cas ou elle n'existerait */ \ /* pas (ou du moins pas encore...). Ceci a ete introduit le 20020228164122 afin de faciliter */ \ /* l'utilisation de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(...)' sur des MACHINEs qui */ \ /* n'ont pas (ou pas encore) d'environnement... */ \ /* */ \ /* La procedure 'GvarDirectory(...)' a ete introduite le 20160510170638... */ #define Direct__xBTG \ GvarDirectory("xBTG") #define Direct__xBTG0 \ GvarDirectory("xBTG0") #define Direct__xBTM \ GvarDirectory("xBTM") #define Direct__xBTR \ GvarDirectory("xBTR") #define Direct__xT \ Direct__xTGL \ /* Afin d'assurer la compatibilite anterieure au 20160510170638... */ #define Direct__xTC \ GvarDirectory("xTC") #define Direct__xTF \ GvarDirectory("xTF") #define Direct__xTFG \ GvarDirectory("xTFG") #define Direct__xTFGL \ GvarDirectory("xTFGL") #define Direct__xTG \ GvarDirectory("xTG") #define Direct__xTG0 \ GvarDirectory("xTG0") #define Direct__xTG0L \ GvarDirectory("xTG0L") #define Direct__xTGL \ GvarDirectory("xTGL") #define Direct__xTL \ GvarDirectory("xTL") #define Direct__xTM \ GvarDirectory("xTM") #define Direct__xTR \ GvarDirectory("xTR") #define Direct__xTS \ GvarDirectory("xTS") #define Direct__xTSG \ GvarDirectory("xTSG") #define Direct__xTSGL \ GvarDirectory("xTSGL") #define Direct__xTSUG \ GvarDirectory("xTSUG") #define Direct__xTV \ GvarDirectory("xTV") /* Cette liste a ete remaniee et completee le 20170418135135, puis le 20170515104124 en */ /* concerne '$xTSUG'... */ Denumer21(INIS(_nDirect__xTG,UN) ,_nDirect__xTGL ,_nDirect__xTG0 ,_nDirect__xTG0L ,_nDirect__xTFG ,_nDirect__xTFGL ,_nDirect__xTSG ,_nDirect__xTSGL ,_nDirect__xTV ,_nDirect__xT ,_nDirect__xBTG ,_nDirect__xBTG0 ,_nDirect__xBTM ,_nDirect__xBTR ,_nDirect__xTC ,_nDirect__xTF ,_nDirect__xTL ,_nDirect__xTM ,_nDirect__xTR ,_nDirect__xTS ,_nDirect__xTSUG ,choix_d_un_directory_temporaire ); /* On notera que l'on utilise 'Denume20(...)' et non pas 'Denume20(...)' a cause du */ /* 'INIS(...)'. */ /* */ /* Le 20170418150813, dix nouveaux directories : */ /* */ /* {xBTG,xBTG0,xBTM,xBTR,xTC,xTF,xTL,xTM,xTR,xTS} */ /* */ /* et ce SANS CHANGER les numeros des dix premiers : */ /* */ /* {xTG,xTGL,xTG0,xTG0L,xTFG,xTFGL,xTSG,xTSGL,xTV,xT} */ /* */ /* car, en effet, on ne sait jamais... */ #define nDirect__xBTG \ _nDirect__xBTG #define nDirect__xBTG0 \ _nDirect__xBTG0 #define nDirect__xBTM \ _nDirect__xBTM #define nDirect__xBTR \ _nDirect__xBTR #define nDirect__xTC \ _nDirect__xTC #define nDirect__xTG \ _nDirect__xTG #define nDirect__xTGL \ _nDirect__xTGL #define nDirect__xTG0 \ _nDirect__xTG0 #define nDirect__xTG0L \ _nDirect__xTG0L #define nDirect__xTF \ _nDirect__xTF #define nDirect__xTFG \ _nDirect__xTFG #define nDirect__xTFGL \ _nDirect__xTFGL #define nDirect__xTL \ _nDirect__xTL #define nDirect__xTM \ _nDirect__xTM #define nDirect__xTR \ _nDirect__xTR #define nDirect__xTS \ _nDirect__xTS #define nDirect__xTSG \ _nDirect__xTSG #define nDirect__xTSGL \ _nDirect__xTSGL #define nDirect__xTSUG \ _nDirect__xTSUG #define nDirect__xTV \ _nDirect__xTV #define nDirect__xT \ _nDirect__xT /* Numeros des directories temporaires accessibles (introduits le 20160511095737 et */ /* completes le 20170418150813 par 10 nouveaux directories). On a ainsi a priori : */ /* */ /* xTG = 1 N */ /* xTGL = 2 U */ /* xTG0 = 3 M */ /* xTG0L = 4 E */ /* xTFG = 5 R */ /* xTFGL = 6 O */ /* xTSG = 7 S */ /* xTSGL = 8 */ /* xTV = 9 INCHANGES */ /* xT = 10 (par rapport a avant le 20170418150813) */ /* */ /* xBTG = 11 */ /* xBTG0 = 12 */ /* xBTM = 13 */ /* xBTR = 14 */ /* xTC = 15 */ /* xTF = 16 */ /* xTL = 17 */ /* xTM = 18 */ /* xTR = 19 */ /* xTS = 20 */ /* xTSUG = 21 */ /* */ /* sachant que, suivant le contexte (MACHINE,...), certains peuvent etre identiques. C'est, */ /* par exemple, le cas de '$xTFG' et de '$xTSG' sur $CMAP28'. A la date du 20160512150135, */ /* on a respectivement sur '$LACT19' et sur '$CMAP8' : */ /* */ /* */ /* $LACT19 */ /* $CMAP8 */ /* */ /* */ /* 11 = xBTGA /home/colonna/TeMpOrAiReS */ /* /home2/users/colonna/TeMpOrAiReS */ /* */ /* 12 = xBTG0 /home/colonna/TeMpOrAiReS */ /* /home/colonna/TeMpOrAiReS */ /* */ /* 13 = xBTM /home/colonna/TeMpOrAiReS */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D */ /* */ /* 14 = xBTR /home/colonna/TeMpOrAiReS_ReMaNeNtS */ /* /home/colonna/TeMpOrAiReS_ReMaNeNtS */ /* */ /* */ /* 15 = xTC /home/colonna/TeMpOrAiReS_CoMmUn */ /* /home/colonna/TeMpOrAiReS_CoMmUn */ /* */ /* 01 = xTG /home/colonna/TeMpOrAiReS */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D I */ /* D */ /* 02 = xTGL /home/colonna/TeMpOrAiReS/$Cshell.nnnn$D - E */ /* - -------------- | N */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D/$Cshell.nnnn$D | T */ /* -------------- | I */ /* 10 = xT /home/colonna/TeMpOrAiReS/$Cshell.nnnn$D | Q */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D/$Cshell.nnnn$D - U */ /* E */ /* S */ /* 16 = xTF /tmp */ /* /tmp */ /* */ /* 05 = xTFG /mnt/tmpfs/colonna */ /* /tmp/colonna */ /* */ /* 06 = xTFGL /mnt/tmpfs/colonna/$Cshell.nnnn$D */ /* - -------------- */ /* /tmp/colonna/$Cshell.nnnn$D */ /* -------------- */ /* */ /* */ /* 03 = xTG0 /home/colonna/TeMpOrAiReS */ /* /home/colonna/TeMpOrAiReS/$CMAP28$D */ /* */ /* 04 = xTG0L /home/colonna/TeMpOrAiReS/$Cshell.nnnn$D */ /* - -------------- */ /* /home/colonna/TeMpOrAiReS/$CMAP28$D/$Cshell.nnnn$D */ /* -------------- */ /* */ /* */ /* 17 = xTL /home/colonna/TeMpOrAiReS/$Cshell.nnnn$D */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D/$Cshell.nnnn$D */ /* */ /* */ /* 18 = xTM /home/colonna/TeMpOrAiReS/$Cshell.nnnn$D */ /* /home2/users/colonna/TeMpOrAiReS/$CMAP28$D/$Cshell.nnnn$D */ /* */ /* */ /* 19 = xTR /home/colonna/TeMpOrAiReS_ReMaNeNtS */ /* /home/colonna/TeMpOrAiReS_ReMaNeNtS/$CMAP28$D */ /* */ /* */ /* 20 = xTS /tmp */ /* /tmp */ /* */ /* 07 = xTSG /tmp/colonna */ /* /tmp/colonna */ /* */ /* 08 = xTSGL /tmp/colonna/$Cshell.nnnn$D */ /* - -------------- */ /* /tmp/colonna/$Cshell.nnnn$D */ /* -------------- */ /* */ /* */ /* 09 = xTV VARIABLE... */ /* VARIABLE... */ /* */ /* */ /* ou 'nnnn' represente un numero compris entre '0001' et '9999' (ce dernier n'ayant */ /* evidemment jamais ete atteint...) et ou '$Cshell' est le 'PID' d'un '$CSH' avec */ /* suffisamment de "0"s devant... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S T O C K A G E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define directory_images \ EGAs(chain_Aconcaten2(GvarDefaut("xp" \ ,EGAs(chain_Aconcaten3(HOME_DIRECTORY,cSEPARATEUR_DES_PATHS,"images")) \ ) \ ,cSEPARATEUR_DES_PATHS \ ) \ ) \ /* Maintenant, la variable 'directory_images' est recuperee dynamiquement a partir de la */ \ /* variable d'environnement 'xp', ce qui fait qu'il n'est plus necessaire de recompiler de */ \ /* nombreux modules de bibliotheques et de nombreuses commandes en cas de changement dans */ \ /* les noms de directories. On notera que, malheureusement, l'espace allouee par l'appel */ \ /* de la fonction 'chain_Aconcaten3(...)' n'est jamais rendu... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S T O C K A G E D E S P A L E T T E S : */ /* */ /*************************************************************************************************************************************/ #define directory_palettes \ EGAs(chain_Aconcaten2(GvarDefaut("xiP" \ ,EGAs(chain_Aconcaten2(directory_images,"palettes")) \ ) \ ,cSEPARATEUR_DES_PATHS \ ) \ ) \ /* La variable 'directory_palettes' recuperee dynamiquement a partir de la variable */ \ /* d'environnement 'xiP' a ete introduite le 20020512101004. On notera que, malheureusement, */ \ /* l'espace allouee par l'appel de la fonction 'chain_Aconcaten2(...)' n'est jamais rendu... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N D I R E C T O R Y I N E X I S T A N T : */ /* */ /*************************************************************************************************************************************/ #define DIRECTORY_UNDEF \ "UNDEF /* Est l'equivalent de 'UNDEF' pour les directories ; ATTENTION : la ligne precedente ne */ /* doit pas contenir de " \" et ce parce qu'elle contient un debut de chaine destinee */ /* a etre concatenee a d'autres... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T O R Y D E S T O C K A G E D E S I M A G E S D E M A N O E U V R E : */ /* */ /*************************************************************************************************************************************/ #define directory_images_manoeuvre \ "images/manoeuvre /* ATTENTION : la ligne precedente ne doit pas contenir de " \", et ce parce qu'elle */ /* contient un debut de chaine destinee a etre concatenee a d'autres... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R I N S E R E R D E S C O M M E N T A I R E S T R E S G E N E R A U X : */ /* */ /*************************************************************************************************************************************/ #define COMMENTAIRES_______(sequence_quelconque) \ /* Ceci a ete introduit le 20160411095715. Cela permet d'introduire des sequences */ \ /* quelconques dont un exemple est 'v $xtc/geodesiques.01$vv$c COMMENTAIRES_______'... */