PDA

View Full Version : Passaggi di strutture e membri di strutture a funzioni in C!


DavidTwister
14-01-2004, 11:41
Allora ragazzi,stò preparando l'esame di Programmazione in C....leggo sul libro:
"Le strutture possono essere passate alle funzioni fornendo:
1) i singoli membri;
2)l'intera struttura;
3)un puntatore alla stessa struttura".
Nel caso si passi una struttura o i suoi singoli membri,questi verranno passati per valore; al fine di passarli x riferimento, dovrete passare alla funzione l'indirizzo della variabile di struttura.


Le domande sono:

1)se voglio passare alla funzione, ad esempio, un membro di una variabile di tipo struttura per RIFERIMENTO, qual'è il modo corretto???
2)Mi fate un esempio in linguaggio C di una funzione che riceve come argomento una struttura intera1 e un membro di una struttura2 prima per riferimento, e poi della stessa funzione che le riceve per valore?

Grazie!;)

cionci
14-01-2004, 12:01
Scrivendomi un PVT hai solatanto aumentato al tua attesa...ti stavo rispondendo quando mi è arrivato il dialogo di apertura dei messaggi privati ;) E' inutile mandarmi i PVT...i emssaggi della sezione me li leggo tutti :)


struct s {
int a;
char b;
};

void f_valore_struttura(struct s st)
{
printf("%d %c\n", st.a, st.b);
}

void f_riferimento_struttura(struct s *pst)
{
printf("%d %c\n", pst->a, pst->b);
}

void f_valore_membri(int ma, char mb)
{
printf("%d %c\n", ma, mb);
}

void f_riferimento_membri(int *pma, char *pmb)
{
printf("%d %c\n", *pma, *pmb);
}

int main()
{
struct s pippo;
pippo.a = 10;
pippo.b = 'a';

f_valore_struttura(pippo);
f_riferimento_struttura(&pippo);
f_valore_membri(pippo.a, pippo.b);
f_riferimento_membri(&pippo.a, &pippo.b);

return 0;
}

Sinceramente preferisco chiamare quello che tu chiami "per riferimento" passaggio "per indirizzo"...
Se poi un giorno vedrai il C++ (o una versione aggiornata del C allo standard C99) capirai il perchè...

DavidTwister
14-01-2004, 12:05
ti ringrazio x gli esempi...ora me li leggo per bene e se ho qualche dubbio lo posto sul 3d...scusa se ti ho mandato un pvt ma il primo appello lo avrei domani...ecco il perchè della fretta!!!:D

cionci
14-01-2004, 12:13
Voi avete fatto così quello che chiamate "passaggio per riferimento" ?

DavidTwister
14-01-2004, 12:17
Originariamente inviato da cionci
Voi avete fatto così quello che chiamate "passaggio per riferimento" ?

durante il corso nn sò come abbiano fatto,perchè per motivi di lavoro non l'ho potuto seguire...ora controllo meglio sui miei due libri...però non è che sia spiegato un gran ch+ l'uso delle strutture con le funzioni su questi libri...:(

ps: perchè c'è un altro metodo per passarle "per riferimento"?:confused:

cionci
14-01-2004, 12:19
Originariamente inviato da DavidTwister
ps: perchè c'è un altro metodo per passarle "per riferimento"?:confused:
Se il libro trattasse l'utlimo standard del C (1999) mi sembra di sì...

DavidTwister
14-01-2004, 12:27
Originariamente inviato da cionci
Se il libro trattasse l'utlimo standard del C (1999) mi sembra di sì...

su entrambe i libri c'è scritto che è stato usato lo standard ANSI/C : 1990....:(

cmq qual'è il nuovo metodo introdotto???:confused:

cionci
14-01-2004, 14:27
Vabbè...non ti interessa... Ti servirà quando e se farai il C++ ;)
Comunque si chiama passaggio per riferimento...

void f(int &i)
{
i = 0;
}

int a = 10;
f(a);
//a questo punto i è uguale a 0...

Comqunue non sono sicuro che sia stato inserito nello standard del C99... Sinceramente non me lo ricordo...se qualcuno ne sa di più che lo dica ;)

DavidTwister
14-01-2004, 20:47
Originariamente inviato da cionci
Vabbè...non ti interessa... Ti servirà quando e se farai il C++ ;)
Comunque si chiama passaggio per riferimento...

void f(int &i)
{
i = 0;
}

int a = 10;
f(a);
//a questo punto i è uguale a 0...

