PDA

Visualizza la versione completa : Problemi col passaggio di vettori unidimensionali da Dll in Basic a Dll in C


IlViandante2960
24-09-2013, 10:54
Salve, ho da modificare un progetto in VB6.0 e VC++6.0 nel quale una funzione in una DLL in Basic chiama una funzione in una DLL in C.

Il passaggio dei parametri per le singole variabili (int, float, double) va bene, mentre nel passaggio di array unidimensionali ho grossi problemi. I valori che ottengo nella parte della DLL in C sono completamente errati.

Ho letto in rete la documentazione presente per le modalità di passaggio di un array unidimensionale tra Basic e C e non credo di commettere errori al riguardo.

Qualcuno può postarmi del codice testato su come passare un vettore unidimensionale tra DLL scritte Basic-C


Grazie per tutte le info che riuscirete a fornirmi.


:ciauz:

oregon
24-09-2013, 11:30
Quale documentazione hai letto ?


Vedi se questo

http://www.visual-basic.it/Dettaglio/tabid/132/ArticleId/192/Utilizzare-codice-C-C-con-Visual-Basic.aspx#.UkFdWMZkDmc

(richiede un login)

ti può essere utile


Perché non provi a postare il codice usato che non va ?

IlViandante2960
24-09-2013, 11:56
Nella parte DLL BASIC:


Private Declare Sub ProgVC Lib "Lib_C.dll" (ByRef X1 As Double, ByVal Lim1 As Integer)


Lim1 = UBound(X1#) + 1
Call ProgVC (X1#(0), Lim1)



Nella parte DLL C:

.h
void __stdcall ProgVC (double *x1);


.cpp
void __stdcall ProgVC (double *x1)
{
.............
.............
}


Ovviamente nel progetto della DLL in C ho definito il file *.def.
Come dicevo nella parte C esaminando l'array ottengo valori errati.
Qui per semplificare ho riportato solo la parte dell'array. Le variabili scalari della routine vengono passate correttamente.



:ciauz:

oregon
24-09-2013, 14:11
Scusa, ma nel Basic hai due parametri e nel C ne hai uno. Da una parte tratti dei double e dall'altra degli integer ... per forza che non va.

Dammi qualche indicazione maggiore e ti fornisco qualche suggerimento più preciso.

IlViandante2960
24-09-2013, 15:10
Magari fosse quello il problema.

Nel passaggio di un vettore monodimensionale da Basic a C occorre passare il puntatore al primo elemento e la dimensione del vettore. Questo è normale.

Non ti sei mai trovato in una situazione analoga? Uso di 2 linguaggi di programmazione che comunicano tra loro?


:ciauz:

oregon
24-09-2013, 15:59
Sì, parecchie volte ... e ti ho anche consigliato di leggere un articolo che ti mostra come fare con esempi.

oregon
24-09-2013, 16:07
Nel passaggio di un vettore monodimensionale da Basic a C occorre passare il puntatore al primo elemento e la dimensione del vettore. Questo è normale.

No... non è così ...

Me ne sono occupato parecchie volte ... e ti ho anche consigliato di leggere un articolo che ti mostra come fare con esempi.

oregon
24-09-2013, 16:37
Nel tuo caso, il programma VB6 ad esempio sarà



Private Declare Sub ProgVC Lib "TuaLib.dll" (ByRef X1 As Double, ByVal Lim1 As Long)

Private Sub Form_Click()
Dim arr(100) As Double

arr(0) = 110
arr(1) = 220

Call ProgVC(arr(0), 100)

Print arr(0)
Print arr(1)
End Sub


e quello della DLL



void __stdcall ProgVC (double *x1, int lun)
{
double temp;

temp=x1[1];
x1[1]=x1[0];
x1[0]=temp;
}

MItaly
24-09-2013, 16:50
Uhm, se i miei ricordi di VB6 non mi tradiscono, il secondo parametro nella declare dovrebbe essere di tipo Long.

oregon
24-09-2013, 17:06
Sì, corretto.

Loading