Werte innerhalb einer Schleife in eine Datei Schreiben?!
-
Hallo,
ich habe ein kleines Problem, und zwar habe ich ein Programm geschrieben, dass mir sehr viele Werte berechnet die ich benoetige. Ich habe jetzt nur mal die wichtigen Programmteile gepostet. WIE ich eine Dateiausgabe mache weiss ich(ist hier noch nicht ausgefuehrt), aber leider nicht WO. Da Ausgabe() in der Schleife steht kriege ich logischerweise immer nur die letzten Werte in die Datei geschrieben, da jedesmal die Datei geoeffnet und ueberschrieben und geschlossen wird. Ausserhalb von Ausgabe() kennt er die FILE zuweisung aber nicht.
Frage: WO muss ich die Datei oeffnen und Schliessen damit ich ALLE Werte kriege? Schmetisch ist das Programm so aufgebaut: Gruss Illu!
int main ()
{Start ();
Programmeinstellungen();
Berechnung();
Ende();
}int Berechnung ()
{ for (m=0; m<43200; m = m + dm)
{Ausgabe ();
for (t=0; t<60; t = t + dt)
{Ueberpruefung ();
Berechnung ();}}
Ausgabe ();
}int Ausgabe ()
{ printf ("%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
m,h,u,a,c,v,b,n,s,g,f);
}
-
vor dem ersten schreiben öffnen. also sinnvollerweise in deinem fall wohl in Programmeinstellungen() und schließe nach dem letzten einrag, also in Ende().
-
Hab ich versucht, aber dann meckert er, dass er innerhalb von ausgabe () das nicht kennt....
dv25.c: In function ‘Ausgabe’:
dv25.c:179: error: ‘save’ undeclared (first use in this function)
dv25.c:179: error: (Each undeclared identifier is reported only once
dv25.c:179: error: for each function it appears in.)
dv25.c: In function ‘Ende’:
dv25.c:187: error: ‘save’ undeclared (first use in this function)Nochmal mit der FILE Zuweisung:
int Ausgabe ()
{
fprintf (save,"%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
m,
H,
Utemp,AKEtemp, AWAtemp, AHKSZtemp, AHKBZtemp, AHKWZtemp, ASZtemp, ABZtemp, AWZtemp);
}-> Das steht (u.a.)in der int Ende ():
fclose(save);
-> Das steht (u.a) in der int Programmeinstellungen ():
FILE *save;
save = fopen("save.dat","w");
if (save==NULL)
{fprintf(stderr, "Fehler beim Öffnen der Datei.\n");
exit(1);
}Jemand eine Idee?
-
entweder FILE *save; global machen,
oder als parameter übergeben
mfg
-
mit global machen meinst du doch ausserhalb der ausgabe() das FILE zu oeffnen oder? Ich habe es zu beginn des ganzen programmes und innerhalb der main() versucht. Beide klappt nicht. Waere sehr nett wenn du mir das kurz erklaeren koenntest, auch wie du das mit der parameter uebergabe meinst. Danke!
-
ne, du kannst die variable global deklarieren.
dann kannst du die datei in main(), Ausgabe() ... praktisch überall öffnen.
bedeutet, du schreibst die deklaration über alle anderen funktionen oben drüber:FILE* save;
oder schreibst sie in eine header-datei.
parameter sind die variablen in den klammern einer funktion:
int testfunktion( int integer_parameter )
hier ist die integer-variable mit dem namen integer_parameter ein parameter.
-
Habe ich versucht, aber es klappt nicht. Glaube ich habe mittlerweile alles ausprobiert - und schaffe es nicht...deshalb jetzt mal den kompletten Code, ware nett wenn du mir zeigst was ich wohinschreiben muss - Danke...
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
FILE *save;// KONSTANTEN
double ZWZtemp = 20.0; // Ziel-Wohnzimmertemperatur
double ZSZtemp = 17.0; // Ziel-Schlafzimmertemperatur
double ZBZtemp = 22.0; // Ziel-Badezimmertemperaturfloat R_NE_U = 0.02639; // Wärmewiderstand Niedrigenergiehaus zu Umgebung
float R_AB_U = 0.004285; // Wärmewiderstand Altbauhaus zu Umgebung
float R_KE_WA = 0.0007; // Wärmewiderstand Heizkessel zu Wasser
float R_WA_HK = 0.001; // Wärmewiderstand Wasser zu Heizkörper
float R_HK_ZI = 0.003; // Wärmewiderstand Heizkörper zu Zimmerfloat C_KE = 30000.0; // Wärmekapazität Heizkessel
float C_HK = 30000.0; // Wärmekapazität Heizkörper
float C_WA = 714000.0; // Wärmekapazität Wasser
float C_ZI = 227000.0; // Wärmekapazität Zimmerdouble HW = 20000.0; // Heizwert
// Variablen
double HL; // aktuelle Heizleistungdouble Utemp_tag; // Umgebungstemperatur Tag
double Utemp_nacht; // Umgebungstemperatur Nacht
double Utemp ; // aktuelle Umgebungstemperaturdouble dt = 1.0; // Delta t = 1 Sekunde
double dm = 1.0; // Delta m = 1 Minute
double t; // Vergangene Zeit in Sekunden
double m; // Vergangene Zeit in Minutendouble AWZtemp; // Aktuelle-Wohnzimmertemperatur
double ASZtemp; // Aktuelle-Schlafzimmertemperatur
double ABZtemp; // Aktuelle-Badezimmertemperatur
double AHKSZtemp; // Aktuelle-Heizkörpertemperatur Schlafzimmer
double AHKBZtemp; // Aktuelle-Heizkörpertemperatur Badezimmer
double AHKWZtemp; // Aktuelle-Heizkörpertemperatur Wohnzimmer
double AWAtemp; // Aktuelle-Wassertemperatur
double AKEtemp; // Aktuelle-Kesseltemperaturint HI; // Art der Hausisolierung
int NA; // Nachtabschaltung ja/nein
double AI; // aktuelle Isolierungdouble x; // aktueller Heizanteil Badezimmer
double y; // aktueller Heizanteil Schlafzimmer
double z; // aktueller Heizanteil Wohnzimmerint main ()
{
Start ();
Programmeinstellungen();
Temperaturberechnung();
Ende();
}int Start ()
{
printf ("\n****** PROGRAMM heizungssimulation.c GESTARTET ******\n");
printf ("\n");
}int Programmeinstellungen ()
{ // Isolierung
printf ("Welche Hausisolierung soll gewählt werden? \n");
printf ("\n");
printf ("< 1 > Niedrigenergiehaus \n");
printf ("< 2 > Altbau \n");
scanf ("%d", &HI);
printf ("\n");if (HI == 1) AI = R_NE_U;
else if (HI == 2) AI = R_AB_U;
else printf("Eingabefehler! 1 oder 2 auswählen \n");// Nachtabschaltung
printf ("Heizung mit Nachtabschaltung? \n");
printf ("< 1 > ja \n");
printf ("< 2 > nein \n");
scanf ("%d", &NA);
printf ("Berechnung laeuft...\n");//Nachtabschaltung
// Startwerte
AWZtemp = 10.0;
ASZtemp = 10.0;
ABZtemp = 10.0;
AHKSZtemp = 10.0;
AHKBZtemp = 10.0;
AHKWZtemp = 10.0;
AWAtemp = 10.0;
AKEtemp = 10.0;
HL = HW;
Utemp = 0.0;
}int Temperaturberechnung ()
{ for (m=0; m<43200; m = m + dm)
{Ausgabe ();
for (t=0; t<60; t = t + dt)
{Ueberpruefung ();
Berechnung ();}}
Ausgabe ();
}int Ueberpruefung ()
{ // Heizungssteuerung
if ((AWZtemp < (ZWZtemp - 0.3)) || (ASZtemp < (ZSZtemp - 0.3)) || (ABZtemp < (ZBZtemp -0.3))) {(HL=HW);}
else {(HL = 0.0);}// Ventilsteuerung
if ((AWZtemp < ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 0.0, z = 1.0);}
if ((AWZtemp > ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 1.0, z = 0.0);}
if ((AWZtemp > ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 1.0, y = 0.0, z = 0.0);}
if ((AWZtemp < ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp > ZBZtemp)) {(x = 0.0, y = 0.5, z = 0.5);}
if ((AWZtemp < ZWZtemp) && (ASZtemp > ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.5, y = 0.0, z = 0.5);}
if ((AWZtemp > ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.5, y = 0.5, z = 0.0);}
if ((AWZtemp < ZWZtemp) && (ASZtemp < ZSZtemp) && (ABZtemp < ZBZtemp)) {(x = 0.33, y = 0.33, z = 0.33);}
}int Berechnung ()
{
Utemp = 5.0;//-0.0151*(t/3600)(t/3600)(t/3600) + 0.3934*(t/3600)(t/3600) -1.3147t/3600,
AKEtemp = AKEtemp + dt*(HL/C_KE) - dt*((AKEtemp-AWAtemp)/(C_KER_KE_WA));
AWAtemp = AWAtemp + dt((AKEtemp-AWAtemp)/(C_WA*R_KE_WA)) - dt*((x*(AWAtemp-AHKBZtemp)+y*(AWAtemp-AHKSZtemp)+
z*(AWAtemp-AHKWZtemp))/(C_WAR_WA_HK));
AHKSZtemp = AHKSZtemp + dt(y*(AWAtemp-AHKSZtemp)/(C_HKR_WA_HK)) -
dt((AHKSZtemp-ASZtemp)/(C_HKR_HK_ZI));
AHKBZtemp = AHKBZtemp + dt(x*(AWAtemp-AHKBZtemp)/(C_HKR_WA_HK)) -
dt((AHKBZtemp-ABZtemp)/(C_HKR_HK_ZI));
AHKWZtemp = AHKWZtemp + dt(z*(AWAtemp-AHKWZtemp)/(C_HKR_WA_HK) -
dt((AHKWZtemp-AWZtemp)/(C_HKR_HK_ZI)));
ASZtemp = ASZtemp + dt((AHKSZtemp-ASZtemp)/(C_ZIR_HK_ZI)) -
dt((ASZtemp-Utemp)/(C_ZIAI));
ABZtemp = ABZtemp + dt((AHKBZtemp-ABZtemp)/(C_ZIR_HK_ZI)) -
dt((ABZtemp-Utemp)/(C_ZIAI));
AWZtemp = AWZtemp + dt((AHKWZtemp-AWZtemp)/(C_ZIR_HK_ZI)) -
dt((AWZtemp-Utemp)/(C_ZI*AI));
}int Ausgabe ()
{
save = fopen("save.dat","w");
if (save==NULL)
{fprintf(stderr, "Fehler beim Öffnen der Datei.\n");
exit(1);
}
fprintf (save,"%.5f %.0f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f \n" ,
m/60,
HL/20000,
Utemp,AKEtemp, AWAtemp, AHKSZtemp, AHKBZtemp, AHKWZtemp, ASZtemp, ABZtemp, AWZtemp);
}int Ende ()
{
fclose(save);
printf ("\nSimulationsdaten in Datei > save.dat < geschrieben\n");
printf ("\n****** PROGRAMM heizungssimulation.c BEENDET ******\n");
printf ("\n");
}
-
hat sich erledigt, thx trotzdem!!! Ich hab in der Schleife der FILE Anweisung einfach nur die Rechte zum hinzuschreiben "a" gegeben, und vorher die Datei geleert. Das reicht fuer meine Zwecke. Gruss Illu