PDA

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!

andbin
16-03-2007, 15:20
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!

andbin
16-03-2007, 15:57
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).

71104
16-03-2007, 17:53
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!