Newsgroup: it.comp.lang.c
Titolo: strutture

salve a tutti
nel linguaggio C le strutture vanno passate alle funzioni sempre per valore?
o vi possono essere dei casi di passaggio per indirizzo?
grazie
edoardo


wrote:

beh, io di solito le passo per indirizzo...
se una funzione richiede una struttura per valutarne il contenuto e
dare un risultato... mi sembra superfluo passarla per valore, sarebbe
un sovraccarico inutile.
... cmq ... solo per curiosità ... per valore intendi per copia ?
int yourfunction(struct yourstruct )
oppure per reference ( struct yourstruct &)
???
perché altrimenti non ci capiremo ....
cod

 cod
Ma in C non sono accettati solo il passaggio per valore e per indirizzo?
Il passaggio per riferimento è solo in C++.
Cecco

Cecco
boh, io ho usato il c++ ...
e il c l'ho utilizzato con compilatori c++ ...
quindi con tutti i vantaggi che ne derivano...
cod

 quindi con tutti i vantaggi che ne derivano...
Ma qui dentro si parla di C, non di C++.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 o vi possono essere dei casi di passaggio per indirizzo?
Entrambi.
Di solito si passano per valore quando sono piccole.
Per indirizzo quando sono piu' ingombranti.



Passare una struttura (o comunque qualunque altro tipo di variabile
predefinita) per valore significa che la funzione, al momento della sua
chiamata nel codice, crea una copia della struttura (o della variabile);
questo metodo viene usato se la funzione non deve modificare i campi
della struttura e se questa non è troppo ingombrante. Se invece viene
passata per indirizzo, la funzione utilizzerà direttamente la stuttura
(o la variabile) senza copiarne i valori, per cui, se la funzione
manipola qualche campo, le modifiche influiranno direttamente su di
essa; presenta il vantaggio di non dover fare una copia al momento della
chiamata, ma è più pericolosa.
Ciao,
Cecco

 chiamata, ma è più pericolosa.
Non necessariamente.
E' possibile che la funzione accetti un puntatore a una struttura
costante e quindi sia impossibilitata a compiere delle modifiche.
Bisognerebbe sempre passare come costanti, quei dati che non devono
essere modificati dalle funzioni (anche nella copia per valore).
Esempio:
struct MiaStruttura { int a, b, c; };
void MiaFunzione(const struct TMiaStruttura* p)
{
     p->a = 5;  /* C++ Builder, in modalita' C, si lamenta con un bel
                   E2024: Cannot modify a const object */
}
int main()
{
    struct TMiaStruttura A = {1, 2, 3};
    MiaFunzione(&A);
 
    return 0;


 ha scritto nel messaggio
news:3kinstktp6tn86clh...@4ax.com...

per valore ... si che passa una copia della struttura su cui la funzione
lavora .

Il passaggio per riferimento è solo in C++.
copia        <== sinonimo ==>  valore
riferimento  <== sinonimo ==>  indirizzo
Dal pascal, sino al C e da li al Java (argh) io ho sempre usato
indistintamente questi termini come sinonimi (ovviamente copia con
valore e rif. con ind.)
Se in C++ esiste invece un terzo modo mi scuso con i programmatori C++
:)
Se invece vi riferite al fatto che passando 1 oggetto passo solo un
riferimento ad esso e non l'oggetto stesso e che questo e'
automatico... beh, dai, e' solo un passaggio per indirizzo mascherato
dal linguaggio che prende il programmatore per imbecille (con tutto il
rispetto per il programmatore ovviamente) e pensa che non sia in grado
di passare un parametro senza fare danni inimmaginabili :P
Mox.

riferimento  <== sinonimo ==>  indirizzo
Attenzione, copia per indirizzo non e' sinonimo di copia per
riferimento in C.  
In C non esiste la copia per riferimento, si simula,
comunque, con una copia per valore (si passa un puntatore,
ma e' pur sempre un puntatore passato per valore).  
In C++, invece, esiste il *vero* passaggio per riferimento
(mediante l'operatore reference &).
Il passaggio per riferimento offre un grado in piu' di
sicurezza.  Per esempio, se si avesse la funzione:
void modifica(int *p)
{
     *p = 3;
}
In C si potrebbe passare anche il valore NULL al puntatore,
con conseguenze disastrose, cosa che in C++ con :
vodi modifica(int& i)
{
     i = 3;
}
viene impedita dai controlli del compilatore stesso.
-- 
The Follet

viene impedita dai controlli del compilatore stesso.
Questo controllo in piu' mi era sfuggito leggendo lo Stroustrup (siamo
al filo dell'OT pero' :P ).
Mox

al filo dell'OT pero' :P ).
Stiamo pur sempre parlando di C, anche se confrontato ad
altri linguaggi.
-- 
The Follet

 }
cioe' con i reference *l'indirizzo* passato non e' modificabile.
ciao
donCiccio

 cio' che la funzione riceve nello stack e' l'indirizzo della variabile,
Quello che interessa maggiormente e' il vincolo offerto dal
compilatore.


 ha scritto nel messaggio
news:3kinstktp6tn86clh...@4ax.com...

Per indirizzo non intendo un puntatore alla struttura ma "se ha senso"
l'indirizzo della struttura, ossia la struttura trattata alla stregua di una
variabile.