Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[c] puntatori a void [RISOLTO]

Messaggioda Blallo » mer gen 06, 2010 19:11

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 gen 07, 2010 13:18, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [c] puntatori a void

Messaggioda ulisse89 » mer gen 06, 2010 20:27

Cosa vuol dire che pTR è un **void? Void non si usa per indicare funzioni che non hanno valore di ritorno?
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [c] puntatori a void

Messaggioda Blallo » mer gen 06, 2010 20:32

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [c] puntatori a void

Messaggioda ulisse89 » mer gen 06, 2010 20:43

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
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [c] puntatori a void

Messaggioda Blallo » mer gen 06, 2010 20:52

si
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [c] puntatori a void

Messaggioda Vito » mer gen 06, 2010 21:59

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [c] puntatori a void

Messaggioda shark1500 » mer gen 06, 2010 22:06

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
shark1500
Linux 2.6
Linux 2.6
 
Messaggi: 785
Iscritto il: gio apr 03, 2008 13:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: [c] puntatori a void

Messaggioda Vito » mer gen 06, 2010 22:49

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [c] puntatori a void

Messaggioda phobos3576 » mer gen 06, 2010 22:51

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [c] puntatori a void

Messaggioda Vito » mer gen 06, 2010 22:54

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [c] puntatori a void

Messaggioda phobos3576 » mer gen 06, 2010 22:57

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [c] puntatori a void

Messaggioda Vito » mer gen 06, 2010 23:18

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [c] puntatori a void

Messaggioda kreen » gio gen 07, 2010 8:16

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
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE

Re: [c] puntatori a void

Messaggioda Vito » gio gen 07, 2010 10:58

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
Vito
Staff
Staff
 
Messaggi: 4122
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg
Nome Cognome: Vito
Slackware: 64 14.0 multilib
Kernel: 3.2.29-xps
Desktop: KDE 4.10.2
Distribuzione: Linux Mint 17

Re: [c] puntatori a void

Messaggioda kreen » gio gen 07, 2010 11:14

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.
Avatar utente
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite