So Hallo ...
nachdem ich hier einige Tips bekommen habe meine Tastenmatrix
auszulesen..habe ich mich für folgende Variante entschieden...(siehe
Anhang)
Das Problem ist leider nur, dass das Program, wenn ich es Compiliere
keine Fehlermeldung gibt. Jedoch wenn ich es in meinen Atmel Atmega8
lade nicht funktioniert...
woran kann das liegen ??
Bitte schaut euch meinen Code an...
Thx
ui..hatte noch zwei fehler entdeckt...
einmal hatte die if schleife unten keione klammern, zweitens hatte ich
vergessen den portc zu definieren...
danke für eure hilfe
@rudi (ratlos)
>Das Problem ist leider nur, dass das Program, wenn ich es Compiliere>keine Fehlermeldung gibt. Jedoch wenn ich es in meinen Atmel Atmega8>lade nicht funktioniert...>woran kann das liegen ??
Dass du einfach Code kopiert hast, ohne ihn ansatzweise zu verstehen.
Modularer Programmaufbau ist auf für kleine Programme nit von Nachteil.
Dein Auslesen der Matrix gehört in eine Funktion. Macht das ganze
WESENTLICH lesbarer etc.
Siehe Anhang, sollte funktionieren.
MfG
Falk
@Kippschalter ohne Einrastung
>> Macht das ganze WESENTLICH lesbarer etc.>Hier wird für µCs programmiert und da kommt es auf Effizienz und nicht>auf Optik an.
Und ob! Wenn schon der OP bei seinem Code nicht mehr durchsieht, dann
wird einem anderen, welchen den Code ggf. warten oder erweitern soll,
erst recht schwer fallen.
Was Hänschen nicht lernt, lernt Hans nimmer mehr!
Ausserdem haben auch uC heue sowiel FLASH, das man da schon richtig viel
Programm unterbringen kann. Und da geht fix die Übersicht verloren. Das
geht schon bei 2K FLASH los.
MFG
Falk
Asserdem, wer sagt denn, dass ein Sourcecode mit guter Optik ineffizient
sein soll? Im GEGENTEIL! Geniale Programme sind kurz und übersichtlich!
MFG
Falk
hallo und danke für eure hilfe...
na ja kopiert habe ich ihn ja schon..da haste recht..aber geändert habe
ich ihn auch und an mein vorhaben angepasst....verstanden habe ich ihn
jedoch auch..sonst hätt ich ihn ja gar nicht anpassen können...
na ja lassen wir das...
der Code funktioniert trotzdem nicht...
ich weiß nicht mehr weiter
...rudi
@rudi
>der Code funktioniert trotzdem nicht...
Welcher Code?
>ich weiß nicht mehr weiter
Debuggen? Erstmal im Simulator, dann auf dem Board.
Prüfe ob deine LED schaltbar ist. Dazu einfach code[3] mit dem richtigen
Passwort im Quelltext initialisieren, dier 4 Zeilen welche code
verändern auskommentieren. Dann müsste sofort nach dem Start die LED
angehen. Dann muss das Scannen der Matrix debugged werden. Dazu könnte
man den Rüchgabewert entweder auf einen freien Port ausgeben und per LED
anzeigen, oder per Uart auf dem PC anzeigen.
MFG
Falk
Ergebnis+=PIND;// Zeilen und Spalten verknüpfen (addieren)
Was soll das werden ?
Wie willst Du nun unterscheiden, ob das Bit im 1. oder 2. Ausdruck
gedrückt war ?
Die Addition ist also der völlig falsche Ansatz.
Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2
reichen da nicht.
Edit:
------------------------------------------------------------------
Sorry, könnte sein, daß ich obig Blödsinn geschrieben habe.
Ich merke gerade, daß ich in Deinem Code nun überhaupt nicht mehr
durchblicke.
Ob er funktionieren könnte, kann ich nicht einschätzen.
Ich bezweifle es aber sehr.
Kannst Dir ja mal meine beiden Beispiele ansehen, wie ich das mache.
Peter
@Peter Dannegger
>Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2>reichen da nicht.
Doch, doch. Das ist ne "Kreuzpeilung", einmal über die Spalten und
einmal über die Zeilen.
Das geht, hab ich auch schon gemacht.
Was ich aber gerade merke. Es fehlt die Flankenerkennung. Wenn ich
nämlich eine Taste drückee wird wei jedem Durchlauf alle 150ms die
gleiche Taste erkannt. Damit landet in code immer in fast allen
Speicherzellen die gleiche Taste.
@rudi
Hast du auch die Codes in der SWITCH Anweisung angepasst?
Hier ein neuer Versuch.
MFG
Falk
Hallo falk...
danke für die mühe...
ja die codes in der switch anweisung hatte ich angepassst...(die waren
auch schon bei meinem allerersten post hier angepasst)
du schreibst ja jetzt in deinem neuen code
if ((taste != taste_alt) && (taste !=0))
1)dann könnte mein code 1111 ja gar nicht auftreten....???
2)was heißt taste !=0 ? wenn taste ungleich 0 ist ! heißt jetzt, wenn
das array leer ist ?
danke
rudi
@rudi
>if ((taste != taste_alt) && (taste !=0))>1)dann könnte mein code 1111 ja gar nicht auftreten....???
Du verwechselst EINIGES.
>2)was heißt taste !=0 ? wenn taste ungleich 0 ist ! heißt jetzt, wenn>das array leer ist ?
NEIN!
taste ist der Rückgabewert von scan_matrix. Die modifizierte Version
gibt 0 zurück, wenn keine Taste gedrückt ist. Wenn nun taste=taste_alt
ist, dann ist ein und die selbe Taste mehrfach erkannt, und dann soll
KEIN neuer Code eingelesen werden. Es wird immer nur dann eine Taste in
dein code Array geschrieben, wenn ein neuer Tastendruck erkannt wurde.
MFG
Falk
Falk wrote:
> @Peter Dannegger>>>Außerdem brauchst Du für ne 3*4 Matrix auch 3 Abfragen a 4 Bit, 2>>reichen da nicht.>> Doch, doch. Das ist ne "Kreuzpeilung", einmal über die Spalten und> einmal über die Zeilen.> Das geht, hab ich auch schon gemacht.
Statt Addition sollte man aber besser OR nehmen, dann hat man keine
Überträge auf die Nachbartasten.
Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte
damit recht haarig werden.
Peter
@Peter Dannegger
>Statt Addition sollte man aber besser OR nehmen, dann hat man keine>Überträge auf die Nachbartasten.
Yep.
>Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte>damit recht haarig werden.
Das geht AFAIK nur mit Dioden in der Matrix. Wobei Tastaturen auch nur
zwei Folien haben, welche über Gummischalter verbunden werden. Ist die
Diode dort im Gummi?
MFG
Falk
In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den
Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).
Habe einen Tastenblock gekauft..aus Edelstahl....der hat nur ne reine
Matrix als Anschluss, deswegen habe ich Dioden vorsichtshalber
eingebaut...
Danke....
habe das Programm nochmal ausprobiert,,....leider klappt es nicht...
@rudi
>In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den>Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).
Ein Bild sag mehr als tausend Worte. Poste mal nen Schaltplan.
Vielleicht hast du die Dioden falsch eingebaut.
>Habe einen Tastenblock gekauft..aus Edelstahl....der hat nur ne reine>Matrix als Anschluss, deswegen habe ich Dioden vorsichtshalber>eingebaut...
Das nützt nix! Jeder der zwöf Taster braucht ne Diode! Wahrscheinlich
hast du mit deinen 4 Dioden Murks gemacht.
>habe das Programm nochmal ausprobiert,,....leider klappt es nicht...
Da habe ich so meine Zweifel. Ich hab nochmal drüber geschaut, in meiner
Version fehlt ne Variablendeklaration, da muss der Compiler meckern.
Hast du WIRKLICh meinen Code NEU compiliert und in den AVR gebrannt?
Siehe Anhang.
MFG
Falk
Na, das ist doch die Vorgehensweise die ich mal gepostet habe, nur
leicht abgeändert, oder? Wenn ja, da brauchste nirgends 'ne Diode, das
geht mit den Kontakten.
ja habe die variable ereignis auch schon eingebaut....
ja habe das programm gebrannt....
die Dioden liegen wie schon gesagt in reihe zu den portsD 3,4,5,6...mit
der Sperrichtung zum avr hin zeigend...das verhindert bei gleichzeitigem
drücken zweier tzasten aus der selben spalte einen kurzschluss...
dafür habe ich sie eingebaut
Hallo.
Wie wär es denn eigentlich mal, wenn du dein Entprellungsdelay mal ein
bisschen vergrößerst. Man spricht doch normal immer von 15ms, bei dir im
Code steht aber irgendwas im µs-Bereich.
MFG Fisch
@Sonic
>Na, das ist doch die Vorgehensweise die ich mal gepostet habe, nur
Ja. Aber mann solte doch gerade Anfängern keinen Code auf Beta-Nivau in
die Hand drücken, oder?
MFG
Falk
rudi wrote:
> In meiner Schaltung habe ich vier Dioden drinne, die jeweils in den> Zeilen eingebaut sind. (PD3,PD4,PD5,PD6).
Ja, dann kanns ja auch nicht gehen.
Dann mußt Du eine meiner beiden Varianten nehmen.
Bei der "Kreuzpeilung" fließt nämlich Wechselstrom durch die Tasten.
Peter
@Sonic
>>Code auf Beta-Nivau>Wie muss ich das jetzt verstehen? ;-)
Willst du das WIRKLICH hören? OK!
//#include <avr/delay.h> // wenn schon eingebunden, hier
löschen
//volatile unsigned char T_Byte = 0;
1. Fragmente
>char _scan_key (char Null)
2. Fuktionen mit Underscore sind AFAIK für den Compiler "reserviert"
3. Ein Parameter ohne Anwendung
>volatile unsigned char Ergebnis;>volatile unsigned char T_Byte;
4. Das volatile ist völlig sinnlos hier
>// Datenrichtung der Ports> DDRA = 0b11110000; // Port für die Tastatur muss evtl. angepasst werden> PORTA = 0b00001111;
5. Ist hier deplaziert und doppelt.
>T_Byte = ' ';
6. unnötig
7. Sieht man, dass das irgendwo rausgeschniten wurde, die
Kommentarfragmente verraten es.
MfG
Falk
@Peter Dannegger:
>>Statt Addition sollte man aber besser OR nehmen, dann hat man keine>Überträge auf die Nachbartasten.
Beim ersten Durchlauf (Spalten) wird 0...7 ins Register eingelesen, beim
Zzeiten 8..255 dazuaddiert, wo soll da was übertragen werden?
>Ich hatte da noch was von Mehrtastenerkennung im Hinterkopf. Dürfte>damit recht haarig werden.
Das ist völlig kahl :D (nicht haarig), funktioniert erstklassig!
@Falk.
Ich wollte es nicht wirklich hören. ;) Als Ergänzung: die Datei ist eine
Include-Datei von einem Hauptprogramm und wurde nur als Test
geschrieben, deshalb sind einige Unnötigkeiten und unsaubere Sachen
drin. Hast schon Recht, das sollte man Anfängern nicht vorsetzen. Werde
mich Bessern! :(
Sonic wrote:
> Das ist völlig kahl :D (nicht haarig), funktioniert erstklassig!
Na dann zeig doch mal her.
Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem
Wechselstrom keine Dioden in die Tasten legen kann.
Peter
Wie soll ich dir das denn jetzt zeigen?
Am Besten baust du das Teil schnell auf, ist ja nix weiter dahinter und
probierst es aus, dann siehste's ja. ;-)
Du kannst auch alle Tasten gleichzeitig drücken (beim 4x4), dann kommt
als Code '0' raus.
@Peter Dannegger
>Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem>Wechselstrom keine Dioden in die Tasten legen kann.
Welcher Wechselstrom?
@Sonic
>Am Besten baust du das Teil schnell auf, ist ja nix weiter dahinter und>probierst es aus, dann siehste's ja. ;-)>Du kannst auch alle Tasten gleichzeitig drücken (beim 4x4), dann kommt>als Code '0' raus.
Dass mich nichts aufhält mehrere Tasten gleichzeitig zu drücken ist
klar. Aber deine Routine kann mir nicht sagen, "jetzt sind die Taste 1,
5 und * gleichzeitig gedrückt (so wie es eine PC-Tastatur kann mit Shift
Tasten etc.). Du kannst mit deiner Soft- und Hardware immer nur eine
gedrückte Taste eindeutig identifizieren. Sind mehrere gleichzeitig
gedrückt wird gar keine erkannt und dein default ZZweig mit T_byte =' '
angesprungen.
MFG
Falk
@Falk:
Ja, stimmt. In meinem Programm wollte ich nur die Einzeltasten sehen,
wie die Auswertung auch sagt. Wenn du code auf UART ausgibst wirst du
sehen, dass es auch mit mehreren Tasten funktioniert.
Um mal zu sagen was erkannt werden kann:
Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer
Spalte. Mix aus mehreren Spaltentasten und Zeilentasten können nicht
erkannt werden.
Falk wrote:
> @Peter Dannegger>>>Es geht bestenfalls 2 Tasten gleichzeitig, da man ja wegen dem>>Wechselstrom keine Dioden in die Tasten legen kann.>> Welcher Wechselstrom?
Nun, einmal sind die Spalten am Low-Ausgang (-) und die Zeilen am
High-Eingang (+) und beim 2. Mal ist es genau umgekehrt.
Mit Dioden in Reihe kanns also nicht gehen.
Peter
@Sonic
>Ja, stimmt. In meinem Programm wollte ich nur die Einzeltasten sehen,>wie die Auswertung auch sagt. Wenn du code auf UART ausgibst wirst du>sehen, dass es auch mit mehreren Tasten funktioniert.
Dann müssen aber noch irgendwelche Dinge in Hardware und Software dafür
arbeiten. Eine einfache Tastenmatrix ohne Dioden sowie die von dir
gepostete Routine machen das nicht. Warum?
Wenn zwei Tasten einer Spalte gedrückt sind (z.B. '0' und "-") erzeugt
das einen Code, welcher nicht in deinem SWICH drinsteht. -> Default
MfG
Falk
Hier mal eine Komfortroutine, die alle Drücke erkennt.
Selbst, wenn Du alle 24 Tasten gleichzeitig drückst, kriegst Du sie alle
geliefert, pro Aufruf einen Tastencode.
Und beim Loslassen kriegst Du dann wieder 24 Release-Codes geliefert.
Es gibt also doppelt soviel Codes wie Tasten sind + einen Code (0) für
keine Änderung seit dem letzten Aufruf.
Beitrag "Tasten-Matrix entprellen"
Peter
@Sonic
>Hab' ich doch geschrieben:
NEIN!
>>wie die Auswertung auch sagt.>Ich habe nur Einzeltasten ausgewertet.
Du hast mehrfach behauptet, dass man damit auch Mehrfachtastendrücke
auswerten kann.
MFG
Falk
Haste nicht gelesen?
Ungefähr sechs Postings weiter oben:
Um mal zu sagen was erkannt werden kann:
Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer
Spalte. Mix aus mehreren Spaltentasten und Zeilentasten können nicht
erkannt werden.
@Sonic
>Um mal zu sagen was erkannt werden kann:>Alle Tasten in einer Reihe gleichzeitig ODER alle Tasten in einer>Spalte.
Auch das ist FALSCH! Deine Routine kann das nicht! Dazu müsste der
SWITCH erweitert werden.
>>Du hast mehrfach behauptet, dass man damit auch Mehrfachtastendrücke auswerten
kann.
>Auch wenn man's KANN dann MUSS man das nicht unbedingt! ;-)
Du KANNST es nicht einmal!
MfG
Falk
Du verstehst mich nicht! :(
Meine Abfrage fragt NUR die Einzeltasten ab, vorgabe für meine
Tastenabfrage war, das Ganze so klein und so schnell wie möglich zu
halten. Ebenso sollten nur die Einzeltasten abgefragt werden,
Kombinationen ignoriert. DARUM sind in der switch-Abfrage keine
Kombinationen drin.
Es ist aber problemlos möglich die switch-Abfrage durch die
Kombinations-Codes zu erweitern.
@Sonic
>Du verstehst mich nicht! :(
Doch, doch, aber wie es scheint ist die Logik bei dir heute im Urlaub.
>Meine Abfrage fragt NUR die Einzeltasten ab, vorgabe für meine>Tastenabfrage war, das Ganze so klein und so schnell wie möglich zu>halten. Ebenso sollten nur die Einzeltasten abgefragt werden,>Kombinationen ignoriert. DARUM sind in der switch-Abfrage keine>Kombinationen drin.
Alles schön und gut, aber deine Äusserungen waren für jeden anderen
ausser dir so zu verstehen, dass diese Funktionalität schon enthalten
ist. Dem ist nicht so. Du hättest also sinnvollerweise schreiben müssen.
"Mit dieser Funnktion sind nur einzelne Tasten auswertbar. Wenn mehrere
gleichzeitig gedrückte Tasten erkannt werden sollen muss der Code
erweitert werden."
>Es ist aber problemlos möglich die switch-Abfrage durch die>Kombinations-Codes zu erweitern.
Sicher, das muss aber dazugesagt werden.
MFG
Falk
Haste Recht. Bei uns ist es Voraussetzung, in ein Programm nur das zu
implementieren was nötig ist und nicht was möglich ist. Klar kann ein µC
un das zugehörige Programm viel viel mehr, aber am Ende kommt sowas wie
WINDOS dabei 'raus :D => eine Million Funktionen und keiner blickt mehr
durch!
Bin schon ein Stück weit zum 'Fachidioten' geworden, das kommt davon
wenn man immer mit den gleiche Leuten zusammenarbeitet. ;-)
Es ist prinzipiell nur ne Einzeltastenerkennung möglich.
Mehrfach geht nur, wie Sonic sagte, in einer Spalte oder Zeile.
Will man 2 beliebige Tasten gleichzeitig erkennen, muß man anders
abtasten (z.B. 3* je 4 Bit).
Peter
aha...
was geht denn jetzt mit meiner schaltung ???...Ich möchte ja auch nur
eine Taste "gleichzeitig " erkennen ! das reicht ja zur
codeauswertung....
hatte das ganze auch schon mal anders versucht...aber seht selbst, das
war viel zu umständlich und dauert viel zu lange...oder könnt ihr mir
sagen, was ich noch optimieren kann ?
dabei sind meine eingänge die spalten (PD0-PD2) und die ausgänge die
Zeilen PD3-PD6.
Jede Zeile wird einzeln auf 0 gelegt und dann wir an den eingängen
abgefragt ob eine 0 eingelesen wird....
thx
nein...und die müssen auch nicht raus !!!
da ich ja die dioden nur in den zeilen habe ! und die zeilen sind meine
ausgänge ! die ausgänge liegen alle auf "1" und die eingänge (spalten)
auch alle auf "1" (pull ups).Die ausgänge werden einzeln nach 0
geschaltet...
wird jetzt eine taste gedrückt, lese ich an den eingängen die "0" ein !
da spielt es keine rolle ob diode vorhanden oder nicht. die dioden sind
einzig und alleine für den kurzschlussfall den ich erwähnt habe...
thx
ja weil ich dachte, dass es mit deiner nicht funktioniert ? peter
danegger hat doch geschrieben:
Welcher Wechselstrom?
Nun, einmal sind die Spalten am Low-Ausgang (-) und die Zeilen am
High-Eingang (+) und beim 2. Mal ist es genau umgekehrt.
Mit Dioden in Reihe kanns also nicht gehen.
Peter
??
@ rudi
>nein...und die müssen auch nicht raus !!!
Du musst es ja wissen . . .
(ich ahne schreckliches)
>einzig und alleine für den kurzschlussfall den ich erwähnt habe...>dafür habe ich sie eingebaut
Es gibt gar keine Möglichkeit für einen Kurzschluss. Schau dir mal meine
Version _korrektur_3 an. Die Pins, die als Ausgang geschalten werden,
liegen auf LOW. Die Pins, die als Eingang geschalten werden haben einen
aktiven Pull-up. Da kann man nix kurzschliessen.
MFG
Falk
P.S. Ich hab ne Vermutung, wahrscheinlich ist die Abfrage zu schnell.
Die Pull-ups können die Pins nicht so schnell umladen (10pF * 50 kOhm =
500ns Zeitkonstante, bis VCC/2). Versuch mal Version 4.
Falk wrote:
> P.S. Ich hab ne Vermutung, wahrscheinlich ist die Abfrage zu schnell.> Die Pull-ups können die Pins nicht so schnell umladen (10pF * 50 kOhm => 500ns Zeitkonstante, bis VCC/2). Versuch mal Version 4.
Das habe ich mir auch überlegt.
Deshalb setze ich zuerst die alten Ausgänge auf 1 und danach wird die
Richtung umgeschaltet, d.h. nicht der Pullup muß sie auf high ziehen,
sondern der neue Ausgang auf low:
1
...
2
KEY_PORT=0x1F;
3
KEY_DDR=0x70;
4
...
5
KEY_PORT=0xF0;
6
KEY_DDR=0x0F;
7
...
Dioden sind trotzdem nicht nötig, da ja immer sämtliche Ausgänge high
oder low sind.
Peter
...ok danke nochmals für eure hilfe...
das heißt also, dass ich die Dioden jetzt drinlassen kann und es
trotzdem funtionieren müsste ?
danke und einen schönen abenmd noch
rudi
Hallo zusammen...
Ich wollte mich vielmals bei euch bedanken...habe die dioden
ausgebaut...jetzt funktioniert die Abfrage einwandfrei..spitze...
Danke an
Peter Dannegger (peda)
Falk (Gast) und
Sonic (Gast)
....vielen dank...
rudi wrote:
> Ich wollte mich vielmals bei euch bedanken...habe die dioden> ausgebaut...jetzt funktioniert die Abfrage einwandfrei..spitze...
Ja so ist das mit dem Wechselstrom, Dioden mag er nicht.
Peter
X. H. wrote:
> Ist es nicht übersichtlicher mit Breaks zu arbeiten und die passende> Konstante in key zu setzen?> Erzeugt bestimmt auch weniger Programmcode?
Nö, Programmcode steht immer hintereinander im Flash.
Jeder Abzweig (break) kostet Dich also einen zusätzlichen Jump-Befehl.
In dieser Hinsicht haben die C-Entwickler mal mitgedacht.
Peter
>Jeder Abzweig (break) kostet Dich also einen zusätzlichen Jump-Befehl.
Kommt drauf an, ob ich in Richtung Geschwindigkeit oder Platz optimieren
will. Mit Breaks wird die Abfrage nach erfüllter Bedingung sofort
verlassen (schnell), ohne Breaks werden ALLE Abfragen durchlaufen
(langsam).
@ Sonic
>verlassen (schnell), ohne Breaks werden ALLE Abfragen durchlaufen>(langsam).
Nicht ganz. Alle Anweisungen des/der Zweige werden durchlaufen, die
Abfragen jedoch nicht!
MfG
Falk
@Falk:
dass wir nicht schon wieder aneinander vorbeireden: alle
case-Anweisungen (Abfragen) werden ausgeführt. Bei nichterfüllung wird
zur nächsten gesprungen.
Stimmst du da zu?
@ Sonic
>dass wir nicht schon wieder aneinander vorbeireden: alle
;-)
>case-Anweisungen (Abfragen) werden ausgeführt. Bei nichterfüllung wird>zur nächsten gesprungen.>Stimmst du da zu?
Wir müssen eine Trennung zwischen Abfrage (Vergleich der Variablen mit
den case Konstanten) und Anweisungen in diesem jeweiligen Case Zweig
durchführen.
Und soweit mir bisher bewusst war, läuft eine Switch-Anweisung so.
i = 5;
switch( i ){
default: return 0;
case 4: key++;
case 3: key++;
case 2: key++;
case 1: ;
}
Obiger Code müsste so ausgeführt werden
Vergleiche i mit 4 -> nein
Vergleiche i mit 3 -> nein
Vergleiche i mit 2 -> nein
Vergleiche i mit 1 -> nein
Springe zu Default
Vier Vergleiche mit jeweils negativem Ergebnis
Dagegen läuft es hier anders
i = 4;
switch( i ){
default: return 0;
case 4: key++;
case 3: key++;
case 2: key++;
case 1: ;
}
Vergleiche i mit 4 - OK
key++
key++
key++
Hier wird nur einmal verglichen! Aber drei Anweisungen aus den drei
Zweigen ausgeführt.
MfG
Falk
Was ich meinte ist:
i = 4;
switch( i ){
default: return 0;
case 4: key++;
case 3: key++;
case 2: key++;
case 1: ;
}
Hier wird mit 4 verglichen, auf 3, 2 und 1 auch noch geprüft, mit
negativem Ergebnis. key wird um 1 inkrementiert.
Bei
i = 4;
switch( i ){
default: return 0;
case 4: key++;
break;
case 3: key++;
break;
case 2: key++;
break;
case 1: ;
}
wird nach positver Abfrage auf 4 die switch-Abfrage verlassen und die
restlichen case-Abfragen übersprungen. key wird um 1 inkrementiert.
Bei zahlreichen case-Abfragen spart man so einiges an Rechenzeit.
@ Sonic
>Was ich meinte ist:>i = 4;>switch( i ){> default: return 0;> case 4: key++;> case 3: key++;> case 2: key++;> case 1: ;> }>Hier wird mit 4 verglichen, auf 3, 2 und 1 auch noch geprüft, mit>negativem Ergebnis. key wird um 1 inkrementiert.
Ohhh, DAS glaube ich nicht. Dann wäre ja die break Anweisung sinnlos!
Es wird mit 4 verglichen, Positiv, und dann 3x key++! Die case
Anweisungen sind praktisch nur Sprungmarken!
Bei
i = 4;
switch( i ){
default: return 0;
case 4: key++;
break;
case 3: key++;
break;
case 2: key++;
break;
case 1: ;
}
wird nach positver Abfrage auf 4 die switch-Abfrage verlassen und die
restlichen case-Abfragen übersprungen. key wird um 1 inkrementiert.
>Bei zahlreichen case-Abfragen spart man so einiges an Rechenzeit.
Nö, das ist eine andere Baustelle. Der letzte Case-Zweig bzw. default
ist immer der langsamse, denn vorher müssen alle anderen Werte geprüft
werden (Wenn da nicht der Compiler SEHR schlau ist und irgendwelche
Muster erkennt und mit einer binären Suche den Suchweg verkürzt, oder
Sprung per Index).
MFG
Falk
Das stimmt schon, wenn erst die letzte Abfrage erfüllt ist. Der
Programmierer sollte drauf achten, dass selten vorkommende Zustände
immer zuletzt abgefragt werden. So habe ich das jedenfallds gelernt.
>und dann 3x key++!
Wie kommst du auf 3x key++? In der switch-case-Abfrage kann nur EIN
Zweig erfüllt sein, außer man fragt zweimal auf das selbe Ergebnis ab.
Ich habe auch mal gelernt:
'continue' beendet die aktuelle Schleifeniteration,
'break' beendet die ganze Schleife und
'return' beendet die ganze Funktion
@ Sonic
>immer zuletzt abgefragt werden. So habe ich das jedenfallds gelernt.>>und dann 3x key++!>Wie kommst du auf 3x key++? In der switch-case-Abfrage kann nur EIN>Zweig erfüllt sein, außer man fragt zweimal auf das selbe Ergebnis ab.
Ohhhh, ich fürchte du bist da gewaltig auf dem Holzweg! Mach mal Urlaub.
So verdienst du nicht mehr lange deine Brötchen mit Programmierung.
>'break' beendet die ganze Schleife und
Hier gehts aber nciht um ne Schleife sondern ein SWITCH Statement.
Ausserdem muss man die Hierachie beachten!
MFG
Falk
@ Sonic
>Hast du das eigentlich mal am Debugger getestet? Ich stimme dir zu dass
Nöö, aber a) das kann ich machen und b) das sthet nun WIRKLICH in jedem
C Buch. Werde beides gleich nochmal für dich konsultieren.
>ich mal Urlaub brauche ;) , aber da bin ich wohl nicht der Einzige,>oder?
Naja, gegen Urlaub hab ich wenig einzuwenden, aber ich fürchte du hast
dich mal wieder mit der Logik verrannt. Lies die Postings (deine wie
meine) nochmal. Und schau auch mal in ein C Buch. Peter, sach doch auch
mal was.
MFG
Falk
Falk hat da schon recht. Sonst würde der switch auf key_pin auch keinen
Sinn machen. Musste auch erstmal überlegen, warum das Sinn machte.
Kann eben gefährlich sein wegen falschen Schlussfolgerungen...
http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTAX/switch.html
Here, if the Grade is 'A' then the output will be [...]
Na, in dem Link isses doch prima beschrieben:
case 'A' : printf( "Excellent" );
case 'B' : printf( "Good" );
case 'C' : printf( "OK" );
case 'D' : printf( "Mmmmm...." );
case 'F' : printf( "You must do better than this" );
default : printf( "What is your grade anyway?" );
Das ist Pfui! Deshalb soll man keine Schlechten Beispiele drucken (oder
schreiben)!
Klar macht die switch-Abfrage das so, aber das ist äußerst unschön und
verwirrend! So sollte es sein:
case 'A' : printf( "Excellent" );
break;
case 'B' : printf( "Good" );
break;
case 'C' : printf( "OK" );
break;
case 'D' : printf( "Mmmmm...." );
break;
case 'F' : printf( "You must do better than this" );
break;
default : printf( "What is your grade anyway?" );
break;
Das ist sauber Strukturiert.
Weil ich voraussetze dass das
i = 4;
switch( i ){
default: return 0;
case 4: key++;
case 3: key++;
case 2: key++;
case 1: ;
}
nicht sein darf! Das ist äußest unschön programmiert, darum bin ich
drüber gestolpert.
Sonic wrote:
> Weil ich voraussetze dass das>> i = 4;> switch( i ){> default: return 0;> case 4: key++;> case 3: key++;> case 2: key++;> case 1: ;> }>> nicht sein darf! Das ist äußest unschön programmiert, darum bin ich> drüber gestolpert.
Ok.
Ich find das auch unschön.
Ist also der Konflikt zwischen Programm-Speicher sparen versus Schönheit
und Schnelligkeit ;-)
Ja, genau so ist es!
> default: return 0;> case 4: key++;
würde ich
default: return 0;
case 4: key+=3;
break;
schreiben.
Wenn viele cases danach kommen hast du einiges gespart.
@Sonic
Moin,
>Weil ich voraussetze dass das>i = 4;>switch( i ){> default: return 0;> case 4: key++;> case 3: key++;> case 2: key++;> case 1: ;> }>nicht sein darf! Das ist äußest unschön programmiert, darum bin ich>drüber gestolpert.
Ahhhh, du bist neuerdings das Mass der Dinge. Naja, das egozentrische
Weltbild hatte schon immer Hochkonjunktur, Inqisition und Kepler zum
Trotz.
Sonic, du machst dich lächerlich. Und deine Ausreden waren auch schon
mal besser.
MFG
Falk
> Ahhhh, du bist neuerdings das Mass der Dinge.
Jemand muß dir schließlich Paroli bieten.
BTW: Sonic hat seine Kompetenz hier im Forum schon bewiesen, von dir
kamen bisher nur Zurechtweisungen.
Schöne Woche.
@Jupp
>Jemand muß dir schließlich Paroli bieten.
Versuchen darf das jeder. Aber er hat sich hier mal wieder verrannt.
>BTW: Sonic hat seine Kompetenz hier im Forum schon bewiesen, von dir>kamen bisher nur Zurechtweisungen.
Erzähl noch mehr Märchen. Vieleicht wird mal ein Buch draus.
MFG
Falk
>Versuchen darf das jeder.
Du merkst scheinbar gar nicht, was für einen Charakter du hier
rüberbringst, oder? Bist du wirklich so oder ist das nur gespielt?
Was machst du eigentlich beruflich? Bestimmt wissenschaftlicher
Mitarbeiter, oder?
@Jupp
>>Versuchen darf das jeder.>Du merkst scheinbar gar nicht, was für einen Charakter du hier>rüberbringst, oder? Bist du wirklich so oder ist das nur gespielt?
Wie man in den Wald hineinruft, so schallt es heraus.
>Was machst du eigentlich beruflich? Bestimmt wissenschaftlicher>Mitarbeiter, oder?
Ganz kalt. Dreimal darfst du raten.
MfG
Falk
Na, viel kann der Falk ja nicht schaffen, wenn er zu jeder Tage- und
Nachtzeit hier im Forum anzutreffen ist! ;-)
Könntet ihr bitte über mich lästern wenn ich NICHT da bin? das tut mir
doch auch weh! :D :D