PDA

View Full Version : [c++] riprendere un puntatore tchar


okay
01-07-2006, 16:57
Ho necessita di farmi ritornare una matrice di tchar*
ho dichiarato questo:

TCHAR *Piloti[21];

in queta matrice devo copiarci la matrice sempre di tchar ritornando da una funzione posta in una dll

//prototipo dll
extern "C" TCHAR __declspec (dllexport) sPiloti();

funzione chiamata nella dll:
TCHAR __cdecl sPiloti()
{
return *(TCHAR *)Piloti;
}

e questo sopra compila....

questo è l'exe che chiama la funzione:
TCHAR *Piloti[21]; //stesso prototipo sopra della dll
questa sotto è la chiamata in cui prendere Piloti[] ... ma non sò come fare:

Piloti=sPiloti();
... ho errori anche provando in altri modi

andbin
01-07-2006, 19:23
Ho necessita di farmi ritornare una matrice di tchar*
ho dichiarato questo:

TCHAR *Piloti[21];

in queta matrice devo copiarci la matrice sempre di tchar ritornando da una funzione posta in una dll

//prototipo dll
extern "C" TCHAR __declspec (dllexport) sPiloti();

funzione chiamata nella dll:
TCHAR __cdecl sPiloti()
{
return *(TCHAR *)Piloti;
}

e questo sopra compila....

questo è l'exe che chiama la funzione:
TCHAR *Piloti[21]; //stesso prototipo sopra della dll
questa sotto è la chiamata in cui prendere Piloti[] ... ma non sò come fare:

Piloti=sPiloti();
... ho errori anche provando in altri modiAllora... Piloti è "un array di puntatori a TCHAR". Piloti, essendo il nome dell'array, non può essere utilizzato come lvalue, cioè non puoi assegnare qualcosa a Piloti!

Poi la funzione sPiloti nella DLL restituisce 1 solo carattere TCHAR. Quindi non è affatto chiaro cosa vuoi fare. Piloti è solo un array di puntatori. Dove vuoi inserire il carattere restituito dalla funziione???

Specifica meglio cosa vuoi fare, di più in questo momento, non saprei dirti. ;)

okay
01-07-2006, 20:02
Allora... Piloti è "un array di puntatori a TCHAR". Piloti, essendo il nome dell'array, non può essere utilizzato come lvalue, cioè non puoi assegnare qualcosa a Piloti!

Poi la funzione sPiloti nella DLL restituisce 1 solo carattere TCHAR. Quindi non è affatto chiaro cosa vuoi fare. Piloti è solo un array di puntatori. Dove vuoi inserire il carattere restituito dalla funziione???

Specifica meglio cosa vuoi fare, di più in questo momento, non saprei dirti. ;)


grazie andbin


Nella dll c'è TCHAR* Piloti[21];
tutti inizializzati a NULL poi nella dll viene popolata la matrice TCHAR con i nomi dei piloti non tutti dipende... potrebbe essere Piloti[0]="marco"
Piloti[3]="fabio" gli altri ancora a NULL ecc ecc.



nell'exe che chiama la dll c'è pure la dichiarazione TCHAR * Piloti[21];

ora chiamando dall'exe la funzione della dll:
Piloti[0]=(TCHAR*)sPiloti();
... ora compila ma non sò se è giusto per quello che devo fare....

In pratica vorrei prendere la matrice di TCHAR popolata nella dll e riproporla nell'exe chiamante sovrascrivendola o copiandola in Piloti[21] dell'exe chiamante così:

Piloti[0]="marco"
Piloti[3]="fabio"

spero di essermi spiegato


ciao


p.s. poi ci sarebbe un'errore molto grave che se risolvo questo sopra poi ti spiego si tratta di ritornare un & ... la questione è complessa ma secondo me si fà.

alle volte mi impappino quando codo a stringhe

andbin
01-07-2006, 21:06
Ok, adesso è più chiaro. Puoi fare così (è una possibilità, ovviamente, vedi se ti va bene):

Nella DLL metti:
TCHAR* Piloti[21];

...

TCHAR** __cdecl getPiloti (void)
{
return Piloti;
}
Nel programma (.EXE) metti:
extern "C" TCHAR** __cdecl getPiloti(void);

...

TCHAR **Piloti;

...

Piloti = getPiloti ();

/* Ora accedi tranquillamente con Piloti[0], Piloti[1], ecc... */

okay
01-07-2006, 22:18
Ok, adesso è più chiaro. Puoi fare così (è una possibilità, ovviamente, vedi se ti va bene):

Nella DLL metti:
TCHAR* Piloti[21];

...

TCHAR** __cdecl getPiloti (void)
{
return Piloti;
}
Nel programma (.EXE) metti:
extern "C" TCHAR** __cdecl getPiloti(void);

...

TCHAR **Piloti;

...

Piloti = getPiloti ();

/* Ora accedi tranquillamente con Piloti[0], Piloti[1], ecc... */


okay andbin

nel tuo secondo tag code hai messo:

TCHAR **Piloti;

e poi

Piloti = getPiloti ();


mi pare che posso tenere globale nell'exe chiamante TCHAR* Piloti[21];

e poi fare Piloti = getPiloti ();

oppure è necessario TCHAR **Piloti;

non credo TCHAR* Piloti[21]; è simile a TCHAR** Piloti;
... giusto??



ok






non apro un'altro 3d in quanto riguarda sempre ritorni da funzioni

allora... per me questa è tosta dunque:

