Télécharger ectab1.eso

Retour à la liste

Numérotation des lignes :

ectab1
  1. C ECTAB1 SOURCE BP208322 21/04/15 21:15:01 10968
  2.  
  3. ************************************************************************
  4. *
  5. * OBJET : Impression recursive d'une table
  6. * APPELEE PAR : ECTABL
  7. * Creation : BP, 2016-09-12
  8. *
  9. ************************************************************************
  10.  
  11. SUBROUTINE ECTAB1(ITAB1,NMAX)
  12.  
  13.  
  14. *---- Declarations -----------------------------------------------------
  15.  
  16. IMPLICIT INTEGER(I-N)
  17. IMPLICIT REAL*8 (A-H,O-Z)
  18. EQUIVALENCE (IENT,REEL)
  19. -INC PPARAM
  20. -INC CCOPTIO
  21. -INC SMTABLE
  22. -INC CCNOYAU
  23. -INC CCASSIS
  24. CHARACTER*8 ITYPE,ITYP
  25. c CHARACTER*20 IWRI,IWRV
  26. CHARACTER*(LOCHAI) IWRI
  27. CHARACTER*20 IWRV
  28. REAL*8 XR,XRET
  29. LOGICAL BRET
  30. PARAMETER(NI=10)
  31. INTEGER IDEB(NI),ITAB(NI)
  32. CHARACTER*(33) fm
  33. EXTERNAL long
  34.  
  35. c 601 FORMAT( 2X,'.',1X,A,1X,'(=',A,')')
  36. c 602 FORMAT( 4X,'.',1X,A,1X,'(=',A,')')
  37. c 603 FORMAT( 6X,'.',1X,A,1X,'(=',A,')')
  38. c 604 FORMAT( 8X,'.',1X,A,1X,'(=',A,')')
  39. c 605 FORMAT(10X,'.',1X,A,1X,'(=',A,')')
  40. c 606 FORMAT(12X,'.',1X,A,1X,'(=',A,')')
  41. c 607 FORMAT(14X,'.',1X,A,1X,'(=',A,')')
  42. c 608 FORMAT(16X,'.',1X,A,1X,'(=',A,')')
  43. c 609 FORMAT(18X,'.',1X,A,1X,'(=',A,')')
  44. c 610 FORMAT(20X,'.',1X,A,1X,'(=',A,')')
  45.  
  46.  
  47. *---- Initialisations --------------------------------------------------
  48.  
  49. IF(NMAX.GT.NI) THEN
  50. c c Nombre inacceptable %i1
  51. c INTERR(1)=NMAX
  52. c CALL ERREUR(36)
  53. WRITE(IOIMP,*) 'La profondeur est limitee a ',NI
  54. NMAX=NI
  55. ENDIF
  56.  
  57. DO I=1,NI
  58. IDEB(I)=0
  59. ITAB(I)=0
  60. ENDDO
  61. IPROF=1
  62. ITAB(IPROF)=ITAB1
  63.  
  64.  
  65. c---- boucle sur les profondeurs de la table ---------------------------
  66.  
  67. 100 CONTINUE
  68. MTABLE=ITAB(IPROF)
  69. SEGACT,MTABLE
  70. NB=MLOTAB
  71. c IF(IDEB(IPROF).EQ.0) THEN
  72. c WRITE(*,*) '#100 >>>>>>>> Niveau ',IPROF,MTABLE,NB
  73. c ENDIF
  74.  
  75.  
  76. c---- boucle sur les indices -------------------------------------------
  77. c de la IPROF ieme table
  78.  
  79. 200 CONTINUE
  80. IDEB(IPROF)=IDEB(IPROF)+1
  81. IJ=IDEB(IPROF)
  82. c WRITE(*,*) '#200 >>>>>>>>>>> Niveau, indice ',IPROF,IJ,NB
  83.  
  84. c on a atteint le dernier indice
  85. IF(IJ.GT.NB) THEN
  86. SEGDES,MTABLE
  87. IPROF=IPROF-1
  88. c on a atteint le dernier niveau : on a fini
  89. IF(IPROF.EQ.0) RETURN
  90. GOTO 100
  91. ENDIF
  92.  
  93. c --- IJieme Indice --- --- --- ---
  94. ITYPE=MTABTI(IJ)
  95. IRET=MTABII(IJ)
  96. XRET=RMTABI(IJ)
  97. IWRI=' '
  98. IF(ITYPE.EQ.'MOT '.OR.ITYPE.EQ.'METHODE ') THEN
  99. ID=IPCHAR(IRET)
  100. IFI=IPCHAR(IRET+1)
  101. IL=IFI-ID
  102. IL=MIN(IL,LOCHAI)
  103. IWRI(1:IL)=ICHARA(ID:ID+IL-1)
  104. ELSEIF(ITYPE.EQ.'ENTIER ') THEN
  105. IV=IRET
  106. c WRITE(IWRI(1:8),FMT='(I8)') IV
  107. c bp : petite modif pour aligner a gauche les nombres
  108. IF(IV.LT.10) THEN
  109. WRITE(IWRI(1:8),FMT='(I1)') IV
  110. ELSEIF(IV.LT.100) THEN
  111. WRITE(IWRI(1:8),FMT='(I2)') IV
  112. ELSEIF(IV.LT.1000) THEN
  113. WRITE(IWRI(1:8),FMT='(I3)') IV
  114. ELSEIF(IV.LT.10000) THEN
  115. WRITE(IWRI(1:8),FMT='(I4)') IV
  116. ELSEIF(IV.LT.100000) THEN
  117. WRITE(IWRI(1:8),FMT='(I5)') IV
  118. ELSEIF(IV.LT.1000000) THEN
  119. WRITE(IWRI(1:8),FMT='(I6)') IV
  120. ELSEIF(IV.LT.10000000) THEN
  121. WRITE(IWRI(1:8),FMT='(I7)') IV
  122. ELSE
  123. WRITE(IWRI(1:8),FMT='(I8)') IV
  124. ENDIF
  125. ELSEIF(ITYPE.EQ.'FLOTTANT') THEN
  126. XR=XRET
  127. WRITE(IWRI(1:15),FMT='(E15.8)') XR
  128. ELSEIF(ITYPE.EQ.'LOGIQUE')THEN
  129. BRET=IPLOGI(IRET)
  130. IF(BRET) IWRI(1:4)='VRAI'
  131. IF(.NOT.BRET) IWRI(1:4)='FAUX'
  132. ELSE
  133. WRITE(IWRI(1:8),FMT='(I8)') IRET
  134. ENDIF
  135.  
  136. * on s'inspire de messag.eso
  137. fm(1:1)='('
  138. write(fm(2:3),fmt='(I2)') (2*IPROF)
  139. write(fm(4:10),fmt='(A7)') "X,'.',X"
  140. ifm=11
  141. c -> fm=( 2X,'.', X
  142. ilong=long(IWRI)
  143. if(ilong.ne.0) then
  144. write(fm(ifm:ifm+1),fmt='(A2)') ',A'
  145. ifm=ifm+2
  146. if (ilong.le.9) then
  147. write(fm(ifm:ifm),fmt='(i1)') ilong
  148. ifm=ifm+1
  149. elseif (ilong.le.99) then
  150. write(fm(ifm:ifm+1),fmt='(i2)') ilong
  151. ifm=ifm+2
  152. elseif (ilong.le.999) then
  153. write(fm(ifm:ifm+2),fmt='(i3)') ilong
  154. ifm=ifm+3
  155. else
  156. call erreur(5)
  157. return
  158. endif
  159. endif
  160. c -> fm=( 2X,'.', X,A1
  161. c 12
  162. c 123
  163.  
  164. c --- IJieme Valeur --- --- --- ---
  165. ITYP=MTABTV(IJ)
  166. IRET=MTABIV(IJ)
  167. XRET=RMTABV(IJ)
  168. c IWRV=' '
  169. c IF(ITYP.EQ.'MOT ') THEN
  170. c ID=IPCHAR(IRET)
  171. c IFI=IPCHAR(IRET+1)
  172. c IL=IFI-ID
  173. c IL=MIN(IL,20)
  174. c IWRV(1:IL)=ICHARA(ID:ID+IL-1)
  175. c ELSEIF(ITYP.EQ.'ENTIER ') THEN
  176. c IV=IRET
  177. c WRITE(IWRV(1:8),FMT='(I8)') IV
  178. c ELSEIF(ITYP.EQ.'FLOTTANT')THEN
  179. c XR=XRET
  180. c WRITE(IWRV(1:15),FMT='(E15.8)') XR
  181. c ELSEIF(ITYP.EQ.'LOGIQUE')THEN
  182. c BRET=IPLOGI(IRET)
  183. c IF(BRET) IWRV(1:4)='VRAI'
  184. c IF(.NOT.BRET) IWRV(1:4)='FAUX'
  185. c ELSE
  186. c WRITE(IWRV(1:8),FMT='(I8)') IRET
  187. c ENDIF
  188. c
  189. c c on ecrit la IJieme ligne :
  190. c IF(IPROF.EQ.1) WRITE(IOIMP,601) IWRI,ITYP,IWRV
  191. c IF(IPROF.EQ.2) WRITE(IOIMP,602) IWRI,ITYP,IWRV
  192. c IF(IPROF.EQ.3) WRITE(IOIMP,603) IWRI,ITYP,IWRV
  193. c IF(IPROF.EQ.4) WRITE(IOIMP,604) IWRI,ITYP,IWRV
  194. c IF(IPROF.EQ.5) WRITE(IOIMP,605) IWRI,ITYP,IWRV
  195. c IF(IPROF.EQ.6) WRITE(IOIMP,606) IWRI,ITYP,IWRV
  196. c IF(IPROF.EQ.7) WRITE(IOIMP,607) IWRI,ITYP,IWRV
  197. c IF(IPROF.EQ.8) WRITE(IOIMP,608) IWRI,ITYP,IWRV
  198. c IF(IPROF.EQ.9) WRITE(IOIMP,609) IWRI,ITYP,IWRV
  199. c IF(IPROF.EQ.10) WRITE(IOIMP,610) IWRI,ITYP,IWRV
  200.  
  201. * bp: on ajuste le nombre d'espaces afin d'avoir tous les ITYP
  202. * alignes pour des indices de longueur < 25
  203. * pour les ITYP + grand, on prend 1 seul espace
  204. nbreX=max(30-(2*IPROF)-3-ilong,1)
  205. write(fm(ifm:ifm+3),fmt='(A1,I2,A1)') ",",nbreX,"X"
  206. ifm=ifm+4
  207. write(fm(ifm:ifm+13),fmt='(A4,A8,A2)') ",'(=",ITYP,")'"
  208. ifm=ifm+14
  209. write(fm(ifm:ifm),fmt='(A1)') ')'
  210. c write(*,*) 'debug:',nbreX,' fm=',fm(1:ifm)
  211. c -> fm=( 2X,'.', X,A12,13X,'(=ITYP )')
  212. WRITE(IOIMP,fmt=fm(1:ifm)) IWRI
  213.  
  214. c Cas d'une TABLE : on l'explore si pas trop profond
  215. IF(ITYP.EQ.'TABLE') THEN
  216. c trop profond : on ne va pas plus loin
  217. IF(IPROF.GE.NMAX) THEN
  218. c WRITE(*,*) 'trop profond ! ',IPROF,' > ou = a',NMAX
  219. GOTO 200
  220. ENDIF
  221. c on change de table courante
  222. IPROF=IPROF+1
  223. ITAB(IPROF)=IRET
  224. IDEB(IPROF)=0
  225. GOTO 100
  226. ENDIF
  227.  
  228. GOTO 200
  229. c---- fin de boucle sur les indices ------------------------------------
  230.  
  231.  
  232. RETURN
  233. END
  234.  
  235.  
  236.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales