Newsgroup: it.comp.lang.visual-basic
Titolo: [?] prototipo funzione in C/C++

Ciao a tutti,
Ammetto ancora la mia ignoranza in C/C++, ma ho bisogno di implementare una
funzione in C++ da usare poi in VB con una Declare.
In VB sarebbe cosě:
Private Type TMyType
    dblValue            As Double
    strValue            As String
    blnValue            As Boolean
End Type
Dim MyVar() as TMyType ' tratto un array!
Sub MySub(MyVar() As TMyVar)
Ho tradotto cosě:
struct TOperand {
    double  dblValue;
    LPCTSTR strValue;
    bool    blnValue;
};
extern "C" __declspec(dllexport) void WINAPI MySub(TMyType *MyVar)
Solo che
1) non sono sicuro della traslitterazione
2) come faccio all'interno della funz. a riferirmi ai vari elementi
dell'array?
Grazie a tutti.

 elementi dell'array?
Per prima cosa tieni presente che gli array predefiniti non
contengono informazioni sulla loro
dimensione, quindi devi necessariamente anche passare la
dimensione dell'array alla funzione.
Poi: MyVar[0], MyVar[1], ecc...
Tieni anche presente che LPCTSTR è const.
P.S.
Perché utilizzi quell'orribile T davanti al nome della
struttura??
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 struttura??
Retaggio del mio passato di Delphista :)
Ciao

 dell'array?
MyVar[numero-elemento].variabile
da mie prove passate ho notato che se la type che gestisci ha solo double al
suo interno funziona, ma se invece a tipi diversi non c'č nulla da fare ...
non sono ancora riuscito a capire il perchč...
il fatto dell'api polygon passa solo variabili identiche (long)all'interno
della type pointapi č per questo non da problemi..
se perň sei riuscito a saperne di piů magari fallo sapere  :))
ciao

Da una okkiata a cosa è un SafeArray.... :)!! Il vb un array (es. : Nome() )
in realtà è una struttura dati al cui interno snoo contenute varie
informazioni tra cui anche il puntatore all'area di memoria in cui sono
contenuti i dati, il numero di byte per elemento ed il numero di elementi...
ti sarà moooolto di aiuto per poter sfruttare nel modo corretto i dati
dell'array in C!!!!
Ciao Emas....

> Da una okkiata a cosa è un SafeArray.... :)!! Il vb un array (es. :
Nome() )
si si verissimo......
però non passo il safearray in questo modo arr() ma il refer al primo
elemento ( elemento(0) ) e a quanto sembra vb  non li mette tutti in
fila,sembra però che lo faccia ocn variabili identiche tipo double o long
:)))
cmq devo leggere ancora non poco per capirci qualcosa :))
ciao

 (che poi sarebbe un alias per cosa?)
typedef const TCHAR *LPCTSTR
e
typedef wchar_t TCHAR.
quindi LPCTSTR è un puntatore ad un oggetto costante di tipo
wchar_t (wide-char).
Questo significa che al puntatore puoi assegnare un altro
oggetto, ma non puoi modificare l'oggetto a cui punta.
Per consigliarti strade alternative bisognerebbe sapere cosa
hai bisogno di fare con le stringhe della struttura (leggerle,
modificarle, ecc...)


 fila,sembra però che lo faccia ocn variabili identiche tipo double o long
No, gli elementi di un array sono tutti contigui, e la struttura in VB
(fortunatamente! In 
VB.NET
 bisogna serializzarla...) è esattamente un blocco
di memoria come rapperentato dal type.
L'unico punto d'attenzione è che i membri di tipo String in realtà vengono
passati come puntatori alla stringa, quindi 4 byte da referenziare.
Ciao

 4 byte da referenziare.
Il problema sono i byte di padding che il VB aggiunge nelle
strutture...


 modificarle, ecc...)
No, ho bisogno di leggerle e di scriverle.
Se il tipo LPCTSTR non è l'ideale non importa: dimmi se c'è qualcosa d'altro
di compatibile con il tipo string? (LPSTR? Ho visto che LPCSTR è "Same as
LPSTR, except used for read-only string pointers", BSTR? *char? *UCHAR?)
Vorrei solo capire da dentro alla funz. C++, come raggiungere i vari
elementi:
...void MiaSub(MioType *MioArray, int Count) // sarà giusto?
{
    for (int i = 0; i < Count; i++){
        MioArray[i].membro //???
        *MioArray[i].membro //???
        (MioArray + i)->membro //???
        // varie ed eventuali?
    }
}
Ciao


non è proprio così se fossero solo 4 byte come puntatore non ci sarebbero
problemi invece ci sono . :))
non ho certezze e dovrei provare meglio
ciao

 }
ci sono riuscito passandolo ocme safearray leggi questo su google che ti
aiuterà moltissimo
http://groups.google.com/groups?hl=it&lr=&ie=UTF8&oe=UTF8&threadm=adkvp1%241
hb%2407%241%
40news.t-online.com
&rnum=10&prev=/groups%3Fas_q%3DSafeArray%2520
vb%2520dll%26ie%3DUTF8%26oe%3DUTF8%26lr%3D%26as_scoring%3Dd%26hl%3Dit
usa char * per le stringhe e poi MioArray[i].membro
ciao

         MioArray[i].membro //???
Sì.


 sicuramente non ci riescono in caso non sia un tipo
se non sbaglio il compilatore prima prova ad usare un registro se libero
altrimenti la variabile.
Però mi risulta che nel ciclo for è uguale usare "post" o  "pre" fisso per
l'incremento o no? :))
ciao

 "pre" fisso per l'incremento o no? :))
Il risultato è perfettamente uguale, ma in un caso c'è
comunque la creazione di una copia temporanea della variabile
contatore. Essendo un tipo predefinito generalmente i
compilatori ottimizzano *non* creando il temporaneo, ma è
meglio abituarsi ad usare la forma prefissa.