Comqunue non sono sicuro che sia stato inserito nello standard del C99... Sinceramente non me lo ricordo...se qualcuno ne sa di più che lo dica ;)

veramente strano come uso....cmq nello standard ANSI C che stiamo studiano questo modo non c'è proprio...:(

cionci
14-01-2004, 20:49
In pratica i è un alias di a... A fine del codice assembly generato è la stessa cosa del passaggio per indirizzo ;)

VegetaSSJ5
15-01-2004, 18:27
Originariamente inviato da cionci
Vabbè...non ti interessa... Ti servirà quando e se farai il C++ ;)
Comunque si chiama passaggio per riferimento...

void f(int &i)
{
i = 0;
}

int a = 10;
f(a);
//a questo punto i è uguale a 0...

Comqunue non sono sicuro che sia stato inserito nello standard del C99... Sinceramente non me lo ricordo...se qualcuno ne sa di più che lo dica ;)
cionci scusa ma nel parametro della funzione f perchè dichiari int &i?? non dovresti dischiarare int *i per dire che si tratta di un puntatore??

void f(int *i)
{
*i = 0;
}
??

cionci
16-01-2004, 01:58
E' il passaggio per riferimento del C++ ;)

VegetaSSJ5
16-01-2004, 12:08
ops scusa non lo sapevo! non conosco il c++! visto che nel titolo del thread si parlava di c pensavo che tu avessi voluto scrivere il codice in c...;)

DavidTwister
16-01-2004, 12:10
Originariamente inviato da VegetaSSJ5
ops scusa non lo sapevo! non conosco il c++! visto che nel titolo del thread si parlava di c pensavo che tu avessi voluto scrivere il codice in c...;)
da quanto ho capito, quel passaggio di riferimento è in C(l'ultimo standard ANSI), ma dovrebbe essere originario del C++...cionci, è cosi?

ilsensine
16-01-2004, 12:16
A me risulta che in c l'unico passaggio per riferimento possibile è utilizzare i puntatori...
(in effetti il c++ implementa internamente il passaggio per riferimento tramite puntatori)

DavidTwister
16-01-2004, 12:18
Originariamente inviato da ilsensine
A me risulta che in c l'unico passaggio per riferimento possibile è utilizzare i puntatori...
(in effetti il c++ implementa internamente il passaggio per riferimento tramite puntatori)

ah...no perchè sembra con lo standard ANSI C del 99 (non è sicuro dell'anno), si possa effettuare anche nel modo descritto....chi sappia qualcosa di + si faccia vivo!:D

cionci
16-01-2004, 14:24
Non sono sicuro che ci sia...mi sembrava che fosse stato introdotto nel C99... Purtroppo non ho ancora visto il C99 :boh:

Sicuramente ilsensine ne sa di più...

ilsensine
16-01-2004, 14:25
Il gcc supporta molte cose del C99, ma il reference alla c++ no...
Non so se lo standard lo prevede, io personalmente non he ho mai sentito parlare.

cionci
16-01-2004, 14:27
Probabilmente ho fatto confusione io :cry:

xybercom
16-01-2004, 20:57
Il passaggio per reference non è nel C99 mentre è standard nel C++ da almeno il 1994 (se non da quando hanno inventato il linguaggio).

cionci
16-01-2004, 21:02
Per il C99 mi sono sbagliato... Per il C++ non mi sembra che qualcuno avesse detto che non era nello standard...

xybercom
16-01-2004, 21:13
Oops :D
Non ce l'avevo con te, nè tanto meno il mio interesse era dare "lezioni" :)
Volevo solo rimarcare la differenza tra i linguaggi, di solito io uso esclusivamente il C++, ma proprio recentemente ho dovuto mettere le mani su un programma C per cui mi sono dovuto aggiornare sul mitico K&R, scoprendo che di reference in C o C99 non c'è neanche l'ombra.

VegetaSSJ5
17-01-2004, 12:58
ragazzi scusate ma per passaggio per riferimento intendete il passaggio per indirizzo? se mi sbaglio potete illuminermi? grazie!;)

xybercom
17-01-2004, 15:11
Non è la stessa cosa, ti consiglio di leggerti http://www.icce.rug.nl/documents/cplusplus/cplusplus03.html#l37 se ne vuoi sapere di più.

VegetaSSJ5
17-01-2004, 16:14
xybercom però tu mi hai passato l'indirizzo! ;) ;) :D :D :D :sofico: :mc: