Hallo ich habe ein kleines Problem: Und zwar wollte ich den C-Code eines kleinen ATmega8-Programms (Code noch nicht in der endgültigen Version) umstrukturieren. Ich wollte die Funktionen, Deklarationen, etc. , die die Uhrzeit betreffen in 2 separate Dateien uhrzeit.h und uhrzeit.c auslagern! Ich hab schon einen Versuch gestartet allerdings mit diversen Fehlermeldungen (redeclartion of static functino etc.) Wie geht man da denn generell vor? (Ich hab das vorher nur ein bisschen in ASM gemacht!) Ich wollte alle Teile, die mit //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ umrahmt sind auslagern!
Olli R. schrieb: > Ich wollte alle Teile, die mit > //ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ > umrahmt sind auslagern! 1. du hast heute schon gesehen das es keine sinn macht die Monate in die stuktur mit aufzunehmen, warum machst du jetzt den gleiche unsinn mit int day_reference[12]; ? 2. die Typdef sollte ohne problem auslagerbar sein aber ohne die gleichzeitige deklaration einer variabel.
1 | typedef struct time_t |
2 | { /* deklariert den Strukturtyp time_t */ |
3 | int second; |
4 | int minute; |
5 | int hour; |
6 | int day; |
7 | int day_of_week; |
8 | int day_reference[12]; -> unsinn weg! |
9 | int week; |
10 | int month; |
11 | int year; |
12 | };
|
das auslagern sollte auch kein problem sein: time_t generate_time(time_t time); time_t is_leap_year(time_t time); time_t generate_day_of_week(time_t time); Aber: Dieser code sit viel zu langsam. Es wird jedesmal die struktur kopiert! struktur sollte immer als zeiger oder referenz übergeben werden time_t* generate_time(time_t* time); der Rest muss in der C datei bleiben.
Peter II schrieb: > Aber: Dieser code sit viel zu langsam. Es wird jedesmal die struktur > kopiert! struktur sollte immer als zeiger oder referenz übergeben werden > > time_t* generate_time(time_t* time); Wenn ich das mit Zeiger machte, bräuchte ich doch keinen Rückgabewert, da ja eh die Speicherstelle, auf die der Zeiger zeigt verändert wird?
Olli R. schrieb: > Wenn ich das mit Zeiger machte, bräuchte ich doch keinen Rückgabewert, > da ja eh die Speicherstelle, auf die der Zeiger zeigt verändert wird? braucht du nicht stört aber auch nicht.
Peter II schrieb: > Olli R. schrieb: >> Wenn ich das mit Zeiger machte, bräuchte ich doch keinen Rückgabewert, >> da ja eh die Speicherstelle, auf die der Zeiger zeigt verändert wird? > braucht du nicht stört aber auch nicht. Ok dann werde ich mir morgen mal näher mit dem "call by reference" in C auseinandersetzen! Momentan mache ich ja "call by value" also jedes Unterprogramm erhält eine Kopie der Daten.....
Ich war da am Anfang kurz verwirrt, wahrscheinlich wirds dir genauso gehen... Es gibt zwei Möglichkeiten in C, dass die Struktur nicht kopiert wird. Entweder du benutzt tatsächlich eine Referenz "time_t&" oder du benutzt einen Zeiger "time_t*". Es sollte ausreichen, wenn du oben in deinen Methodensignaturen einfach ein "&" hinten an den Datentyp dranmachst, mehr musst du eigentlich gar nicht beachten. Der Zugriff auf eine Referenz erfolgt dann genauso wie bei einer Kopie, nämlich mit Punkt. Beim Zeiger hättest du ja stattdessen einen Pfeil...
Olli R. schrieb: > Ok dann werde ich mir morgen mal näher mit dem "call by reference" in C > auseinandersetzen! naja Referenzen gibt es erst in C++ in C sind es halt zeiger. wenn du einmal dran bist, dann solltest du auch über die funktion is_leap_year nachdenken, sie ist extrem unlogisch. Von dem namen erwaret man das einem die funktion sagt ob ein Jahr ein Schaltjahr ist oder nicht. Aber sie bekommt eine time variable und liefert eine time variabel zurück. Mach es so wie es alle machen bool is_leap_year( int jahr ); dann geht du einfach mal von 28Tage im Februar aus und machst dann einfach if ( is_leap_year( time.year ) ) { //datum auf den 29.Feb. ändern }
Und über die 'day_reference' in der Struktur solltest du auch noch mal nachdenken. Du wirst wahrscheinlich sowieso eine Funktion 'dayForMonth' oder so ähnlich brauchen. Da kannst du das wunderbar reinstecken. Sind nur ein paar if-Abfragen. Aber da in jeder time_t das komplette Wissen über die Tage pro Monat mitschleppen, das ist nicht so schlau. Wenn schon, dann legt man so ein Array einmal an und stecjt es als static Variable in das C-File, in dem der Code der Zeitfunktionen ist.
nocheinGast schrieb: > Ich war da am Anfang kurz verwirrt, wahrscheinlich wirds dir genauso > gehen... Es gibt zwei Möglichkeiten in C, dass die Struktur nicht > kopiert wird. Entweder du benutzt tatsächlich eine Referenz "time_t&" > oder du benutzt einen Zeiger "time_t*". > Es sollte ausreichen, wenn du oben in deinen Methodensignaturen einfach > ein "&" hinten an den Datentyp dranmachst, mehr musst du eigentlich gar > nicht beachten. Der Zugriff auf eine Referenz erfolgt dann genauso wie > bei einer Kopie, nämlich mit Punkt. Beim Zeiger hättest du ja > stattdessen einen Pfeil... Ich hab jetzt mal nachgelesen und mache das jetzt so: time_t time, *time_ptr; time_ptr = &time; und die Zuweisung geht dann z.B. so (*time_ptr).month = 11;
Olli R. schrieb: > und die Zuweisung geht dann z.B. so > (*time_ptr).month = 11; überlicher ist aber so: time_ptr->month = 11;
Achso und hab ich gerade bemerkt: Es werden jetzt nur noch 2/3 des vorherigen Speicherplatzes belegt (laut Kompilierer)
Olli R. schrieb: > Es werden jetzt nur noch 2/3 des vorherigen Speicherplatzes belegt (laut > Kompilierer) war ja auch kein wunder bei diesem code. Zeigt doch mal was du jetzt zusammengeschrieben hast.
Bisher nur so, dass ich nur Pointer übergebe, am Rest bin ich noch dran!
So jetzt bin ich einen Schritt weiter: Also ok das mit den time.day_reference hab ich noch nicht geändert aber alles auf Pointer umgearbeitet und einen großen Anteil ausgelagert. Es fehlen an vielen Stellen natürlich auch noch aussagekräftige Kommentare/Funktionsbeschreibungen!
naja viel schöner ist es nicht geworden. was hat > time_t time, *time_ptr; in der uhrzeit.c verloren? Das muss ins hauptprogramm uhr1.c. wozu überhaupt der zeiger? > time_ptr = &time; kann weg, macht so keinen sinn time.day_reference[0] = 31; time.day_reference[1] = 28; ... time.second = 45; is_leap_year(&time_ptr); macht das gleiche ist ist besser lesbar.
und das schlimmste ist hier: #include "lcdroutines.c" #include "uhrzeit.c" es werden niemals *.c Dateien per include eingebunden!!!!!!!!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.