Hallo Forengemeinde,
ich versuche eine Variable bei jedem Programmdurchlauf zwischen 1 und 0
hin und her zu wechseln.
while(1) {
Boolean = Boolean + 1
switch (Boolean)
{
case 0:
mache etwas
break;
case 1:
mache etwas anderes
break;
}
}
Jetzt lese ich jedoch hier:
http://rn-wissen.de/wiki/index.php/C-Tutorial#Boolean_.28Logische_Variablen.29
das es solche Wahrheitstypen nicht gibt.
Wie macht man es denn dann mit "int"? Kann mir das jemand bitte an einem
kleinen Beispiel mal zeigen?
MfG Paul
Die Antwort steht praktisch in dem Link, den du selber gepostet hast:
int a;
if (a) {printf("a ist TRUE")} // hat gleiche Wirkung wie
if (a!=0) {printf("a ist TRUE")}
Also: Integerausdruck = 0 ist FALSE
Integerausdruck !=0 ist TRUE
MfG Nils
Das Tutorial ist sehr alt oder bezieht sich auf veraltete¹ Compiler. bool gibt es schon länger in <stdbool.h> Wenn man bool will und der Compiler bool kann, sollte man bool nehmen, statt ein umständliches Ersatzkonstrukt zu bauen.
1 | #include <stdbool.h> |
2 | #include <stdio.h> |
3 | |
4 | int main(void) |
5 | {
|
6 | bool led_is_on = false; |
7 | for (int i = 0; i < 10; ++i) |
8 | {
|
9 | if (led_is_on) |
10 | {
|
11 | printf("an\n"); |
12 | }
|
13 | else
|
14 | {
|
15 | printf("aus\n"); |
16 | }
|
17 | led_is_on = !led_is_on; |
18 | }
|
19 | return 0; |
20 | }
|
¹gerade kommerzielle Embedded-Compiler brauchen ca. 20 Jahre länger als der Rest der Welt, um Sprachstandards umzusetzen.
int value = 0; ... value = 1 - value; // toggle value
led_is_on = !led_is_on war die Lösung die ich gesucht habe. Gerade als Anfänger hat man solch einfache Dinge nicht immer gleich auf parrat. Danke!
Tom schrieb: > Wenn man bool will und der Compiler bool kann, sollte man bool nehmen, > statt ein umständliches Ersatzkonstrukt zu bauen. Ja, vor allem weil so etwas: Paul schrieb: > while(1) { > Boolean = Boolean + 1 nicht nur nicht den gewünschten Effekt hat, sondern in Bälde einen Überlauf liefern wird.
Gerade mal "Überlauf" angeguckt - danke für den Tip
Paul schrieb: > led_is_on = !led_is_on Achtung! Der Tipp galt für boolean. Mit int geht das auch, ist aber unsauber: es wird einer Ganzzahl ein Wahrheitswert zugewiesen.
lrep schrieb: >> Boolean = Boolean + 1 > > nicht nur nicht den gewünschten Effekt hat, sondern in Bälde einen > Überlauf liefern wird. nein macht es nicht. In einer Rechnung liefert ein bool immer 0 oder 1 zurück. Damit bleibt es auf 1.
echter MSPler schrieb: > int value = 0; > ... > value = 1 - value; // toggle value LOL. Schuster, bleib bei deinem Leisten.
Marc V. schrieb: > echter MSPler schrieb: >> int value = 0; >> ... >> value = 1 - value; // toggle value > > LOL. > Schuster, bleib bei deinem Leisten. Was ist daran so verkehrt?
Hallo Paul, Paul schrieb: > ich versuche eine Variable bei jedem Programmdurchlauf zwischen 1 und 0 > hin und her zu wechseln.
1 | int a = 0; |
2 | |
3 | while(true) { |
4 | a = 1 - a; |
5 | }
|
HTH, Karl
jo mei schrieb: > Marc V. schrieb: >> echter MSPler schrieb: >>> int value = 0; >>> ... >>> value = 1 - value; // toggle value >> >> LOL. >> Schuster, bleib bei deinem Leisten. > > Was ist daran so verkehrt? Author.
echter MSPler schrieb: > ist aber > unsauber: es wird einer Ganzzahl ein Wahrheitswert zugewiesen. Wieso das? In C ist es klar definiert, dass !(ungleich 0) == 0 und 0! == 1 ist.
1 | int x = 0; |
2 | |
3 | while(1) |
4 | {
|
5 | x = ~x & 0x01 |
6 | }
|
du kannst mit ~ invertieren mit & kannst du dann maskieren Gruß
ich schrieb: > du kannst mit ~ invertieren > mit & kannst du dann maskieren braucht man aber nicht
1 | x = ~x |
reicht genauso.
jo mei schrieb: > Marc V. schrieb: > echter MSPler schrieb: > int value = 0; > ... > value = 1 - value; // toggle value > > LOL. > Schuster, bleib bei deinem Leisten. > > Was ist daran so verkehrt? Nix und sogar typsicher. Im Profibereich eine Standardlösung.
Peter II schrieb: > braucht man aber nicht > x = ~x Dann togglet aber jedes bit von x und nicht nur das LSB. Also z.B. 1 <--> -2 oder 0 <--> -1. So würde es aber gehen:
1 | int x = 0; |
2 | //…
|
3 | x ^= 1; |
c-hater-hater schrieb: > Peter II schrieb: > braucht man aber nicht > x = ~x > > Dann togglet aber jedes bit von x und nicht nur das LSB. Also z.B. 1 > <--> -2 oder 0 <--> -1. > So würde es aber gehen:int x = 0; > //… > x ^= 1; Nach Neandertallogik wäre es OK int x = O; ... x = ~x; Der gleiche Scheiss, den du hier schreibst.
Ein anderer Lösungsansatz wäre:
1 | #include <stdio.h> |
2 | |
3 | int main(void) { |
4 | int x,i; |
5 | x = 1; |
6 | for (i=0; i < 5; i++) |
7 | printf("%d ", x ^= 1); |
8 | return 0; |
9 | }
|
Du, als C Verächter, schreibst, alles ausser 0 ist true. Es spielt also keine Rolle, wieviel Bits gekippt werden. Ich schreibe: Nimm die typsichere Lösung. Geht immer, C, C++ und was sonst noch gefällt. Zahl = Zahl; Boll = Boll;
Hab ich da was verpasst? Will der TE jetzt nicht mehr zwischen 0 und 1 togglen? Das mit dem XOR 1 sollte auf jeden Fall funktionieren, bei Bool (falls Boll == Bool) und auch bei int. Gleich wie var = !var; was IMHO die beste Lösung ist.
Ihm gehts um Bool, darum funktioniert das in den verschiedenen Varianten. Man sollte aber trotzdem Zahlen und Logik trennen, typischer programmieren. Aber das ist wohl eher ein Problem der Profis. ;-)
echter MSPler schrieb: > Du, als C Verächter, schreibst, alles ausser 0 ist true. Es spielt also > keine Rolle, wieviel Bits gekippt werden. So ist es definiert, überall. Nur Null ist false, alles andere ist true. Somit ist: false = 0; true = !false; oder: true <> false; Schuster, bleib bei deinem Leisten.
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.