[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: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggioda Blallo » gio gen 07, 2010 11:54

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!
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!

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

Re: [c] puntatori a void

Messaggioda Mercyful » gio gen 07, 2010 12:13

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: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggioda Blallo » gio gen 07, 2010 12:29

ooops chiedo scusa
correggo subito
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!

Avatar utente
Blallo
Packager
Packager
Messaggi: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggioda Blallo » gio gen 07, 2010 12:31

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!

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

Re: [c] puntatori a void

Messaggioda shark1500 » gio gen 07, 2010 12:43

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: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggioda Blallo » gio gen 07, 2010 13:18

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 :)
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!

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

Re: [c] puntatori a void

Messaggioda shark1500 » gio gen 07, 2010 17:20

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: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void [RISOLTO]

Messaggioda Blallo » gio gen 07, 2010 17:26

esattamente
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 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

Messaggioda Mario Vanoni » gio gen 07, 2010 17:41

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: 3258
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [c] puntatori a void

Messaggioda Blallo » gio gen 07, 2010 17:52

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti