Hi,
ich wollte mit der folgenden Funktion 1 oder 0 zurück bekommen.
Ich dachte es sei 1 wenn chkbyte eben nicht in die Anforderung passt.
Hmm kommt aber immer 0 raus, egal was ich für einen Wert übergebe, was
hab ich da übersehen?
(chkbyte != 45) && (chkbyte != 90));
Für jede beliebige Zahl gilt:
Da sie nicht gleichzeitig 45 und gleichzeitig 90 sein kann,
gilt für jede Zahl: sie ist entweder nicht 45 oder nicht gleich
90.
D.h. einer der beiden Teilausdrücke ist immer falsch und damit
ist die UND-Verknüpfung auch immer falsch.
Karl heinz Buchegger wrote:
> (chkbyte != 45) && (chkbyte != 90));>> Für jede beliebige Zahl gilt:> Da sie nicht gleichzeitig 45 und gleichzeitig 90 sein kann,> gilt für jede Zahl: sie ist entweder nicht 45 oder nicht gleich> 90.> D.h. einer der beiden Teilausdrücke ist immer falsch und damit> ist die UND-Verknüpfung auch immer falsch.
Hmmm... (chkbyte != 45) ist nur dann falsch (0), wenn chkbyte 45 ist.
(chkbyte != 90) ist nur dann falsch (0), wenn chkbyte 90 ist.
Wenn chkbyte WEDER 45 NOCH 90 ist, müssten doch eigentlich beide
Ausdrücke eine 1 zurückliefern (und ich denke, das ist das, was der OP
will), oder hab ich was übersehen?
> (chkbyte <= 128)
Fällt mir noch grad auf: char hat einen Wertebereich von -128...+127.
Der Check auf <= 128 kann fürchterlich in die Hose gehen! Ich weiß jetzt
zwar nicht, was der Compiler daraus macht, aber das solltest Du
vielleicht ändern. Kommen überhaupt negative Werte vor? Wenn nicht, dann
besser mit unsigned char bzw. uint8_t...
Das sollte eigentlich keine Probleme machen. Der Compiler ignoriert dann
einfach den Vergleich auf <= 128, weil das Ergebnis sowieso immer wahr
ist. Eigentlich müßte gcc auch eine entsprechende Warnung ausgeben.
Rolf Magnus wrote:
> Eigentlich müßte gcc auch eine entsprechende Warnung ausgeben.
Du weißt doch, wie das mit den Warnungen ist: Die liest eh keiner...;-)
Johannes M. wrote:
> Karl heinz Buchegger wrote:>> (chkbyte != 45) && (chkbyte != 90));>>>> Für jede beliebige Zahl gilt:>> Da sie nicht gleichzeitig 45 und gleichzeitig 90 sein kann,>> gilt für jede Zahl: sie ist entweder nicht 45 oder nicht gleich>> 90.>> D.h. einer der beiden Teilausdrücke ist immer falsch und damit>> ist die UND-Verknüpfung auch immer falsch.> Hmmm...
Auch hmm.
Du hast recht.
Immer diese komplizierten Logik Ausdrücke und De Morgan, etc.
Aber warum ist das dann trotzdem immer falsch?
zeigt das Verhalten, von dem ich denke, dass der OP es haben
möchte.
ALso: tobiTob
Welches Verhalten ist gewünscht?
Wie hast du kontrolliert, dass der Ausdruck
nicht so funktioniert, wie du dir das vorstellst?
Hi,
danke für die Antworten...
Ich habe die Werte 0, 32 und 255 übergeben.
Gültig sind aber nur Werte die >30 und <128 sind aber nicht "nicht" 45
und "nicht" 90.
Ich schau mal eben gerade nochmal, vlt. hab ich mich doch vertan...
Gruß Tobi...
tobiTob wrote:
> Gültig sind aber nur Werte die >30 und <128 sind aber nicht "nicht" 45> und "nicht" 90.
Vorsicht mit doppelten Verneinungen und 'und' und 'oder'.
Ich vermeide eigentlich solch komplizierte Ausdrücke und
programmiere das aus:
1
uint8_tchk_byte(charchkbyte){
2
if(chkbyte<30||chkbyte>128)
3
return0;
4
5
if(chkbyte==45)
6
return0;
7
8
if(chkbyte==90)
9
return0;
10
11
return1;
12
}
So kann ich auch nach 2 Jahren noch auf einen Blick sehen,
unter welchen Bedingungen eine Zahl den Test passieren kann.
:-O
Sorry es lag an der eigendlichen Auswertung, sowas aber auch... ;-)
1
if(chk_byte(ram_sp.runmode)!=0){
2
ram_sp.runmode=23;
3
}
nun nimmt man == 0 dann geht's... was nun auch logisch ist...
War das ja garnicht so falsch was man da gebraut hat...
Kann man das in der chk_byte funktion evtl. "drehen" ?
Gruß Tobi...
Ohh sehe gerade den Zusatz... ja ich denke das werde ich wohl auch
machen... ich teste das mal, das zuviel kürzen ist vlt. nicht immer
Sinnvoll...
TNX!
Bei mir funzt Tobis Code auch. Hat meiner Ansicht was mit 'Char' zu tun:
128 passt in nen signed char nich rein, in nen unsigned ja. Beim
Vergleich mit '128' läuft vermutlich was schief. Ob char default
unsigned oder signed ist läßt sich mit nem Compilerswitch manchmal
einstellen.
Cheers
Detlef
> Ob char default unsigned oder signed ist läßt sich mit nem> Compilerswitch manchmal einstellen.
Das verstellt man aber am besten nicht, sondern benutzt, wenn's drauf
ankommt, immer explizit entweder signed char oder unsigned char.
Rolf Magnus wrote:
>> Ob char default unsigned oder signed ist läßt sich mit nem>> Compilerswitch manchmal einstellen.>> Das verstellt man aber am besten nicht, sondern benutzt, wenn's drauf> ankommt, immer explizit entweder signed char oder unsigned char.
...und zumindest für "normale" Rechenvariablen besser (u)int8_t. Da
gibts nämlich keinen Compiler-Switch den man "versehentlich" verstellen
kann.