Ciao a tutti, ho un problema con VB6.
Sto scrivendo una GUI in VB6 che si interfaccia con una dll C, il cui tipo di dato principale è costituito da un UDT.
L'UDT in questione è questo:
per la cronaca son sicuro che il tutto funzioni correttamente... anche perchè oregon mi ha dato una grossa mano in passato.codice:Public Type Bearing F2L_avg_counter As Long ' Contatore per la media della fase 1->2 ' In questi vettori metto le somme intermedie per la fase 1->2 F2L_X_SUM(CAMPIONI_DESIDERATI) As Double F2L_Y_SUM(CAMPIONI_DESIDERATI) As Double F2L_Z_SUM(CAMPIONI_DESIDERATI) As Double ' In questi vettori calcolo le medie per la fase 1->2 e/o metto i valori di confronto letti da file. F2_Golden_X(CAMPIONI_DESIDERATI) As Double F2_Golden_Y(CAMPIONI_DESIDERATI) As Double F2_Golden_Z(CAMPIONI_DESIDERATI) As Double ' VARIABILI GLOBALI FASE 2 ' Variabili per la gestione delle SM di basso livello (monoassiali) F2_SM_curr_x As Long F2_SM_next_x As Long F2_SM_curr_y As Long F2_SM_next_y As Long F2_SM_curr_z As Long F2_SM_next_z As Long ' Contatori per le SM di basso livello (monoassiali) F2_counter_x As Long F2_counter_y As Long F2_counter_z As Long ' Variabili per la gestione delle SM di alto livello F2_SM_curr As Long F2_SM_next As Long ' Contatori per la SM di alto livello F2_OK_counter As Long F2_WRN_counter As Long F2_DMG_counter As Long ' VARIABILI GLOBALI FASE 1-->2 F3L_avg_counter As Long ' Contatore per la media della fase 1->3 ' In questi vettori metto le somme intermedie per la fase 1->3 F3L_X_SUM(FFNUMBER) As Double F3L_Y_SUM(FFNUMBER) As Double F3L_Z_SUM(FFNUMBER) As Double F3_Golden_X(FFNUMBER) As Double F3_Golden_Y(FFNUMBER) As Double F3_Golden_Z(FFNUMBER) As Double ' VARIABILI GLOBALI FASE 3 ' Matrice dove metto i valori per la media di x. Indici: 0->C 1->OR 2->IR 3->B F3_AVG_BUFFER_X(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double ' Indice per la sscrittura sul buffer F3_Buffer_Idx_X As Long ' Matrice dove metto i valori per la media di y. F3_AVG_BUFFER_Y(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double ' Indice per la scrittura sul buffer F3_Buffer_Idx_Y As Long ' Matrice dove metto i valori per la media di z. F3_AVG_BUFFER_Z(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double ' Indice per la sscrittura sul buffer F3_Buffer_Idx_Z As Long sum_x(FFNUMBER) As Double 'Somma dei picchi x fare le medie sum_y(FFNUMBER) As Double 'Somma dei picchi x fare le medie sum_z(FFNUMBER) As Double 'Somma dei picchi x fare le medie 'MACCHINE A STATI ' Stati SM di basso livello x F3_SM_curr_x_C As Long F3_SM_next_x_C As Long F3_SM_curr_x_OR As Long F3_SM_next_x_OR As Long F3_SM_curr_x_IR As Long F3_SM_next_x_IR As Long F3_SM_curr_x_B As Long F3_SM_next_x_B As Long ' Contatori SM di basso livello x F3_counter_x_C As Long F3_counter_x_OR As Long F3_counter_x_IR As Long F3_counter_x_B As Long ' Stati SM di basso livello y F3_SM_curr_y_C As Long F3_SM_next_y_C As Long F3_SM_curr_y_OR As Long F3_SM_next_y_OR As Long F3_SM_curr_y_IR As Long F3_SM_next_y_IR As Long F3_SM_curr_y_B As Long F3_SM_next_y_B As Long ' Contatori SM di basso livello y F3_counter_y_C As Long F3_counter_y_OR As Long F3_counter_y_IR As Long F3_counter_y_B As Long ' Stati SM di basso livello z F3_SM_curr_z_C As Long F3_SM_next_z_C As Long F3_SM_curr_z_OR As Long F3_SM_next_z_OR As Long F3_SM_curr_z_IR As Long F3_SM_next_z_IR As Long F3_SM_curr_z_B As Long F3_SM_next_z_B As Long ' Stati SM principale MAIN_SM_curr As Long MAIN_SM_next As Long ' Contatori SM di basso livello z F3_counter_z_C As Long F3_counter_z_OR As Long F3_counter_z_IR As Long F3_counter_z_B As Long ' Stati per la SM di alto livello F3_SM_curr_C As Long F3_SM_next_C As Long F3_SM_curr_OR As Long F3_SM_next_OR As Long F3_SM_curr_IR As Long F3_SM_next_IR As Long F3_SM_curr_B As Long F3_SM_next_B As Long ' Contatori SM di alto livello F3_counter_C_OK As Long F3_counter_OR_OK As Long F3_counter_IR_OK As Long F3_counter_B_OK As Long F3_counter_C_WRN As Long F3_counter_OR_WRN As Long F3_counter_IR_WRN As Long F3_counter_B_WRN As Long F3_counter_C_DMG As Long F3_counter_OR_DMG As Long F3_counter_IR_DMG As Long F3_counter_B_DMG As Long ' Contatori SM principale MAIN_SM_pkt_counter As Long MAIN_SM_window_counter As Long MAIN_SM_last_ret As Long packet(DATIPACCH) As Byte MAIN_x(CAMPIONI_DESIDERATI) As Double MAIN_y(CAMPIONI_DESIDERATI) As Double MAIN_z(CAMPIONI_DESIDERATI) As Double ' FILTRO FIR statFirValues_X(FIR_TAP_NUMBER) As Double statFirValues_Y(FIR_TAP_NUMBER) As Double statFirValues_Z(FIR_TAP_NUMBER) As Double 'COSTANTI DEL CUSCINETTO ' Soglie per la fase 1->2 F2L_X_TH As Double F2L_Y_TH As Double F2L_Z_TH As Double ' Soglie da sommare alla media per il calcolo dell'errore C_THRESHOLD As Double OR_THRESHOLD As Double IR_THRESHOLD As Double B_THRESHOLD As Double ' Costanti del cuscinetto ' Ball diameter DB As Double ' Pitch diameter DP As Double ' Number of rolling elements NB As Double ' Ball contact angle (rad) TETA As Double temperature(CAMPIONI_DESIDERATI) As Double temperature_cnt As Long End Type
Ora... l'algoritmo implementato in C è la traduzione di un algoritmo Matlab usato a suo tempo come test. Stavo testando il comportamento del mio programma, verificando che i risultati che fornisce siano identici a quelli che forniva matlab.
A questo punto però mi sono accorto di un errore, ho indagato le cause e son giunto alla conclusione che per far funzionare correttamente l'algoritmo dovrei aumentare la grandezza di alcuni buffer, precisamente:
F3_AVG_BUFFER_X
F3_AVG_BUFFER_Y
F3_AVG_BUFFER_Z
che son così definiti:
Io dovrei aumentare il valore di F3_AVG_BUFFER_LENGTH che fino ad ora è stato 16.codice:F3_AVG_BUFFER_X(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double F3_AVG_BUFFER_Y(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double F3_AVG_BUFFER_Z(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double
L'idea era quella di provare a dichiararlo davvero molto grosso, ovvero 1024, 2048 o addirittura 4096.
In C ovviamente nessun problema... in VB mi salta fuori un:
"Fixed or static data can't be larger than 64K"
al che ho iniziato a diminuire la grandezza del buffer fino a che l'errore non è sparito...ovvero con
F3_AVG_BUFFER_LENGTH = 456.
Il mio programma inizia con una schermata di selezione della lingua, dopodichè viene caricata la configurazione del sistema da un file, il che comporta avere una variabile di tipo bearing.
A questo punto mi salta fuori l'errore:
"Too many locals, nonstatic variables"
ho provato a diminuire ancora il valore di F3_AVG_BUFFER_LENGTH e quando vale 110 non mi da più problemi, ma non è ancora abbastanza per il corretto funzionamento del mio programma...
qualcuno sa come posso fare per risolvere questo problema?
Grazie mille in anticipo
Apo

Rispondi quotando