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.

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
Blallo
Packager
Packager
 
Messaggi: 3215
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 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
Mercyful
Linux 2.0
Linux 2.0
 
Messaggi: 196
Iscritto il: ven lug 25, 2008 17:20
Località: Torino
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6

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: 3215
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 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
Blallo
Packager
Packager
 
Messaggi: 3215
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 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
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 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
Blallo
Packager
Packager
 
Messaggi: 3215
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 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
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 [RISOLTO]

Messaggioda Blallo » gio gen 07, 2010 17:26

esattamente
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3215
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 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!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

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!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3215
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

Precedente

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite