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.
#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
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
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
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!
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