|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
[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 |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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. ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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 Ultima modifica di okay : 01-07-2006 alle 19:06. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ok, adesso è più chiaro. Puoi fare così (è una possibilità, ovviamente, vedi se ti va bene):
Nella DLL metti: Codice:
TCHAR* Piloti[21]; ... TCHAR** __cdecl getPiloti (void) { return Piloti; } Codice:
extern "C" TCHAR** __cdecl getPiloti(void); ... TCHAR **Piloti; ... Piloti = getPiloti (); /* Ora accedi tranquillamente con Piloti[0], Piloti[1], ecc... */
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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?? Ultima modifica di okay : 01-07-2006 alle 21:20. |
|
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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: Codice:
TCHAR *Piloti[21]; riempiPiloti (Piloti); Codice:
TCHAR *Piloti[21]; void __cdecl riempiPiloti (TCHAR *p[21]) { /* loop per riempire p[0], p[1] ... */ } Quote:
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*.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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; |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:01.