PDA

Visualizza la versione completa : [C] Passaggio di un vettore di tipo struct ad una funzione


ilmo lesto
27-02-2007, 12:28
salve a tutti, vorrei capire questa cosa

come posso passare per riferimento a una funzione un vettore di tipo struct?

da quello che ho capito le strutture vengono tutte passate per valore. se io allora dichiaro un vettore di tipo struct in questo modo



struct Miastruttura vett[size];


e volessi passare questo vettore per riferimento ad una determinata funzione, posso farlo solamente crando un altra struct e passare l'indirizzo della nuova struttura da me creata?

per esempio creo un nuovo tipo di struct




struct Nuovastruttura{
struct Miastruttura vett[size];
} nuovodato;

funzione(&nuovodato);

void funzione (struct Nuovastruttura *newdataPtr){
istruzioni;
return;
}



in questo modo il vettore di strutture verrebbe passato per riferimento anzichè per valore... è corretto quello che dico?

esiste un altro modo per passare un vettore di struct per riferimento?

spero di non aver scritto troppe c***ate ...

andbin
27-02-2007, 12:43
In "C" una struttura può essere passata per valore oppure puoi passare l'indirizzo della struttura.
Un array invece viene sempre passato per indirizzo (indipendentemente dal tipo).

Quindi:

void funzione (struct Miastruttura *p) { ... }

oppure

void funzione (struct Miastruttura p[]) { ... }

(non cambia nulla)

ilmo lesto
27-02-2007, 13:07
ciao andbin, grazie per la risposta...

ho però ancora dei dubbi da risolvere.

poniamo quindi che io dichiari una variabile e un vettore di tipo struct Miastruttura




struct Miastruttura{
int var1;
int var2;
char vett[size];
} pippo, vettStruct[size];


se io passassi la variabile pippo all'interno della funzione accadrebbe che tutte le modifiche apportate ai membri della struttura non andrebbero ad alterare i valori originali dei membri della variabile pippo (visto che si tratta di un passaggio per valore)

nel caso invece io volessi passare alla funzione f1(struct Miastruttura v[]) il vettore vettStruct[size] accadrebbe che tutte le modifiche apportate ai membri della struttura andrebbero a modificare i valori originali... è esatto?

andbin
27-02-2007, 13:23
Originariamente inviato da ilmo lesto

struct Miastruttura{
int var1;
int var2;
char vett[size];
} pippo, vettStruct[size];
pippo è una variabile di tipo struct Miastruttura mentre vettStruct è un array di elementi di tipo struct Miastruttura.

Se vuoi passare pippo ad una funzione puoi fare:


void funzione (struct Miastruttura s) { ... }

funzione (pippo);
(pippo è passato per valore, quello che vai con s non tocca pippo)
oppure

void funzione (struct Miastruttura *ps) { .... }

funzione (&pippo);
(viene passato l'indirizzo di pippo, tramite ps puoi alterare il contenuto della struttura pippo)


Nel caso di vettStruct puoi fare:

void funzione (struct Miastruttura *ps) { .... }

funzione (vettStruct);
(in questo caso viene passato l'indirizzo del primo elemento, con ps puoi alterare il contenuto delle strutture nell'array)

ilmo lesto
27-02-2007, 13:29
per quanto riguardava la variabile pippo mi era già tutto chiaro, ma ora mi hai risolto il quesito sul vettore di tipo struct. mi sono fatto ingannare dal manuale il quale mi diceva che in una funzione le strutture sono passate per valore... quindi supponevo che anche un vettore di tipo struttura fosse passato per valore... e invece non è così...
un vettore rimane pur sempre un vettore, ossia un puntatore... quindi è ovvio che il passaggio avviene per riferimento

grazie mille!
:ciauz:

RIACK
07-12-2010, 00:25
Avete proprio fatto dei bellissimi esempi su come passare un vettore per riferimento.
Ma l'utilizzo?

Io ho scritto questo ma mi da errore quando utilizzo il vettore (righe 4 e 5):
#include<stdio.h>
void funzione (struct Miastruttura vettStruct[])
{
*vettStruct[0].var1=2;
printf("prova %d", *vettStruct[0].var1);
getche();
}
void main()
{
struct Miastruttura
{
int var1;
int var2;
char vett[5];
}vettStruct[10];
funzione(vettStruct);
}

Loading