Newsgroup: it.comp.lang.c
Titolo: dichiarazione della struttura dati

salve,
devo creare un programma ove pi� funzioni distinte accedono ai dati della
stessa struttura.
Non devo creare pi� strutture dello stesso tipo con la denominazione
diversa. Mi basta una sola
struttura con una singola denominazione.
Ho cominciato con lo scrivere il codice allegato in fondo a questo post.
Non riesco a compilarlo.
Mi d� due warning:
1� warning)
6 C:\Documenti\test1.c [Warning] "struct parametri_elettrici" declared
inside parameter list
2� warning)
6 C:\Documenti\test1.c [Warning] its scope is only this definition or
declaration, which is probably not what you want
Inoltre mi d� l'errore:
C:\Documenti\test1.c In function `main':
6 C:\Documenti\test1.c Segmentation fault
qualcuno sa dirmi perch� non riesco a compilare il codice ?
Ho provato a spostare la dichiarazione della struttura all'esterno del main,
prima di ogni altra
dichiarazione.
Ora compila correttamente. Perch�?
Mi piacerebbe passare la struttura alle funzioni evitando di impiegare i
parametri
globali.
Come posso fare per passare la struttura dati alle varie funzioni,
dichiarandola dentro il main,
e non al suo esterno?
******************************************************************
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
void aggiorna_grandezze_residue(struct parametri_elettrici *p);
main()
{
/*ora noi calcoliamo i valori statici a regime delle grandezze elettriche*/
int n, n_regime, trovato, esito,  T;
const int N=32;
struct parametri_elettrici
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
} r;
(r.f_camp)=44100;
(r.R1)=33e3;
(r.R2)=330;
(r.R3)=8200;
(r.R4)=100e3;
(r.R5)=1000;
(r.R6)=500e3;
(r.R5a)=500;
(r.R5b)=500;
(r.R6a)=250e3;
(r.R6b)=250e3;
(r.C1)=2.2e-6;
(r.C2)=20e-6;
(r.C3)=1e-8;
(r.L)=1.5;
(r.R6b)=1.5;
(r.Rpick)=1e+4;
(r.vt)=25e-3;
(r.betaf1)=70;
(r.betaf2)=70;
(r.Ic01)=2.06e-6;
(r.Ie01)=1.02e-6;
(r.Ic02)=2.06e-6;
(r.Ie02)=1.02e-6;
aggiorna_grandezze_residue(&r);
}
//////////////////////
void aggiorna_grandezze_residue(struct parametri_elettrici *p)
{
 int j;
 (p->Tc1)=1;
}
//////////////////////
******************************************************************
grazie,
adriano meis

Non puoi avere un prototipo di funzione che utilizza una struttura dati
ignota al compilatore... (e quanto gli riserva sullo stack? em bo!)
quindi la devi dichiarare prima, meglio magari in un file h dedicato.
dichiarandone la struttura prima non ï¿œ che crei una varibile globale ï¿œ
globalse casomai semplicemente la sua dichiarazione poi nel main
semplicemente fai:
struct parametri_elettrici r;
se non vuoi usare typedef, anche se io preferisco usarlo.
il main sarebbe meglio dichiararlo come:
int main(int argc, char** argv);
comunque al limite:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct parametri_elettrici_
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
} parametri_elettrici;
void aggiorna_grandezze_residue(parametri_elettrici *p);
int main(int argc, char** argv)
{
/*ora noi calcoliamo i valori statici a regime delle grandezze elettriche*/
int n, n_regime, trovato, esito, T;
const int N=32;
parametri_elettrici r;

aggiorna_grandezze_residue(&r);
return 0;
}
//////////////////////
void aggiorna_grandezze_residue(parametri_elettrici *p)
{
 int j;
 (p->Tc1)=1;
}


grazie,
ho compilato il tuo codice.
Poi per� ho provato a cambiare la dichiarazione del nuovo tipo
"parametri_elettrici".
Tutto il resto l'ho lasciato inalterato a come l'hai scritto te.
Ecco le 4 modalit� che ho provato:
1)questa dichiarazione coincide con quella da te indicata, non d� errori di
compilazione, e
sembra funzionare correttamente:
typedef struct  parametri_elettrici_
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
}parametri_elettrici;
A che serve il pedice posto dopo "parametri_elettrici"?
2)questa dichiarazione non d� errori di compilazione e sembra funzionare
correttamente:
(ora ho rimosso il pedice dopo "parametri_elettrici")
typedef struct parametri_elettrici
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
}parametri_elettrici;
3)questa dichiarazione non d� errori di compilazione e sembra funzionare
correttamente:
(ora ho rimosso "parametri_elettrici" dopo la parola chiave "struct")
typedef struct
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
}parametri_elettrici;
4)questa dichiarazione invece d� errori di compilazione:
(ora ho rimosso "parametri_elettrici" dopo l'elenco delle variabili poste
dentro la struttura)
typedef struct parametri_elettrici
{
double Vd, kd, R1, R2, R3, R4, R5, R5a ,R5b, R6, R6a, R6b, Rpick,  C1, C2,
C3, L, Z0, Ze2, Zs, vt,Ic01, Ie01,Ic02, Ie02, betaf1, betar1,  betaf2,
betar2, Ic1, Ie1, Ic2, Ie2, i6, i5a, iL, vcb1, veb1, Icb2, Ieb2, keb2,
kcb2,ks, ke2, k0, kL, kc1, vout, vi,  h, f_camp,
vcb1_precedente,veb1_precedente,kcb2_precedente,keb2_precedente ;
int  Tc1, Tc2, Te1, Te2, configurazione_tratti;
double ve1_confine, vc1_confine, ve2_confine, vc2_confine, Ie1_confine,
Ic1_confine,Ic2_confine, Ie2_confine;
double  mc1[2], me1[2], mc2[2], me2[2], qc1[2] , qe1[2], qc2[2], qe2[2],
me2i[2], mc2i[2], qe2i[2], qc2i[2];
};
in particolare nel main mi dice che "parametri_elettrici" � non dichiarato.
/////////////////////////////////////////
Perch� le prime 3 dichiarazioni vengono accettate dal compilatore, mentre la
4� no?
Nel mio caso, posso impiegare una qualsiasi delle prime tre dichiarazioni?
Cio� le prime 3 dichiarazioni sono equivalenti al 100% fra di loro?
grazie,
adriano

 Cioè le prime 3 dichiarazioni sono equivalenti al 100% fra di loro?
rileggiti su un manuale qualsiasi come si dichiarano le struct e come
funziona il typedef.
Ciao Jack

 Cioï¿œ le prime 3 dichiarazioni sono equivalenti al 100% fra di loro?
Non sono del tutto equivalenti, ma per quello che devi fare andranno 
bene tutte e tre.
E.


ehm direi che è un'ottima risposta....
per Adriano: imparare il C per tentativi senza una solida base teorica
ti porterà solo a scrivere pessimo codice.

funziona il typedef.
Io ho lo Schildt (che a suo tempo, circa il 2002, pagai sulle 90000 lire),
ma non mi piace.
Per esempio non fa alcun esempio di typedef applicato alle strutture.
Visto che non ho voglia di spendere soldi per un altro manuale sul C,
conoscete un buon manuale sul C, che spieghi meglio dello Schildt, che
esponga pi� esempi,  scaricabile gratis da internet?
grazie a tutti per le precedenti risposte,
adriano

 esponga più esempi,  scaricabile gratis da internet?
direi che google, con la giusta stringa di ricerca da' un sacco di
esempi (tutti uguali peraltro) ababstanza esplicativi.
Ciao Jack

 
ti posso solo dire che un mi professore considerava lo Schildt un
pessimo libro, noi usavamo questo:
Il linguaggio C. Principi di programmazione e manuale di riferimento
Kernighan Brian W.; Ritchie Dennis M.
Pearson Education Italia

 non lo conosco.
Meglio. Fa notoriamente e conclatamente schifo. :)
-- 
-riko