81 lines
2.0 KiB
Prolog
81 lines
2.0 KiB
Prolog
;--Questa funzione analizza ricorsivamente i campi di una struttura ricercando e memorizzando nell'array "nomi_campi"
|
|
;--i nomi dei campi. Sono ignorati i campi definiti spare
|
|
|
|
FUNCTION Nomi_campi_struttura , $ ;--inputs:
|
|
struttura , $
|
|
nomi_campi
|
|
|
|
;--Opzioni di compilazione--
|
|
COMPILE_OPT STRICTARR
|
|
|
|
IF( ( SIZE( struttura ) )[2] EQ 8 ) THEN BEGIN ;--controlla che in ingresso sia stata passata una struttura
|
|
;--altrimenti restituisce nomi_campi vuota
|
|
|
|
ris = TAG_NAMES( struttura )
|
|
|
|
;--per ognuno dei sottocampi:
|
|
|
|
FOR i = 0 , N_ELEMENTS( ris ) - 1 DO BEGIN
|
|
|
|
stringa = 'info_campo = size( struttura.' + ris[i] + ')'
|
|
err = EXECUTE( stringa )
|
|
tipo_campo = info_campo[ info_campo[0] + 1 ]
|
|
num_el = info_campo[ info_campo[0] + 2 ]
|
|
|
|
struct_flag = tipo_campo EQ 8 ;--la flag e' uno se ris(i) e' una struttura
|
|
|
|
IF( struct_flag ) THEN BEGIN
|
|
|
|
;--ricerca ricorsiva:
|
|
|
|
IF( num_el EQ 1 ) THEN BEGIN
|
|
|
|
stringa = 'nomi_campi = Nomi_campi_struttura( struttura.' + ris[i] + ' , nomi_campi ) '
|
|
err = EXECUTE( stringa )
|
|
|
|
ENDIF ELSE BEGIN
|
|
|
|
FOR arr_idx = 0 , num_el-1 DO BEGIN
|
|
|
|
str_idx = '['+ string(arr_idx,format='(i0)') + ']'
|
|
stringa = 'nomi_campi = Nomi_campi_struttura( struttura.' + ris[i] + str_idx + ', nomi_campi ) '
|
|
err = EXECUTE( stringa )
|
|
|
|
ENDFOR
|
|
|
|
ENDELSE
|
|
|
|
ENDIF ELSE BEGIN
|
|
|
|
;--se siamo su una foglia blocchiamo la ricorsione
|
|
|
|
IF( num_el EQ 1 ) THEN BEGIN
|
|
|
|
nome_campo = ris[i]
|
|
stringa = 'valore_campo = struttura.' + ris[i]
|
|
|
|
ENDIF ELSE BEGIN
|
|
|
|
nome_campo = REPLICATE( ris[i] + '(' , num_el ) + $
|
|
STRING( LINDGEN( num_el ) , format='(i0)') + $
|
|
REPLICATE( ')' , num_el )
|
|
|
|
ENDELSE
|
|
|
|
;IF( STRUPCASE( ris[i] ) NE 'SPARE' ) THEN BEGIN ;--evitiamo di inserire le info sugli spare
|
|
|
|
;--inserimento dei risultati
|
|
nomi_campi = [ nomi_campi , nome_campo ]
|
|
|
|
;ENDIF
|
|
|
|
ENDELSE
|
|
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
RETURN , nomi_campi
|
|
|
|
END
|