Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-03-2007, 14:10   #1
fdfdfdddd
 
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!
  Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 15:20   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da gtangari Guarda i messaggi
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!)
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 15:33   #3
fdfdfdddd
 
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;
per poi fare una
Codice:
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!
  Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 15:57   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da gtangari Guarda i messaggi
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;
per poi fare una
Codice:
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).
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 17:53   #5
71104
Bannato
 
L'Avatar di 71104
 
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;
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.
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);
dopodiché, per usarla con WM_COPYDATA:
Codice:
COPYDATASTRUCT cds;
cds.cbData = testSize;
cds.lpData = pTest;
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 19:31   #6
xorshadow
Member
 
L'Avatar di xorshadow
 
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));
Oppure utilizzi sempre memcpy
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));
Ovviamente per la copia della stringa puoi tranquillamente utilizzare anche la strncpy.

Ultima modifica di xorshadow : 16-03-2007 alle 19:33.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 22:06   #7
fdfdfdddd
 
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!
  Rispondi citando il messaggio o parte di esso
 Rispondi


Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
BYD ATTO 8, ricarica FLASH dal 10 al 97%...
Ledger e il caso CryptoBilis: furti stim...
Una forza quantistica ha mosso un appara...
MSI Afterburner sblocca i controlli segr...
8,8 milioni di dati anagrafici esposti i...
Teach My Little Sister How To Drive dive...
Qualcomm prevede un nuovo superciclo di ...
RTX Spark arriva su Amazon: 4 portatili ...
Ibride cinesi in Europa: dimezzate o in ...
Samsung Galaxy S27 Ultra, nuove indiscre...
Data center, in Italia investimenti pote...
Mini PC per AI locale: GMKtec EVO-X2 con...
WhatsApp introduce i messaggi programmat...
Le auto a benzina scendono sotto il 50% ...
Nuovi sconti della settimana Amazon, 3 n...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:47.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v