Newsgroup: it.comp.lang.visual-basic
Titolo: Variant e vettori

ho un problema con una dll activex che si occupa di effettuare operazioni
sui dati.
per fare questo ho in ingresso un vettore di tipo long, se richiamo la
funzione
da vb tutto funziona correttamente, il problema si presenta nel momento
in cui la stessa funzione la richiamo tramite uno script in una pagina ASP,
ovvero ottengo l'erroro tipo non corretto.
Ho provato allora a cambiare la dichiarazione della varriabile in ingresso
alla funzione, dichirandola
di tipo variant (per venire incontro a vbscript), da vb tutto continua a
essere ok,
mentre ancora non riesco a richiamarla tramite ASP, ottenendo sempre lo
stesso errore.
Premetto che ho la certezza che il vettore che passo da ASP contiene solo
valori
di tipo long e il fatto di utilizzare variant è solo un tentativo di
obbligare la mia funzione ad accettare
i dati in ingresso.
please help me!

Beh potrebbe essere proprio un problema già da te riscontrato.
Vbscript non accetta i tipi, o meglio tratta tutto come variant, e
forse si incazza proprio perchè tu glielo specifichi.
Ora credo che vb sia tanto "gentile" da permetterti di omettere
il tipo di dato nelle variabili in ingresso.
Prova a compilarla senza definire i tipi e vedi che ti succede.
Se puoi, fai in modo che ti dica anche la riga di errore in cui
si inceppa. Potrebbe non essere nella chiamata alla dll, ma
all'interno del codice stesso.
Ciao Andrea

 all'interno del codice stesso.
la riga di errore che mi restituisce è quella dello script dove richiamo la
funzione,
che provata nuovamente da vb, senza tipizzare nessun parametro continua a
funzionare correttamente.

 stesso errore.
[SNIP]
Questo secondo sistema funziona sicuramente, ma devi stare attento a come
chiami la funzione in ASP: poniamo di avere un ActiveX con un metodo 'Test'
fatto cosi':
Public Sub Test(a As Variant)
Dim i As Integer
ReDim a(9)
For i = 0 To 9
    a(i) = "Item numero " & i
Next
e la relativa pagina ASP:
<html><head><title>Test</title></head>
<body>
<h1>Questo e' un test:</h1>
<%
Dim objTest
Dim v, i
Set objTest=CreateObject("Test.Class1")
objTest.Test(v)
For i=0 to 9
 Response.Write(V(i))
 Response.Write("<br>")
Next
%>
</body></html>
nota la riga 'objTest.Test(v)': essendo una Sub, qui le parentesi sono
superflue, ma non solo, vengono interpretate secondo un "vecchio" criterio,
che non ricordo nemmeno dove ho letto ma ormai ho tatuato sulle chiappe ;-),
che forza il passaggio del parametro *per valore*.
Fatto sta che se correggi la riga suddetta in una delle due sintassi
corrette
objTest.Test v
'oppure
Call objTest.Test(v)
magicamente funziona tutto.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


posto il codice incriminato:
<%@ Language=VBScript %>
<%
option explicit
.
.
.
dim vetOut()
dim i
dim datiVariFunction
dim T
.
.
.
set datiVariFunction=server.CreateObject("nomedll.clsDatiVari")
T=datiVariFunction.nomefunzione (1, 1, 5, 2, vetOut, "nome archivio")
<--riga di errore
set datiVariFunction=nothing
.
.
.
dichiarazione dll activex:
Public Function nomefunzione(ByVal a As Long, ByVal b As Long, ByVal c As
Long, ByVal d As Long, VetOut, ByVal archivio As String) As Boolean
ho provato anche con:
Public Function nomefunzione(a, b, c, d, VetOut, archivio) As Boolean
all'interno ho:
dim MioVet()as long
miovet=vetout
nota che se richiamo l'activex da vb funziona correttamente in entrambi i
modi

 modi
Hmmm... sei sicuro?
Da quello che ho verificato non e' un problema ASP, ma un problema di tipi
derivato dalla assegnazione qui sopra: stai cercando di copiare un variant
contenente un array dentro un array "liscio", non dipende dai dati
contenuti, sono proprio due strutture diverse.
Se provo il tuo prototipo di funzione in un progetto VB infatti ottengo
comunque un Type Mismatch, cosa che invece non si verifica con
dim MioVet As Variant    'per inciso questo e' diverso da
                        'dim MioVet() As Variant
miovet=vetout



ci riprovo, comunque quello che faccio nell'ultima versione, e che da vb
funziona,
è dichiarare nell'activex un vettore di long
dim miovet()as long
ed in ingresso ho una variabile variant, che riesco ad assegnare
tranquillamente
a miovet, dato che questa variabile è per me un vettore, il problema è forse
che
da vb quando richiamo la funzione uso una varibile tipizzata, cosa che in
asp non
posso fare, questo forse mi impedisce di rendermi conto dell'errore, provo a
seguire il
consiglio e a non usare variabili tipizzate.

> nota la riga 'objTest.Test(v)':
In asp, così come in Vb, non puoi richiamare una function e passare
i valori con le parentesi se non assegni il risultato ad una variabile,
o se la chiamata è singola, quindi sicuramente il metodo è sbagliato di suo
ed è normale che ti dia errore.
Certo è che l'errore che doveva darti è (non ricordo il codice)
"Impossible to call sub or function with parntheses"
Resta da provare il secondo, che a quanto sembra non funziona lo stesso.
Ciao Andrea

 "Impossible to call sub or function with parntheses"
stesso problema che ho riscontrato io, comunque sono riuscito a risolvere il
tutto
usando solo variabili non tipizzate.

 >
problema risolto dichiarando tutte le variabili interessate
come:
dim miavar as variant.
grazie dell'aiuto.