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

Re: [c] puntatori a void

Messaggio da Blallo »

wow quante risposte :D
comunque eco un esempio di codice

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#define N 5

typedef struct obj_s
{
	int pappa;
	char *mamma;
}obj;

void free_with_void(void **eraser, int N);
void free_all(obj **struttura, int **monello, int N);

int main()
{
	obj **struttura;
	int **monello, i;
	void **eraser;

	struttura=(obj **)malloc(sizeof(obj *)*N);
	for(i=0;i<N;i++)
		struttura[i]=(obj *)malloc(sizeof(obj)*N);
	monello=(int **)malloc(sizeof(int *)*N);
	for(i=0;i<N;i++)
		monello[i]=(int *)malloc(sizeof(int)*N);

	free_all(struttura, monello, N);
	eraser=struttura;
	free_with_void(eraser, N);
	eraser=monello;
	free_with_void(eraser, N);
	return EXIT_SUCCESS;
}

void free_with_void(void **eraser, int N)
{
	int i;

	for(i=0;i<N;i++)
		free(eraser[i]);
	free(eraser);
}

void free_all(obj **struttura, int **monello, int N)
{
	int i;

	for(i=0;i<N;i++)
	{
		free(struttura[i]);
		free(monello[i]);
	}
	free(struttura);
	free(monello);
}
io vorrei evitare la free_all (anche se elegante) per usare la free_with_void, per capire i puntatori a void (che sono molto utili con ADT di tipo 1)
PS e OT alla linea 11 e 12 mi da questo errore

Codice: Seleziona tutto

error: expected ';', ',' or ')' before numeric constant
che non capisco cosa sia!

Avatar utente
Mercyful
Linux 1.x
Linux 1.x
Messaggi: 196
Iscritto il: ven 25 lug 2008, 18:20
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6
Località: Torino

Re: [c] puntatori a void

Messaggio da Mercyful »

L'errore è dato dal fatto che stai usando N come variabile nei prototipi delle funzioni ed N è già stata definita come define!

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 »

ooops chiedo scusa
correggo subito

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 »

mi da comunque, alla 28 e alla 30

Codice: Seleziona tutto

warning: assignment from incompatible pointer type|
cioè dove do
eraser=struttura e anche eraser=monello

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 »

Innanzitutto per togliere quel warning devi usare questo codice:

Codice: Seleziona tutto

        eraser=(void **)struttura;
        free_with_void(eraser, N);
        eraser=(void **)monello;
        free_with_void(eraser, N);
Quindi fai un cast a void (essendo eraser un void), poi c'e` un altro problema (molto peggio).
Tu prima chiami `free_all` che fa le free delle strutture, e poi chiami `free_with_void` che prova a fare una free di puntatori che ora non esistono piu`, quindi il programma compila ma va in segmentation faul (o altra robaccia brutta).

Se tu invece commenti una delle due (o la `free_all` o la `free_with_void`) allora dopo funziona tutto

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 questo lo so
era solo per far vedere che comunque si può usare una soluzione alternativa (secondo me pure più elegante)
UPDATE: perfetto, non da più warning metto risolto
grazie mille a tutti :)

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 »

jimmy_page_89 ha scritto:UPDATE: perfetto, non da più warning metto risolto
Quindi hai risolto con un semplice cast

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 [RISOLTO]

Messaggio da Blallo »

esattamente

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [c] puntatori a void

Messaggio da Mario Vanoni »

shark1500 ha scritto:
jimmy_page_89 ha scritto:UPDATE: perfetto, non da più warning metto risolto
Quindi hai risolto con un semplice cast
Permettete un po` di history dei tempi di AT&T UNIX SVR2/3.
Non si usava un printf(3) senza controllare il suo return,
se non interessava, sempre un cast (void) printf.
Il vecchio lint(1) e/o cc(1) reclamavano altrimenti.
I programmi erano piu` leggibili perche`
(void) printf segnalava che il programmatore
non dava importanza alla sua return value!

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 »

Mario Vanoni ha scritto:
shark1500 ha scritto:Quindi hai risolto con un semplice cast
Permettete un po` di history dei tempi di AT&T UNIX SVR2/3.
Non si usava un printf(3) senza controllare il suo return,
se non interessava, sempre un cast (void) printf.
Il vecchio lint(1) e/o cc(1) reclamavano altrimenti.
I programmi erano piu` leggibili perche`
(void) printf segnalava che il programmatore
non dava importanza alla sua return value!
mi sembra decisamente una buona abitudine
peccato che ai corsi di programmazione non dicano tali curiosità
grazie mille

Rispondi