Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

array di struttura

0 views
Skip to first unread message

Larry

unread,
Dec 20, 2009, 7:41:10 AM12/20/09
to
Salve,

mi sono imbattuto in questa linea di codice per me incomprensibile e
volevo sapere se per caso rendeva una variabile un array di una struttura
gi� predefinita:

sb = (WAVEHDR**) malloc(sizeof(WAVEHDR**) * system_buf_num);

Message has been deleted

Larry

unread,
Dec 20, 2009, 5:45:19 PM12/20/09
to

"Tetsuya" <i...@noi.com> ha scritto nel messaggio
news:4b2e2b2a$0$1107$4faf...@reader4.news.tin.it...

> Qui stai mallocando un puntatore a puntatore a WAVEHDR (che presumo sia
> una struttura relativa all'header di un wav). Vista cos� potrebbe essere
> usata ad esempio come "array" (perdonatemi) dinamico di puntatori a questa
> struttura. E quanti ne stai allocando? system_buf_num.
> Avrai sb[i] (con i che va da 0 a system_buf_num-1) e ogni elemento
> dell'array � un puntatore a WAVEHDR.

Ti ringrazio. Nella struttura WAVEHDR ho un campo "lpdata" di tipo LPSTR.

trovo di difficile comprensione questa riga:

sb[i]->lpData = (LPBYTE) malloc(system_buf_len);

perch� viene usato il (LPBYTE) ??

grazie

Message has been deleted

Andrea Laforgia

unread,
Dec 21, 2009, 8:40:12 AM12/21/09
to
On 20 Dic, 13:41, "Larry" <dontmewit...@got.it> wrote:

> sb = (WAVEHDR**) malloc(sizeof(WAVEHDR**) * system_buf_num);

A rigor di logica, questa istruzione non è valida, nel senso che
dovrebbe essere sizeof(WAVEHDR*) - un solo asterisco.
Nei fatti funziona solo perché le dimensioni dei puntatori sono
evidentemente uguali, a prescindere dal tipo puntato.

Giacomo

unread,
Dec 22, 2009, 7:25:05 AM12/22/09
to

Puoi spiegare meglio il tuo punto di vista?
Il tuo appunto l'avrei trovato sensato nel caso contrario, ovvero
avendo:

T ** x = (T**) malloc(sizeof(T*) * k);

avrei fatto notare come l'istruzione funzioni solo perché sizeof(T*)
== sizeof(T**), ma non ci trovo niente di sbagliato/invalido
nell'usare malloc nella forma

T x = (T)malloc(sizeof(T)*k)

per ogni T (magari eccetto 'char' dove sizeof() lo considererei
ridondantemente errato)

GM

unread,
Dec 22, 2009, 7:37:14 AM12/22/09
to
Il 22/12/2009 13.25, Giacomo ha scritto:

> T x = (T)malloc(sizeof(T)*k)

malloc ritorna T* non T

Andrea Laforgia

unread,
Dec 22, 2009, 8:18:44 AM12/22/09
to
On 22 Dic, 13:25, Giacomo <giacomo.gali...@gmail.com> wrote:

> Puoi spiegare meglio il tuo punto di vista?

Non è un punto di vista. E' una constatazione.

Se hai:

T* p;

L'allocazione corretta per 10 T è:

p = ( T* ) malloc( sizeof( T ) * 10 );

Perché tu allochi memoria per 10 T, quindi devi considerare la
grandezza del valore puntato, non per dieci puntatori a T.
Se hai T con sizeof(T) > sizeof(T*), infatti, quell'istruzione può
essere molto pericolosa.

Larry

unread,
Dec 22, 2009, 7:55:23 PM12/22/09
to

"Tetsuya" <i...@noi.com> ha scritto nel messaggio
news:4b2eb1b8$0$1117$4faf...@reader1.news.tin.it...

> Probabilmente sia LPSTR (che la butto sempre l�, mi sembra una dicitura
> windows-like per puntatore a stringa) che LPBYTE (puntatore a byte?)
> saranno puntatori a char, quindi punteranno allo stesso tipo, il
> compilatore non si incazza pi� di tanto, e dovrebbe funzionare
> ugualmente...ma la sto buttando l� eh.

Perfetto. Stavo cercando di costruire un sistema di buffers da passare poi a
funzioni waveIn. Questo � il codice:

#define system_buf_len 4096
int i=0;
int num_buff = 5;
WAVEHDR *buffer = (WAVEHDR *) malloc(sizeof(WAVEHDR)*num_buff);
for (i=0; i<num_buff; i++)
{
buffer[i].lpData = (char *) malloc(system_buf_len);
buffer[i].dwBufferLength = system_buf_len;
buffer[i].dwFlags = 0;

waveInPrepareHeader(phvi, &buffer[i], sizeof(WAVEHDR));
waveInAddBuffer(phvi, &buffer[i], sizeof(WAVEHDR));
}

credi che sia corretto un'approccio del genere?

grazie

0 new messages