Forum: Mikrocontroller und Digitale Elektronik C-Code von ATmega8 Programm aufräumen?


von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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.....

von nocheinGast (Gast)


Lesenswert?

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...

von Peter II (Gast)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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;

von Peter II (Gast)


Lesenswert?

Olli R. schrieb:
> und die Zuweisung geht dann z.B. so
> (*time_ptr).month = 11;

überlicher ist aber so:

time_ptr->month = 11;

von Olli R. (downunderthunder42)


Lesenswert?

Achso und hab ich gerade bemerkt:

Es werden jetzt nur noch 2/3 des vorherigen Speicherplatzes belegt (laut 
Kompilierer)

von Peter II (Gast)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

Bisher nur so, dass ich nur Pointer übergebe, am Rest bin ich noch dran!

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.