View Full Version : [c++] riprendere un puntatore tchar
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
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. ;)
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
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... */
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??
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*.
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;
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.