SXXXXXXX_RadarDataReader/_src_idl/reader_data/nomi_campi_struttura.pro
VALLONGOL 5de2650675 add
2025-11-12 13:43:30 +01:00

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