;--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