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:


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
per la cronaca son sicuro che il tutto funzioni correttamente... anche perchè oregon mi ha dato una grossa mano in passato.

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:
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
Io dovrei aumentare il valore di F3_AVG_BUFFER_LENGTH che fino ad ora è stato 16.
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