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