Ciao a tutti, è la prima volta che scrivo quindi spero di aver postato nella sezione giusta.
Avrei un problema con VB6.
Devo creare una'applicazione che si interfaccia con una DLL scritta in C.
La dll è già pronta, testata e le funzioni vengono esportate correttamente.
In questa dll ho definito un tipo:
Ora, lavorando su VB6 mi son trovato a dover replicare la struttura e l'ho fatta così:codice:typedef struct Cuscinetto { int F2L_avg_counter; double F2L_X_SUM[CAMPIONI_DESIDERATI], F2L_Y_SUM[CAMPIONI_DESIDERATI], F2L_Z_SUM[CAMPIONI_DESIDERATI]; double F2_Golden_X[CAMPIONI_DESIDERATI], F2_Golden_Y[CAMPIONI_DESIDERATI], F2_Golden_Z[CAMPIONI_DESIDERATI]; int F2_SM_curr_x, F2_SM_next_x; int F2_SM_curr_y, F2_SM_next_y; int F2_SM_curr_z, F2_SM_next_z; int F2_counter_x; int F2_counter_y; int F2_counter_z; int F2_SM_curr, F2_SM_next; int F2_OK_counter, F2_WRN_counter, F2_DMG_counter; int F3L_avg_counter; // Contatore per la media della fase 1->3 double F3L_X_SUM[FFNUMBER], F3L_Y_SUM[FFNUMBER], F3L_Z_SUM[FFNUMBER]; double F3_Golden_X[FFNUMBER], F3_Golden_Y[FFNUMBER], F3_Golden_Z[FFNUMBER]; double F3_AVG_BUFFER_X [F3_AVG_BUFFER_LENGTH][FFNUMBER]; int F3_Buffer_Idx_X; double F3_AVG_BUFFER_Y [F3_AVG_BUFFER_LENGTH][FFNUMBER]; int F3_Buffer_Idx_Y; double F3_AVG_BUFFER_Z [F3_AVG_BUFFER_LENGTH][FFNUMBER]; int F3_Buffer_Idx_Z; double sum_x[FFNUMBER]; double sum_y[FFNUMBER]; double sum_z[FFNUMBER]; int F3_SM_curr_x_C, F3_SM_next_x_C; int F3_SM_curr_x_OR, F3_SM_next_x_OR; int F3_SM_curr_x_IR, F3_SM_next_x_IR; int F3_SM_curr_x_B, F3_SM_next_x_B; int F3_counter_x_C; int F3_counter_x_OR; int F3_counter_x_IR; int F3_counter_x_B; int F3_SM_curr_y_C, F3_SM_next_y_C; int F3_SM_curr_y_OR, F3_SM_next_y_OR; int F3_SM_curr_y_IR, F3_SM_next_y_IR; int F3_SM_curr_y_B, F3_SM_next_y_B; int F3_counter_y_C; int F3_counter_y_OR; int F3_counter_y_IR; int F3_counter_y_B; int F3_SM_curr_z_C, F3_SM_next_z_C; int F3_SM_curr_z_OR, F3_SM_next_z_OR; int F3_SM_curr_z_IR, F3_SM_next_z_IR; int F3_SM_curr_z_B, F3_SM_next_z_B; int MAIN_SM_curr; int MAIN_SM_next; int F3_counter_z_C; int F3_counter_z_OR; int F3_counter_z_IR; int F3_counter_z_B; int F3_SM_curr_C, F3_SM_next_C; int F3_SM_curr_OR, F3_SM_next_OR; int F3_SM_curr_IR, F3_SM_next_IR; int F3_SM_curr_B, F3_SM_next_B; int F3_counter_C_OK; int F3_counter_OR_OK; int F3_counter_IR_OK; int F3_counter_B_OK; int F3_counter_C_WRN; int F3_counter_OR_WRN; int F3_counter_IR_WRN; int F3_counter_B_WRN; int F3_counter_C_DMG; int F3_counter_OR_DMG; int F3_counter_IR_DMG; int F3_counter_B_DMG; int MAIN_SM_pkt_counter; int MAIN_SM_window_counter; int MAIN_SM_last_ret; char packet[DATIPACCH]; double MAIN_x[CAMPIONI_DESIDERATI]; double MAIN_y[CAMPIONI_DESIDERATI]; double MAIN_z[CAMPIONI_DESIDERATI]; double statFirValues_X[FIR_TAP_NUMBER], statFirValues_Y[FIR_TAP_NUMBER], statFirValues_Z[FIR_TAP_NUMBER]; double F2L_X_TH; double F2L_Y_TH; double F2L_Z_TH; double C_THRESHOLD; double OR_THRESHOLD; double IR_THRESHOLD; double B_THRESHOLD; double DB; double DP; double NB; double TETA; double temperature[CAMPIONI_DESIDERATI]; unsigned int temperature_cnt; }bearing;
In VB creo un array di bearing e fin qui nessun problema.codice:Public Type Bearing F2L_avg_counter As Long F2L_X_SUM(CAMPIONI_DESIDERATI) As Double F2L_Y_SUM(CAMPIONI_DESIDERATI) As Double F2L_Z_SUM(CAMPIONI_DESIDERATI) As Double F2_Golden_X(CAMPIONI_DESIDERATI) As Double F2_Golden_Y(CAMPIONI_DESIDERATI) As Double F2_Golden_Z(CAMPIONI_DESIDERATI) As Double 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 F2_counter_x As Long F2_counter_y As Long F2_counter_z As Long F2_SM_curr As Long F2_SM_next As Long F2_OK_counter As Long F2_WRN_counter As Long F2_DMG_counter As Long F3L_avg_counter As Long 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 F3_AVG_BUFFER_X(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double F3_Buffer_Idx_X As Long F3_AVG_BUFFER_Y(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double F3_Buffer_Idx_Y As Long F3_AVG_BUFFER_Z(F3_AVG_BUFFER_LENGTH, FFNUMBER) As Double 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 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 F3_counter_x_C As Long F3_counter_x_OR As Long F3_counter_x_IR As Long F3_counter_x_B As Long 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 F3_counter_y_C As Long F3_counter_y_OR As Long F3_counter_y_IR As Long F3_counter_y_B As Long 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 MAIN_SM_curr As Long MAIN_SM_next As Long F3_counter_z_C As Long F3_counter_z_OR As Long F3_counter_z_IR As Long F3_counter_z_B As Long 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 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 MAIN_SM_pkt_counter As Long MAIN_SM_window_counter As Long MAIN_SM_last_ret As Long packet(DATIPACCH) As Long MAIN_x(CAMPIONI_DESIDERATI) As Double MAIN_y(CAMPIONI_DESIDERATI) As Double MAIN_z(CAMPIONI_DESIDERATI) As Double statFirValues_X(FIR_TAP_NUMBER) As Double statFirValues_Y(FIR_TAP_NUMBER) As Double statFirValues_Z(FIR_TAP_NUMBER) As Double F2L_X_TH As Double F2L_Y_TH As Double F2L_Z_TH As Double C_THRESHOLD As Double OR_THRESHOLD As Double IR_THRESHOLD As Double B_THRESHOLD As Double DB As Double DP As Double NB As Double TETA As Double temperature(CAMPIONI_DESIDERATI) As Double temperature_cnt As Long End Type
Sto creando l'interfaccia grafica che sfrutterà la dll per la parte di calcolo e alcune funzioni funzionano correttamente, per esempio ho una funzione in C così definita:
che copia semplicemente i valori passati come parametro nelle rispettive variabili di currbearing, da VB passo l'oggetto di tipo bearing per riferimento e funziona perfettamente.codice:int _stdcall Param_Load(bearing *curr_bearing, double F2L_X_TH, double F2L_Y_TH, double F2L_Z_TH, double C_THRESHOLD, double OR_THRESHOLD,double IR_THRESHOLD,double B_THRESHOLD, double DB, double DP, double NB, double TETA);
Questa è la dichiarazione della funzione:
codice:Public Declare Function Param_Load Lib "C:\Documents and Settings\Ale\Desktop\GUI\SKF_Multi.dll" (ByRef curr_bearing As Bearing, ByVal F2L_X_TH As Double, ByVal F2L_Y_TH As Double, ByVal F2L_Z_TH As Double, ByVal C_THRESHOLD As Double, ByVal OR_THRESHOLD As Double, ByVal IR_THRESHOLD As Double, ByVal B_THRESHOLD As Double, ByVal DB As Double, ByVal DP As Double, ByVal NB As Double, ByVal TETA As Double) As Integer
E questa è la chiamata:
dove tmpbear è una variabile temporanea, che una volta inizializzata con Param_load viene copiata in un vettore.codice:Call Param_Load(tmpbear, F2L_X_TH, F2L_Y_TH, F2L_Z_TH, C_THRESHOLD, OR_THRESHOLD, IR_THRESHOLD, B_THRESHOLD, DB, DP, NB, TETA)
A questo punto mi trovo a dover usare un'altra funzione, ecco il prototipo in C:
ciò che deve fare è semplicemente prendere i valori dei vettori g_x, g_y e g_z e copiarli nei vettori curr_bearing->F2_Golden_X, curr_bearing->F2_Golden_Y e curr_bearing->F2_Golden_Zcodice:int _stdcall F2_SetGolden(double *g_x, double *g_y, double *g_z, bearing *curr_bearing);
è quindi una funzione molto stupida con un semplice iclo for all'interno.
In VB l'ho importata così:
e la richiamo così:codice:Public Declare Function F2_SetGolden Lib "C:\Documents and Settings\Ale\Desktop\GUI\SKF_Multi.dll" (ByRef g_x As Double, ByRef g_y As Double, ByRef g_z As Double, ByRef curr_bearing As Bearing) As Integer
CONF_BEARINGS è il vettore di bearing di cui parlavo prima. In questo caso mi interessa il primo elemento, in altri passerò altri elementi.codice:Call F2_SetGolden(g_x(0), g_y(0), g_z(0), CONF_BEARINGS(0))
Il problema che è è che la copia non funziona, per provare ho inizializzato g_X con i valori 1 2 3 4 5 ecc
ma dopo l'esecuzione della funzione CONF_BEARINGS(0).F2_Golden_X ha valori insensati come 5.0134563457451-34
Ho pensato che il problema potessero essere i vettori g_x, g_y e g_z visto che nella funzione Param_Load il passaggio di un oggetto di tipo bearing funzionava.
Per togliermi il dubbio ho modificato la funzione nella dll facendo in modo che copiasse il contenuto di g_x in g_y e questa ha funzionato perfettamente. Credo il problema stia quindi nel tipo bearing.
Qualcuno sa darmi una dritta per risolvere questo problema?
Scusate se ho scritto un poema inserendo magari cose inutili, ma vi ho scritto praticamente tutto ciò che ho fatto per evitare di vedermi consigliare strade già provate.
Grazie mille in anticipo
Apo

Rispondi quotando
