[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Problema con C



>>>>> "L" == Leo  <leo@madnet.it> writes:

    L> Ciao a tutti,
    L> 
    L> ho un problemino forse non molto inerente alla ml, ma non so a
    L> chi altro chiedere...  Devo passare ad una funzione ( C
    L> ovviamente ) una struttura che contiene un puntatore ad intero
    L> tipo: typedef struct info{ int *valore; ...  } valore; la
    L> struttura la passo con un puntatore info* in modo da rendere
    L> permanenti le modifiche dei suoi campi. Il problema è questo:
    L> come modifico il valore del campo "valore" ?

>>>>> "CN" == Carlo Nervi <nervi@chpc06.ch.unito.it> writes:

    CN> /* Io ho sempre usato: */ struct info{ int *valore; ...  };
    CN> typedef struct info INFO;

    CN> /* e poi */ ...  void funzione(INFO *m) { m->valore = (int)
    CN> (3.4); /* oppure */
    m-> valore = 6;
    CN> ...  } ...

    CN> spero di ricordarmi bene... e' un po' che non uso il C! ;-)

    CN> Ciao, Carlo

Sebbene l'esempio di Carlo "probabilmente" funzioni (minus svariati
warnings del compilatore), non è corretto: il campo "valore" della
struttura dichiarata è un puntatore ad intero; in molte
implementazioni C un puntatore a qualchecosa è fisicamente la stessa
cosa di un valore "int", da cui il fatto che sia possibile fare delle
assegnazioni tra questi due tipi di dato.

La maniera corretta di usare quella struttura sarebbe quindi

void
inizializza (INFO *m)
{
  m->valore = malloc (sizeof (*(m->valore)));
}

void
distruggi (INFO *m)
{
  free (m->valore);
}

void
setta_a (INFO *m, int val)
{
  *(m->valore) = val;
}

int
valore (INFO *m)
{
  return *(m->valore);
}

main()
{
  INFO m;

  inizializza (&m);
  setta_a (&m, 1234);
  printf ("%d\n", valore (&m));
  distruggi (&m);
}

Qui l'ho fatta lunga mostrando anche la necessaria inizializzazione di 
"valore": essendo un puntatore, prima di poter assegnare un valore al
suo contenuto occorre "puntare" (scusa il gioco) correttamente il
puntatore stesso. In questo caso, "valore" è il puntatore, mentre
"*valore" è il suo contenuto. Dal momento che si trova dentro una
struttura, di cui abbiamo un puntatore, hai due modi di accedervi:
(*ptrInfo).valore o più sinteticamente ptrInfo->valore, che una volta
dereferenziati per ottenere il numero intero hai *((*ptrInfo).valore)
oppure *(ptrInfo->valore).

Peraltro non hai spiegato la necessità di usare un puntatore dentro la 
struttura... 

    L> Io proprio non
    L> riesco, sono riuscito solo a scoprire tanti nuovi errori di
    L> casting del gcc... :((

Bhè questa francamente mi sembra un tantino grossa :-)

    L> Grazie tante, scusate l'ot.  Leonardo

Di niente, spero di aver chiarito un tantino,
ciao, lele.
-- 
nickname: Lele Gaifax	| Quando vivro' di quello che ho pensato ieri
real: Emanuele Gaifas	| comincero' ad aver paura di chi mi copia.
email: lele@seldati.it	|		-- Fortunato Depero, 1929.


Reply to: