[c] puntatori a void [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

[c] puntatori a void [RISOLTO]

Messaggio da Blallo »

sto ripassando un po' i puntatori e mi servirebbe una delucidazione
dato questo

Codice: Seleziona tutto

    pTR=el;
    free_all(pTR, n_city);
    pTR=matr;
    free_all(pTR, n_city);
che come avrete forse già capito el e matr sono 2 puntatori (precisamente puntatori a puntatori) che essendo di tipo diverso ma di stessa "categoria", vorrei liberare con la free_all senza doverla scrivere 2 volte (perchè mi scoccia :p )
pTR è un **void
ora volendo potrei pure modificare leggermente la free_all in modo da fare free di entrambe le memorie dei puntatori matr e el, ma dato che volevo capire meglio il funzionamento dei puntatori a void, mi chiedevo se quello fatto li fosse in qualche modo corretto, perchè mi dà dei warning
Ultima modifica di Blallo il gio 7 gen 2010, 13:18, modificato 1 volta in totale.

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [c] puntatori a void

Messaggio da ulisse89 »

Cosa vuol dire che pTR è un **void? Void non si usa per indicare funzioni che non hanno valore di ritorno?

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggio da Blallo »

si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [c] puntatori a void

Messaggio da ulisse89 »

jimmy_page_89 ha scritto:si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento
Ti da il warning per l'assegnamento che fai? (pTR=el e pTR=matr).

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggio da Blallo »

si

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: [c] puntatori a void

Messaggio da Vito »

Che tipo di warning ti restituisce?
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: [c] puntatori a void

Messaggio da shark1500 »

Scusa, ma non devi fare un cast a void prima?

Prova a fare un programmino piu` semplice che riproduca lo stesso errore e copialo qua per intero, cosi` e` difficile da capire il problema

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: [c] puntatori a void

Messaggio da Vito »

C'è bisogno del casting a void,ho fatto delle semplici prove.
Il compilatore dealloca l'area di memoria,ma si dovrebbe creare un memory leak dovuto al fatto che non sa quanta memoria deallocare (poichè non fai il casting al tipo dei due puntatori.).

in codice(non ricordo la sintassi del C,quindi scrivo in C++):

Codice: Seleziona tutto

	int* a=new int;
	*a=2;
	void* b=a;
	a=0;
	delete  (int*)b;
la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [c] puntatori a void

Messaggio da phobos3576 »

shark1500 ha scritto:Scusa, ma non devi fare un cast a void prima?
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: [c] puntatori a void

Messaggio da Vito »

phobos3576 ha scritto:
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Il casting non dovrebbe essere riferito al tipo di el e matr?
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [c] puntatori a void

Messaggio da phobos3576 »

Vito ha scritto:
phobos3576 ha scritto:
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Il casting non dovrebbe essere riferito al tipo di el e matr?
Si, Infatti, jimmy_page_89 dice che el e matr sono entrambi puntatori a puntatori.

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: [c] puntatori a void

Messaggio da Vito »

Comunque concordo sul fatto che magari qualche riga di codice in più renderebbe più chiara la risoluzione del warning...

Io ho trovato qualcosa qui: http://it.wikipedia.org/wiki/Malloc (siccome programmo in C++ ed in C ho usato pochissimo l'allocazione dimanica della memoria).
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: [c] puntatori a void

Messaggio da kreen »

Vito ha scritto: la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.

Il casting non c'entra assolutamente nulla.

Avatar utente
Vito
Staff
Staff
Messaggi: 4182
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: [c] puntatori a void

Messaggio da Vito »

kreen ha scritto:
Vito ha scritto: la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.

Il casting non c'entra assolutamente nulla.
Sisi,rileggendo un po' di cose su malloc e free mi sono reso conto di aver detto una cosa non giusta,grazie per la dritta. :thumbright:

P.S. Ma ti riferivi alla free?
Perchè con la delete ho bisogno di fare il casting..(ho puntatore a void con il quale alloco un vettore di interi,quando voglio liberare la memoria se non faccio il casting mi restituisce un warning).
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: [c] puntatori a void

Messaggio da kreen »

Sì Vito,
mi riferivo alla free.
La free è legata a malloc, dove dichiari il numero di byte che ti servono e ti restituisce un puntatore void verso la memoria allocata (perciò per usarlo devi fare un cast).

La new del C++ funziona in maniera diversa, come tu sai. Ad esempio

Codice: Seleziona tutto

int *c = new int;
perciò non c'e' bisogno di usare cast.

Rispondi