Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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.
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX 341QPXW14G è un monitor ultrawide da 34 pollici che porta la tecnologia QD-OLED di quinta generazione in un contesto principalmente orientato alla produttività. La qualità dell'immagine è elevatissima, il formato 21:9 è ideale per il multitasking e la dotazione di porte trasforma il monitor in un vero hub per Mac, PC e dispositivi mobili. Il limite principale è invece il refresh rate di soli 144 Hz, che lo allontana dai giocatori competitivi più esigenti
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


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...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Rivoluzione in arrivo per Xbox su PC: la...
Weekend di offerte Amazon: vano a ruba l...
Quanto costerà la serie Galaxy S2...
Blink ai minimi su Amazon: videocamere M...
Fire TV Stick 4K a 27,99€, Echo Dot a 29...
Samsung e Thierry Henry: svelata la nuov...
Schermo OLED e touch: il MacBook sta per...
Addio conversioni: Google Drive e Docs o...
Arriva il portale di Google che smascher...
Gli iPhone 18 Pro non convincono: Apple ...
NVIDIA torna su macOS con un driver non ...
Engwe ha un modello che è il SUV ...
Le migliori offerte del weekend Amazon: ...
Cina e UE, intesa sulle auto ibride: Pec...
2 lavatrici slim COMFEE’ a 255€ o 280€ s...
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: 00:19.


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