Newsgroup: it.comp.lang.visual-basic
Titolo: [?] passare un array ad una funzione di una dll?

ciao a tutti.
questa domanda conferma la mia totale incapacita' di utilizzare
l'msdn, supporto che continuo a sostenere essere una cosa indecente...
ho una funzione nella mia dll che accetta in ingresso un int
*listanodi, che deve contenere una lista di interi su cui lavorare.
in c allocherei l'array con una malloc e poi passerei il puntatore, ma
il problema e' che devo passarlo da visual basic.
come faccio a passare un array di interi ad una funzione? e come la
dichiaro nella fase iniziale del programma, dove indico le funzioni
che chiamero' dal mio programma in vb?
ero arrivato a questo:
Private Declare Function CalcolaDistanzeTempi Lib ".\brp.dll" _
        (ByVal NPuntiTotali As Integer, ByRef ListaNodi As Any, ByVal
NomeFile As String) _
        As Integer
...
Dim Cippa(2) As Integer
...
            lblRetValue.Caption = CalcolaDistanzeTempi(4, Cippa",
txtParametro2.Text)
ma non funziona, esattamente come alcune variazioni sul tema.
sapete aiutarmi di nuovo?
ok, al prossimo raduno porto una piadina a tutti quanti ;)
saluti che il 17 luglio si avvicina :)
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Subarone da 500 CV dreamer
Kawasaki "Gas Gas" ZZ-R 1100 - HD Electra Ultra Classic Dreamer
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 txtParametro2.Text)
devi passare il ref del primo elemento e il ref della stringa (non il
valore) che userai come char *nomefile
Private Declare Function CalcolaDistanzeTempi Lib ".\brp.dll" _
         (ByVal NPuntiTotali As Integer, ByRef ListaNodi As integer,
NomeFile As String) _
         As Integer
 Dim Cippa(2) As Integer
 lblRetValue.Caption = CalcolaDistanzeTempi(2, Cippa(0), txtParametro2.Text)
ciao

valore) che userai come char *nomefile
ti ringrazio. faccio qualche prova :)
mi sbagliero' di sicuro, ma pensavo di aver gia' fatto anche questa
prova :?
saluti.


 il problema e' che devo passarlo da visual basic.
Ti consiglio queste letture (presenti in MSDN, e, guarda un po' trovate
cercando tutt'altro :P)
- Passing Arrays to a DLL Procedure
- Passing Strings to a DLL Procedure
- Passing User-Defined Types to a DLL Procedure
- Passing Other Types of Information to a DLL Procedure
attenzione a non confonderle ad es. con questa
- Passing a String to a DLL Function
che è riferita a Visual J++ :)
Ciao

che è riferita a Visual J++ :)
e, stranamente, riguarderebbe da vicinissimo vc++, perche' e' sempre
una ottima cosa mettere un return value nelle funzioni :)
saluti e grazie.


 funzioni :)
Perché sarebbe un'ottima idea?
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

  lblRetValue.Caption = CalcolaDistanzeTempi(2, Cippa(0),
txtParametro2.Text)
ops vb gli integer li tratta diversamente (solo 2 byte) in c++ sono 4 byte
se non errro.Dovrai usare un array di long(magari controlla )
 Private Declare Function CalcolaDistanzeTempi Lib ".\brp.dll" _
          (ByVal NPuntiTotali As long, ByRef ListaNodi As long,
 NomeFile As String) _
          As long
  Dim Cippa(2) As long
  lblRetValue.Caption = CalcolaDistanzeTempi(2, Cippa(0),
txtParametro2.Text)
sorry
ciao :)

Perché sarebbe un'ottima idea?
perche' se non dai valori di ritorno e' estremamente difficile capire
cosa e' andato storto --se qualcosa e' andato storto--.
naturalmente, dopo ci sono i furbi che mettono ovunque
return(-1);
quindi non e' che ti aiuti piu' di tanto, ma dare dei
return(-qualcosa);
ti permette di risalire in modo relativamente comodo alla condizione
dell'errore.
saluti.


se non errro.Dovrai usare un array di long(magari controlla )
me ne ero accorto nelle prove che ho fatto dopo.
in effetti in c++ si usano tutti interi a 4 byte.
saluti.


 condizione dell'errore.
Beh, in questo senso non è affatto "un'ottima idea".
Utilizzare simili sistemi è purtroppo necessario in caso di
linguaggi che non abbiano alcuna gestione degli errori, come
il C.
Già farlo in VB od in C++ è decisamente un errore.


il C.
dunque, sto facendo una dll che mette a disposizione dell'utente 2
funzioni importanti --piu' alcune sciocchezze--. una carica da file
una rete stradale e l'altra calcola alcuni parametri con l'algoritmo
di dijkstra.
se c'e' un errore nel formato del file oppure l'algoritmo porta a
situazioni scorrette, che te ne fai della gestione degli errori di
visual basic?
intendevo *questi* problemi ed errori.
oddio: a me fa piacere sapere anche *quale* delle 30 malloc() che
faccio qual e' quella che mi ha dato un problema, ma al di fuori delle
chiamate a sistema ci sono migliaia di condizioni di errore che devi
gestire "a mano" con una function anziche' una sub.
saluti chiarificati :)
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Escortone da 500 CV dreamer


 con una function anziche' una sub.
Perché, come ho detto precedentemente stai utilizzando il C,
che non ha *nessun* tipo di gestione degli errori. Il C++ ti
mette a disposizione un ottima gestione delle eccezioni.
Se poi la dll deve essere utilizzata da VB (suppongo) e vuoi
che gli errori vengano gestiti dal VB e non dalla dll stessa,
utilizzando COM puoi propagare gli errori dalla dll al
programma VB che la utilizza.


programma VB che la utilizza.
a questo punto mi piacerebbe descriverti approfonditamente cosa fa il
programma per farmi dire da te come lo avresti fatto in c++.
saluti e grazie per la chiacchierata :)


 saluti e grazie per la chiacchierata :)
Prego...
