Newsgroup: it.comp.lang.visual-basic
Titolo: Array di strutture da VB a C (DLL)

Salve a tutti,
sto combattendo contro Visual Basic for Applications.. In particolare non
riesco a far sì che passi un array di strutture ad una mia funzione
scritta in C.
Tutte le altre funzioni vanno bene, passo di tutto, ma non riesco proprio
a passare l'array di strutture. La struttura, in C, è:
typedef struct _PIXEL {
	long x;
	long y;
} pixel;
ed in VB
Type pixel
	x as Long;
	y as Long
End Type
Riesco a passare la struttura (per riferimento), poi provo a creare una
funzione che accetti un array di pixel (sempre per riferimento, cioé
accetta un *pixel[]), e passo il primo elemento dell'array di pixel per
riferimento (ByRef nella dichiarazione, e quando passo metto Arr(0)).
Qualcuno sa dirmi dove sbaglio? Se necessario, posto il codice
incriminato. Access non dà alcun messaggio di errore specifico,
semplicemente si pianta e termina, dicendo che c'è stato un errore.
Grazie in anticipo.
-- 
[ Andrea Spadaccini a.k.a. Lupino / Lupin85 - from Catania ]
[ MAIL: lupin85(at)
email.it
 - ICQ: 91528290 - Linux 2.4.22 ]
[ Linux Registered User #313388 - Powered by Slackware 9.1 ]

 semplicemente si pianta e termina, dicendo che c'è stato un errore.
Da come scrivi si deduce che visual basic memorizzi ad ogni item 
dell'array un *puntatore* alla struttura mentre nella DLL accedi 
all'indirizzo del puntatore (cioe' non a quello *puntato*) credendo che 
si tratti dei dati contenuti nella struttura.
Altra possibilita' e' che la DLL non rispetti il limite superiore 
dell'array: passi anche il numero di elementi?
Per fugare ogni dubbio potresti mettere sotto debug la dll quando viene 
caricata dall'eseguibile di cui usi il VBA (excel, access o quel che e').
Il rimedio potrebbe essere copiare tutto in un array di byte (che 
passerebbe sicuramente tutto contiguo) e nella DLL ricopiare nel voluto 
array di strutture.
-- 
ciao, hal

 riferimento (ByRef nella dichiarazione, e quando passo metto Arr(0)).
io scriverei Byval As Long nella istruzione declare, e passereyi 
VarPtr(Arr(0)).
Nota il discorso sulla dimensionalità .... l'array qui sembra 
unidimensionale, mentre la dichiarazione in C pareva un array di 
puntatori. Come mai ?
ciao
cccp++mario


 riferimento (ByRef nella dichiarazione, e quando passo metto Arr(0)).
Una precisazione in attesa di un po' più di codice:
in C *non* esiste il passaggio per riferimento.
Il passaggio di un puntatore è un passaggio per valore anche se 
serve a *simulare* il passaggio per riferimento che, ripeto, in C non
esiste.
Detto questo dovrebbe risultare evidente che la funzione C si aspetta un
valore, in questo caso l'indirizzo di un puntatore a pixel.
Bisogna quindi capire cosa il VB passi effettivamente alla funziona C.
Inoltre, come già detto da HAL, passi anche la dimensione dell'array?
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 puntatori. Come mai ?
Bé, era un puntatore ad array :P
Forse mi confondo anche sulla sintassi del C...
Grazie a tutti per le risposte che mi avete dato e (spero) mi darete :)


 tre qui, ma credo che sia inutile scrivere tre messaggi molto simili :)
[snip]
dimenticavo... Fondamentalmente io devo disegnare un grafo, e lo disegno
tramite SDL. Quindi ciò che devo passare alle funzioni è un array di
coppie di coordinate (e per questo ho creato la struct pixel) oppure un
array di coppie di pixel (inizio e fine di archi, anche per questo ho
creato una struttura con due pixel).
Spero che questo chiarisca un po' il mio problema. Grazie ancora! :)


 		      const char* bmpFile, int nNodi, color *c, int newBmp);
In questa maniera ti va tutto OK, vero?
[Cioe', usando array di tipi "primitivi", come long]
Sono d'accordo con te che come eleganza sia meglio passare un array di 
struct, pero' secondo me quando hai a che fare con tipi di dato piu' 
"sofisticati" e con "collection" di tali tipi, se vuoi interfacciare C++ 
e VB ti conviene usare OLE. 
Una buona libreria di classi come MFC ti facilita molto il lavoro 
rispetto al C nudo e crudo (sarebbe comunque anche possibile usare 
direttamente il C nudo e crudo, ma e' anche *molto* complesso!).
Potresti realizzare un controllo ActiveX in C++ con MFC per il disegno 
di archi, e poi te lo ritrovi nella palette dei controlli VB; fai il 
drag-and-drop e lo inserisci in una form. Poi da VB ci invochi i vari 
metodi e accedi alle proprieta'.
Molto piu' elegante e comodo da usare (anche se piu' complesso da 
realizzare rispetto alla semplice DLL C "puro").
Ciao,
Dan

 realizzare rispetto alla semplice DLL C "puro").
Bé, credo che questo sia "troppo".. :)
Sarebbe troppo bello, ma anche, imho, un po' troppo complesso considerando
i tempi che ho a disposizione (il db devo consegnarlo il 20 dicembre, ma
ho altre 4 materie da studiare, contemporaneamente! :)
Grazie a tutti per l'aiuto e per l'attenzione!