Ti premetto che questo codice sotto è ok:
g_bike[pMsg->idN-1].SetBikeData(&pMsg->Data);
però ho fatto una dll quindi questo sopra devo farmelo ritornare dalla dll.



nell'exe e nella dll o queste strutture:

struct t_matrixComp
{
float qRot[4];
float qTran[3];
};

struct t_bikeData
{
t_matrixComp mat[3];
float stpf[4];
};

poi nell'exe prendo la posizione 3d del mio personaggio così:

t_bikeData data;
g_bike[PLAYER].GetBikeData(&data);

con queste 2 righe sopra prendo sempre la nuova posizione in g_bike[PLAYER] del mio personaggio...ok

ora devo andare a prendere, dall'exe, le posizioni degli altri personaggi nella dll e ho pensato di fare così:

prototipo dll ed exe:
extern "C" t_bikeData __declspec (dllexport) Prendi_data();

nella dll:
t_bikeData dato;//dichiarazione
dato=pMsg->Data; //non sono sicuro di questo, forse così &pMsg->Data

...poi

t_bikeData __cdecl Prendi_data()
{
return dato;//prendo dato e me lo ritorno
//però come vedi è un'asseganzione senza &
}



chiamata dall'exe alla dll per farmi ritornare la posizione dell'n personaggio:
//Prendi_idN()-1 è l'indice e funziona
g_bike[Prendi_idN()-1].SetBikeData(Prendi_data());setta la posizione

.... ecco quest'ultima riga non và....

che ne pensi??... come fare per riprendere la struttura??

andbin
01-07-2006, 22:49
mi pare che posso tenere globale nell'exe chiamante TCHAR* Piloti[21];La questione è questa: se metti nell'exe TCHAR *Piloti[21]; questo è un array e non puoi usare Piloti come lvalue cioè non puoi fare Piloti=....

Puoi fare in 3 modi:

Modo 1) Come già descritto nel mio post precedente: fare in modo che la funzione nella DLL restituisca un TCHAR** (che è compatibile, come tipo, con il TCHAR *Piloti[21]; della DLL).

Modo 2) Tenere nell'exe TCHAR *Piloti[21]; facendo però in modo da passare Piloti alla funzione in modo che sia questa a "riempire" i 21 puntatori.
EXE:
TCHAR *Piloti[21];
riempiPiloti (Piloti);DLL:
TCHAR *Piloti[21];

void __cdecl riempiPiloti (TCHAR *p[21])
{
/* loop per riempire p[0], p[1] ... */
}

Modo 3) Ci sarebbe un terzo modo ma lo troverei scomodo: tenere nell'exe sempre TCHAR *Piloti[21]; e fare in modo da passare alla funzione un indice 0, 1, .... e poi far ritornare un TCHAR* (con la stringa selezionata). Così però nell`exe bisogna fare un ciclo for per "popolare" l'array.

non apro un'altro 3d in quanto riguarda sempre ritorni da funzioniMah ... non mi è molto chiaro il tutto ... però, ad intuito:
hai scritto
g_bike[pMsg->idN-1].SetBikeData(&pMsg->Data);
quindi SetBikeData riceve un puntatore.
Puoi quindi fare in modo che Prendi_data() restituisca un puntatore di tipo t_bikeData*.

okay
02-07-2006, 00:39
La questione è questa: se metti nell'exe TCHAR *Piloti[21]; questo è un array e non puoi usare Piloti come lvalue cioè non puoi fare Piloti=....

Puoi fare in 3 modi:

Modo 1) Come già descritto nel mio post precedente: fare in modo che la funzione nella DLL restituisca un TCHAR** (che è compatibile, come tipo, con il TCHAR *Piloti[21]; della DLL).

Modo 2) Tenere nell'exe TCHAR *Piloti[21]; facendo però in modo da passare Piloti alla funzione in modo che sia questa a "riempire" i 21 puntatori.
EXE:
TCHAR *Piloti[21];
riempiPiloti (Piloti);DLL:
TCHAR *Piloti[21];

void __cdecl riempiPiloti (TCHAR *p[21])
{
/* loop per riempire p[0], p[1] ... */
}

Modo 3) Ci sarebbe un terzo modo ma lo troverei scomodo: tenere nell'exe sempre TCHAR *Piloti[21]; e fare in modo da passare alla funzione un indice 0, 1, .... e poi far ritornare un TCHAR* (con la stringa selezionata). Così però nell`exe bisogna fare un ciclo for per "popolare" l'array.

Mah ... non mi è molto chiaro il tutto ... però, ad intuito:
hai scritto
g_bike[pMsg->idN-1].SetBikeData(&pMsg->Data);
quindi SetBikeData riceve un puntatore.
Puoi quindi fare in modo che Prendi_data() restituisca un puntatore di tipo t_bikeData*.



quello che pensavo + difficile, il 2 quesito, l'ho risolto... grande andbin

Tornando al primo quesito... come inizializzo TCHAR** Piloti;

così mi dà errore:
for(int i=0; i<21; i++){
Piloti[i]=NULL;

andbin
02-07-2006, 10:52
Tornando al primo quesito... come inizializzo TCHAR** Piloti;

così mi dà errore:
for(int i=0; i<21; i++){
Piloti[i]=NULL;Se hai usato la struttura del mio secondo post (la funzione getPiloti che ritorna un TCHAR**), non serve inizializzare Piloti nel exe. È un puntatore e viene impostato quando chiami la getPiloti.