Hallo ich brauche mal eurer Hilfe, weil ich den Eindruck habe das was
ich da mache nicht so ganz elegant ist! ;-)
meine Struktur
1
typedefstruct
2
{
3
uint8_tcolor;
4
uint8_twon;
5
}pProfil;
später im Code
1
voidPlayTheGame()
2
{
3
//...
4
staticpProfilspieler1={0,0};
5
staticpProfilspieler2={0,0};
6
7
staticpProfil*sp1=&spieler1;
8
staticpProfil*sp2=&spieler2;
9
//...
10
}
Wie kann man das kürzer machen? Möglichst in zwei Zeilen... Das
Einzigste was mir einfallen würde, wäre mit malloc zu arbeiten. Wobei
man ja hier eigentlich eine dynamische Speicherverwaltung eigentlich
nicht braucht?! Zu mal man ja dann trotzdem noch Zuweisung der Werte
machen muss.
Ich muss alle vier als static deklarieren ne? Sprich das so richtig?!
Und so kommen wir zu meinem zweiten Knackpunkt. Später wenn das Spiel
dann vorbei ist möchte ich die Werte von sp1 und sp2 zurücksetzten.
So habe ich es jetzt gemacht. Was wie ich finde auch nicht so prall
ist...
1
voidresetplayer(pProfil*sp1,pProfil*sp2)
2
{
3
4
sp1->color=0;
5
sp1->won=0;
6
sp2->color=0;
7
sp2->won=0;
8
}
Mit folgendem würde ich mich ja schon zu frieden geben. Allerdings
reserviere ich ja wieder für die "profil" Speicherplatz?!
Deine Lösung ist im Grund doch OK.
Man kann die beiden static Structs noch aus der Funktion rausziehen und
zu globalen Structs machen. Bei µC ist das angenehmer, weil der RAM
Bedarf von Variablen DATA (=> globale Structs) und BSS zur Compilezeit
ausgerechnet werden kann. Zur Laufzeit erlebt man dann selterner
unliebsame Überraschungen mit überlaufendem Stack/Heap (lokale Variablen
in Funktionen, malloc/free).
Um das Optimieren beim Initialisieren beim neuen Spiel würde ich mich
nicht kümmern. Das ist eine einmalige Peanuts-Aktion. Die macht man
irgendwie (z.b. wie dein 1. Beispiel, bei globalen Struchts ohne
Funktionsargumente) und gut ist's. Da lohnen sich andere Optimierungen
bestimmt mehr ;-)
> Wie kann man das kürzer machen? Möglichst in zwei Zeilen...
Hmm...
1
staticpProfilspieler1={0,0},spieler2={0,0};
2
staticpProfil*sp1=&spieler1,*sp2=&spieler2;
Ist halt nicht so lesbar. Was erhoffst du dir eigentlich durch eine
Reduktion auf zwei Zeilen?
> Ich muss alle vier als static deklarieren ne? Sprich das so richtig?!
Das kommt darauf an, wozu du sie brauchst.
> So habe ich es jetzt gemacht. Was wie ich finde auch nicht so prall> ist...
Wieso? Was gefällt dir daran nicht?
> Mit folgendem würde ich mich ja schon zu frieden geben. Allerdings> reserviere ich ja wieder für die "profil" Speicherplatz?!
Temporär, möglicherweise, ja.
Ah dann bin ich ja beruhigt! Hätte ja sein können, dass man es kürzer
machen kann... :-)
Jetzt habe ich allerdings ein Speed Problem. Und zwar will ich mit
folgender Funktion Registieren, welche Taste gedrückt worden ist.
Allerdings mit dieser Funktion geht das nicht wirklich gut. Muss
meinstens mehr mals drücken, bis ein Druck registriert worden ist.
Die Funktion
Ich würde unbedingt die Entprellung per Software mittels /debounce
time/ Methode und dem 2*50ms Warten ersetzen. Z.b. durch die bewährten
Routinen aus der Artikelsammlung mit dem Einlesen der Tasten im
Timer-Interrupt.
Ich würde bei 8 Tasten alle auf einen Port legen und den komplett nur
einmal einlesen. Das Rauspfriemeln der gedrückten Taste zum Auswerten
dann mit Bitmasken. Damit spart man die vielen Aufrufe von
delay_buttonpush() in getAnyKeyPush()
Du hast allerdings 9 Tasten - scheint eine 3x3 Tastaturmatrix zu sein.
Da gibt es in der Artikelsammlung auch Routinen dafür. Alternativ die am
wenigsten benutzte Taste auf einen extra Pin legen und 8+1 abfragen.
So ich hab es jetzt wie folgt geändert. Ist jetzt so einigermaßen wie
ich es haben will. Stören sich eigentlich ein Timer Interrupt und die
_delay_ms()? Weil ich noch eine Multiplexer LED Schaltung hinzufügen
will wie über Timer Interrupt laufen wird. Und ich will halt nicht das
die sich gegenseitig erheblich in Quäre kommen...
Warum geht die modifizierte getAnyKeyPush() gefühlstechnisch besser?
Denn das Ausmaskieren macht doch die delay_buttonpush auch schon?!
Sprich die geht doch erst gar nicht zum _delay_ms(), wenn keine Taste
gedrückt ist?!
Max wrote:
> Stören sich eigentlich ein Timer Interrupt und die> _delay_ms()?
Sicher doch. Die _delay_ms() wird von den Timer-Interupts unterbrochen
und braucht länger als von dir angegeben, d.h. sie wird unpräziser.
> Weil ich noch eine Multiplexer LED Schaltung hinzufügen> will wie über Timer Interrupt laufen wird. Und ich will halt nicht das> die sich gegenseitig erheblich in Quäre kommen...
Dann lass die das Softwaredebounce weg und polle die Tasten im sowieso
vorhandenen Timer-Interrupt. Eleganter kannst du das nicht lösen.
> Warum geht die modifizierte getAnyKeyPush() gefühlstechnisch besser?> Denn das Ausmaskieren macht doch die delay_buttonpush auch schon?!> Sprich die geht doch erst gar nicht zum _delay_ms(), wenn keine Taste> gedrückt ist?!
Durch die beiden neuen Zusatzabfragen gehst du nur in die zeitmäßig
teure delay_buttonpush(), wenn eine Taste gedrückt ist. Vorher gingst du
immer rein. Der Zeitverbrauch ist die Aufrufzeit der delay_buttonpush().
(Edit: Teil gelöscht. Analyse deiner Tastenabfrage ist mir im Moment zu
zeitaufwändig)
50 ms ist schon rel. viel Entprellzeit. Zur Info: In BASCOM AVR sind
beim Befehl DEBOUNCE 25 ms default (einstellbar mit CONFIG DEBOUNCE).