|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
[C]Ultimi dubbi su funzioni e puntatori
Credo di avere gli ultimi dubbi sull'argomento programmazione in C (per ciò che mi serve), mettere insieme tutto ciò che ho imparato in questi giorni.
Dopo essere riuscito a realizzare lo stesso programma sotto riportato senza l'uso dei puntatori (quindi solo con la chiamata per valore), adesso vorrei appunto realizzarlo con un più efficiente chiamata per riferimento, ma le cose sono un po' più complicate. Ecco una versione incompleta del programma, che immagazzina soltanto i dati richiesti (per renderlo più leggibile ho eliminato la parte che li visualizza, in cui avevo gli stessi dubbi): Codice:
#include <stdio.h>
struct persona {
char nome[25];
char cognome[25];
int eta;
};
typedef struct persona Persona;
void richiediDati (Persona *);
Persona dati[5], *wDati;
int numero;
main()
{
char fine;
printf ("Inserire il numero di dipendenti: ");
scanf ("%d", &numero);
richiediDati(dati);
printf ("Digitare una lettera e premere invio per terminare. ");
scanf ("%s", &fine);
return 0;
}
void richiediDati (Persona *wDati)
{
int i;
wDati = &dati[0];
printf ("Verranno ora richiesti i dati anagrafici relativi a %d dipendenti:\n\n", numero);
for (i = 0; i <= (numero - 1); i++) {
printf ("Inserire nome: ");
scanf ("%s", wDati[i]->nome);
printf ("Inserire cognome: ");
scanf ("%s", wDati[i]->cognome);
printf ("Inserire eta': ");
scanf ("%d", &wDati[i]->eta);
printf ("********************\n\n");
}
}
" base operand of `->' has non-pointer type `persona' " Ecco i miei dubbi: -Le funzioni dipendono da un puntatore a vettore "wDati": all'interno della funzione, ho passato l'indirizzo della variabile di struttura "dati" (che poi è un vettore di strutture) al puntatore. Dove sbaglio? -So che un vettore è un puntatore che punta al suo primo elemento, per questo motivo ho eliminato [i] da ciascun ciclo for ed il programma funziona, ma ovviamente prende solo il primo dato. Perchè? -Il programma funziona anche se sostituisco "->" con il ".", cosa che non mi aspettavo. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Nel ciclo for c'e' [i].
Inoltre quando scrivi wDati[i] hai gia dereferenziato il puntatore wDati quindi deviusare il punto e non l'operatore freccia per accedere al membro della struct. Comunque wDati lo scorri per ogni dipendente senza aver allocato prima memoria, potresti riscontrare dei problemi, accedendo a locazioni di memoria gia utilizzate. |
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Quote:
Quote:
Ultima modifica di Composition86 : 01-09-2008 alle 15:59. |
||
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Cosa centra la chiamata per riferimento?
Quella si fa relativamente al passaggio di parametri per le funzioni. Il punto e la freccia si usano rispettivamente se hai un oggetto o un puntatore all'oggetto. Per quanto riguarda l'array, non creare un puntatore a Persona, ma piuttosto dichiara questo: Persona wDati[20]; In questo caso pero' puoi inserire al massimo i dati di 20 dipendenti, ma almeno le locazioni di memoria sono sicure. Ultima modifica di Noixe : 01-09-2008 alle 16:41. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Voglio fare in modo di passare le funzioni per riferimento, e non per valore, quindi devo utilizzare i puntatori in qualche modo, cosa che sto cercando di capire.
Per questo motivo volevo utilizzare la freccia, in quanto la mia intenzione era di sfruttare i puntatori. Quel puntatore *wDati che ho dichiarato di tipo persona, se non mi sto sbagliando, è del tutto inutile, in quanto non utilizzato nel main: il puntatore *wDati l'ho infatti definito nella funzione. Correggimi se sbaglio. Ti ringrazio per l'aiuto. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
il passaggio per riferimento già lo fai qui:
Codice:
void richiediDati (Persona *wDati)
__________________
Khelidan Ultima modifica di khelidan1980 : 01-09-2008 alle 18:23. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Ok. Ma poi vorrei capire questa cosa: effettivamente poi lavoro con i puntatori nella funzione?
Il dubbio mi viene dal fatto che l'uso del "." è tipico dei dati, quindi la mia impressione è che di fatto introduco i puntatori, ma poi non lavoro con gli indirizzi e quindi non capisco se il programma risulta essere realmente più efficiente. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
__________________
Khelidan |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Ok, allora su questo il problema non c'è, grazie.
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quando tu passi un puntatore ad una funzione, la stai informando del fatto che nella zona di memoria che ha inizio da dove indicato dal puntatore c'è uno o più elementi di uno stesso tipo. In questo modo, le dai la possibilità di modificare direttamente ciò che è contenuto in quella memoria, senza aggirare l'accesso con delle copie. Perciò, se tu le passi il puntatore non devi reimpostarlo appena la funzione inizia, altrimenti ti perdi l'unica informazione interessante per quel codice. Ora, tu stai dicendo a quella funzione che nella locazione di memoria puntata da wDati c'è almeno una struct persona che puoi leggere o scrivere. Quando accedi ad uno degli elementi con la notazione wDati[i] stai già dereferenziando il puntatore in corrispondenza dell'i-esimo elemento di tipo struct persona a partire da quella locazione: dovrai quindi trattare non un puntatore, ma una semplice struttura dati (ai quali campi devi accedere con un punto, non con l'operatore freccia).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Speriamo di no!
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In effetti, ora che ci penso...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:11.




















