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:
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;
Ora, lavorando su VB6 mi son trovato a dover replicare la struttura e l'ho fatta così:
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
In VB creo un array di bearing e fin qui nessun problema.
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:
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);
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.
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:
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)
dove tmpbear è una variabile temporanea, che una volta inizializzata con Param_load viene copiata in un vettore.
A questo punto mi trovo a dover usare un'altra funzione, ecco il prototipo in C:
codice:
int _stdcall F2_SetGolden(double *g_x, double *g_y, double *g_z, bearing *curr_bearing);
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_Z
è quindi una funzione molto stupida con un semplice iclo for all'interno.
In VB l'ho importata 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
e la richiamo così:
codice:
Call F2_SetGolden(g_x(0), g_y(0), g_z(0), CONF_BEARINGS(0))
CONF_BEARINGS è il vettore di bearing di cui parlavo prima. In questo caso mi interessa il primo elemento, in altri passerò altri elementi.
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