|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Messaggi: n/a
|
Puntatori e copia di dati.
Salve a tutti!
Supponenete che io abbia un puntatore a void che alloca un po' di spazio: void * myData; myData = (void*) malloc(1024); e che abbia ora 3 interi: int a, b, c; Come diavolo posso copiare i tre interi sequenzialmente nel puntatore? Uso un puntatore a void perché non vorrei copiarci dentro solo interi come in quest'esempio ... ma ad esempio ... 3 interi ed una stringa di lunghezza prefissata :-) Grazie 1000 anticipatamente a tutti! |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Messaggi: n/a
|
Eh, in realtà ho da passare dei dati con una SendMessage ... pensavo proprio ad una struttura
Codice:
typedef struct { int a; int b; int c; char * p; } TEST, *PTEST; Codice:
SendMessage(finestra, WM_COPYDATA, sizeof(TEST), (LPARAM)(PCOPYDATASTRUCT)&test) Sfortunatamente in questa maniera mi perdo il puntatore alla stringa! |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Innanzitutto leggi bene la documentazione relativa a WM_COPYDATA. lParam deve contenere un puntatore ad una struttura di tipo COPYDATASTRUCT, non ad una tua struttura qualunque!! Nella struttura COPYDATASTRUCT specificherai cosa copiare e il blocco di memoria, nota bene, non deve contenere puntatori (quindi il tuo modo di passare la stringa con char *p è sbagliato).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
per risolvere questo tipo di problema Win32 usa spesso la convenzione dell'ANYSIZE_ARRAY, una macro definita a 1.
Codice:
typedef struct { int a; int b; int c; char p[ANYSIZE_ARRAY]; } TEST, *PTEST; Codice:
char *pAnsiString = "asd roflol"; size_t testSize = sizeof(TEST) + strlen(pAnsiString); PTEST pTest = (PTEST)malloc(testSize); pTest->a = ...; pTest->b = ...; pTest->c = ...; strcpy(pTest->p, pAnsiString); Codice:
COPYDATASTRUCT cds; cds.cbData = testSize; cds.lpData = pTest; |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Feb 2007
Messaggi: 38
|
Potresti fare un casting prima della copia degli interi
Codice:
buffer_i = (int*)buffer; buffer_i[0] = int0; buffer_i[1] = int2; buffer_i[2] = int3; memcpy(((char*)buffer)+(sizeof(int)*3), stringa, strlen(stringa)); Codice:
memcpy(buffer, (void*)&int0, sizeof(int)); memcpy(((char*)buffer)+sizeof(int), &int1, sizeof(int)); memcpy(((char*)buffer)+(sizeof(int)*2), &int2, sizeof(int)); memcpy(((char*)buffer)+(sizeof(int)*3), stringa, strlen(stringa)); Ultima modifica di xorshadow : 16-03-2007 alle 19:33. |
![]() |
![]() |
![]() |
#7 |
Messaggi: n/a
|
Andbin .. si perdonami, nella fretta ho scritto la cacchiata del copiare direttamente test e non la struttura PCOPYDATASTRUCT di cui test intenzionalmente doveva essere il "campo" lpData :-)
Grazie 1000 anche a Xorshadow e 71104 per i preziosissimi consigli ... ora data l'ora sono un po' stanco ... ma già domani mi rimetto a lavoro :-D Grazie 1000 a tutti! |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:50.