View Full Version : Puntatori e copia di dati.
fdfdfdddd
16-03-2007, 14:10
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!
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 :-)Allora ti conviene usare una struttura! Dichiara la struttura, poi un puntatore alla struttura a cui assegni il risultato di malloc (e ovviamente alloca la dimensione giusta della struttura!)
fdfdfdddd
16-03-2007, 15:33
Eh, in realtà ho da passare dei dati con una SendMessage ... pensavo proprio ad una struttura
typedef struct {
int a;
int b;
int c;
char * p;
} TEST, *PTEST;
per poi fare una
SendMessage(finestra, WM_COPYDATA, sizeof(TEST), (LPARAM)(PCOPYDATASTRUCT)&test)
se "test" è una variabili di tipo "TEST".
Sfortunatamente in questa maniera mi perdo il puntatore alla stringa!
Eh, in realtà ho da passare dei dati con una SendMessage ... pensavo proprio ad una struttura
typedef struct {
int a;
int b;
int c;
char * p;
} TEST, *PTEST;
per poi fare una
SendMessage(finestra, WM_COPYDATA, sizeof(TEST), (LPARAM)(PCOPYDATASTRUCT)&test)Alt!!!
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).
per risolvere questo tipo di problema Win32 usa spesso la convenzione dell'ANYSIZE_ARRAY, una macro definita a 1.
typedef struct {
int a;
int b;
int c;
char p[ANYSIZE_ARRAY];
} TEST, *PTEST;
di fatto una qualsiasi istanza di TEST dichiarata normalmente conterrà solamente un char alla fine, ma se tu allochi lo spazio con malloc ovviamente ne hai quanti ne vuoi.
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);
dopodiché, per usarla con WM_COPYDATA:
COPYDATASTRUCT cds;
cds.cbData = testSize;
cds.lpData = pTest;
xorshadow
16-03-2007, 19:31
Potresti fare un casting prima della copia degli interi
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));
Oppure utilizzi sempre memcpy
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));
Ovviamente per la copia della stringa puoi tranquillamente utilizzare anche la strncpy.
fdfdfdddd
16-03-2007, 22:06
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!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.