PDA

View Full Version : Typedef Struct e Puntatori [C#]


BigMeister
21-12-2013, 14:17
Salve a tutti ragazzi, avrei bisogno di un chiarimento sull'utilizzo dei puntatori in C# sulle Typedef Struct.

Questa è la Typedef:

typedef struct{

char prop,
ris,
opprop[10],
tabella[16];

} struct_t;

void f_lettura( struct_t *p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int );

Come posso puntarla all'interno del Main?Ci sto provando in tutti i modi ma non riesco, l'ultimo tentativo è stato questo:

int main (){
.............
.............
struct_t lettura;
struct_t *p;
p = &lettura;
.............
.............
f_lettura( *p, lettura_1, lettura_2, lettura_3 , np);
.............
.............
}

void f_lettura( struct_t *p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int np ){
.....................................
.....................................
.....................................
}

Ma non funziona, l'errore relativo è:

error: incompatible type for argument 1 of ‘f_lettura’
note: expected ‘struct struct_t *’ but argument is of type ‘struct_t’

Attendo vostri chiarimenti perchè non so più dove battere la testa, grazie a tutti. :muro:

lorenzo001
21-12-2013, 14:32
f_lettura( p,


P.S. Parli di C++ non di C#

BigMeister
21-12-2013, 14:41
Grazie mille della risposta, ora riconosce propriamente l'indirizzo solo che, ovviamente, ora all'interno della funzione f_lettura mi dà l'errore:

error: invalid type argument of ‘->’ (have ‘struct_t’)

Che è chiaramente riferito al modo in cui cerco di accedere ai campi della Typedef. Qual'è la giusta scrittura?Attualmente quella che provoca l'errore è ad esempio:

p->prop;

Come va cambiata?

EDIT:

Modificando in:

p.prop

Il risultato è quello sperato. Il problema è che terminata la funzione i valori inseriti con la funzione all'interno dei campi della Typedef è come se non venissero memorizzati ma nuovamente inzializzati da zero. Allora mi chiedo: Per quello che voglio fare io (sperando che venga capito anche da voi) non posso usare una Typedef?Insomma io vorrei questo:

- Dare in input a una funzione una Struttura con dei campi;
- Lavorare sui campi con la funzione.
- Mettere a disposizione al main la "nuova" Struttura elaborata con la Funzione per altre elaborazioni.

vendettaaaaa
21-12-2013, 15:14
Grazie mille della risposta, ora riconosce propriamente l'indirizzo solo che, ovviamente, ora all'interno della funzione f_lettura mi dà l'errore:

error: invalid type argument of ‘->’ (have ‘struct_t’)

Che è chiaramente riferito al modo in cui cerco di accedere ai campi della Typedef. Qual'è la giusta scrittura?Attualmente quella che provoca l'errore è ad esempio:

p->prop;

Come va cambiata?

EDIT:

Modificando in:

p.prop

Il risultato è quello sperato. Il problema è che terminata la funzione i valori inseriti con la funzione all'interno dei campi della Typedef è come se non venissero memorizzati ma nuovamente inzializzati da zero. Allora mi chiedo: Per quello che voglio fare io (sperando che venga capito anche da voi) non posso usare una Typedef?Insomma io vorrei questo:

- Dare in input a una funzione una Struttura con dei campi;
- Lavorare sui campi con la funzione.
- Mettere a disposizione al main la "nuova" Struttura elaborata con la Funzione per altre elaborazioni.
void f_lettura( struct_t& p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int np ){
.....................................
.....................................
.....................................
}
Passa per riferimento (aggiungento & al tipo del dato) gli argomenti che vuoi siano modificati, altrimenti vengono passati per copia (l'argomento è copiato all'interno della funzione, e all'interno della funzione viene modificata la copia). Una reference è praticamente un puntatore automaticamente dereferenziato.

BigMeister
21-12-2013, 15:23
Cioè una cosa di questo tipo?

typedef struct{

char prop,
ris,
opprop[10],
tabella[16];

} struct_t;

void f_lettura( struct_t& p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int );

int main (){
.............
.............
struct_t& p;
.............
.............
f_lettura( p, lettura_1, lettura_2, lettura_3 , np);
.............
.............
}

void f_lettura( struct_t& p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int np ){
.....................................
.....................................
.....................................
}

EDIT:

Questo tipo di scrittura provoca i seguenti errori:

error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
In function ‘main’:
error: expected identifier or ‘(’ before ‘&’ token
warning: implicit declaration of function ‘f_lettura’ [-Wimplicit-function-declaration]
At top level:
error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token

vendettaaaaa
21-12-2013, 15:49
Bastava far la modifica, che ti ho messo in grassetto, alla funzione (quindi anche nella dichiarazione della funzione sopra al main, come giustamente hai fatto). Nel main la variabile devi dichiararla senza ampersand.

BigMeister
21-12-2013, 16:08
Bastava far la modifica, che ti ho messo in grassetto, alla funzione (quindi anche nella dichiarazione della funzione sopra al main, come giustamente hai fatto). Nel main la variabile devi dichiararla senza ampersand.


Questo è il nuovo codice:

typedef struct{

char prop,
ris,
opprop[10],
tabella[16];

}struct_t;

void f_lettura( struct_t& p, struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int );

int main(){

struct_t lettura;

struct_t *p;
p = &lettura;

f_lettura( p, lettura_1, lettura_2, lettura_3 , np);

}

void f_lettura( struct_t& p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int np ){

}

Gli errori sempre quelli di prima. Non voglio scocciarti/vi, è che proprio queste proprietà del C non riesco mai a capirle pienamente. Infatti qui non riesco proprio a trovare l'errore perchè non riesco a capire dove effettivamente è!

Grazie del aiuto!

EDIT: RISOLTO

Ho risolto nel seguente modo (C)

void f_lettura( struct_t * p, struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int );

int main () {

struct_t *p;
p = &lettura;

}

void f_lettura( struct_t * p , struct_t lettura_1, struct_t lettura_2, struct_t lettura_3 , int np ){


}

Potete chiudere, grazie a tutti!

tomminno
21-12-2013, 16:36
Per prima cosa devi capire in quale linguaggio stai programmando.
Nel titolo citi C# che evidentemente non è.
Stai scrivendo in C o C++? I riferimenti in C non esistono quindi non puoi usare la sintassi suggerita.
La prima variabile di f_lettura è un puntatore quindi devi passare alla funzione un puntarore. Sai come si usano i puntatori in C?
Se hai una variabile allocata sullo stack come lettura nel tuo caso, come ne ottieni l'indirizzo ovvero il puntatore?
Queste sono le regole base della sintassi del C, andrebbero un minimo studiate prima di cimentarsi con la scrittura del codice.

lorenzo001
22-12-2013, 11:09
Ho risolto nel seguente modo (C#)

C# non c'entra nulla !!

BigMeister
23-12-2013, 19:22
Ragazzi perdonatemi se dico un pò di sfondoni, comunque è C il linguaggio.
Dato che siamo sempre in argomento di Typedef vorrei chiedervi questa cosa dato che non riesco a trovarla e in rete è poco chiara:

Vorrei inserire la Typedef Struct in una libreria assieme alle funzioni. Per la funzioni non ho trovato alcun problema, sul file.h ho inserito la dichiarazione e sul file.c il corpo della funzione. Con la Typedef Struct invece è rogna. Come si passa sul file.h e sul file.c?Perchè ho tentato scrivendola per intero su file.h, cioè:

Typedef struct{

} esempio;

Compilando file.c e file.h però mi dà il seguente errore:

esempio.c: error: unknown type name ‘esempio’

e l'errore è relativo alle funzioni che sfruttano esempio, cioè:

prova( esempio *p , esempio *q );

Mi potreste chiarire le idee? Grazie mille, siete stati sempre gentilissimi!

lorenzo001
23-12-2013, 21:12
Se la typedef l'hai inserita nel .h e il .h l'hai incluso non dovresti avere problemi.

Occhio ... non

Typedef

ma

typedef

tomminno
24-12-2013, 13:03
Ragazzi perdonatemi se dico un pò di sfondoni, comunque è C il linguaggio.
Dato che siamo sempre in argomento di Typedef vorrei chiedervi questa cosa dato che non riesco a trovarla e in rete è poco chiara:

Vorrei inserire la Typedef Struct in una libreria assieme alle funzioni. Per la funzioni non ho trovato alcun problema, sul file.h ho inserito la dichiarazione e sul file.c il corpo della funzione. Con la Typedef Struct invece è rogna. Come si passa sul file.h e sul file.c?Perchè ho tentato scrivendola per intero su file.h, cioè:

Typedef struct{

} esempio;

Compilando file.c e file.h però mi dà il seguente errore:

esempio.c: error: unknown type name ‘esempio’

e l'errore è relativo alle funzioni che sfruttano esempio, cioè:

prova( esempio *p , esempio *q );

Mi potreste chiarire le idee? Grazie mille, siete stati sempre gentilissimi!


typedef struct esempio
{
...
} esempio;