Forum: Mikrocontroller und Digitale Elektronik Anfänger: Wert bei jedem Durchlauf zwischen 0 und 1 hin und her wechseln


von Paul (Gast)


Lesenswert?

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

von Nils (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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.

von echter MSPler (Gast)


Lesenswert?

int value = 0;
...
value = 1 - value;  // toggle value

von Paul (Gast)


Lesenswert?

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!

von lrep (Gast)


Lesenswert?

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.

von Paul (Gast)


Lesenswert?

Gerade mal "Überlauf" angeguckt - danke für den Tip

von echter MSPler (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

echter MSPler schrieb:
> int value = 0;
> ...
> value = 1 - value;  // toggle value

 LOL.
 Schuster, bleib bei deinem Leisten.

von jo mei (Gast)


Lesenswert?

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?

von Karl Käfer (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von c-hater-hater (Gast)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

1
int x = 0;
2
3
while(1)
4
{
5
    x = ~x & 0x01
6
}

du kannst mit ~ invertieren
mit & kannst du dann maskieren

Gruß

von Peter II (Gast)


Lesenswert?

ich schrieb:
> du kannst mit ~ invertieren
> mit & kannst du dann maskieren

braucht man aber nicht
1
x = ~x

reicht genauso.

von echter MSPler (Gast)


Lesenswert?

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.

von c-hater-hater (Gast)


Lesenswert?

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;

von echter MSPler (Gast)


Lesenswert?

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.

von OldMan (Gast)


Lesenswert?

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
}

von c-hater-hater (Gast)


Lesenswert?

echter MSPler schrieb:
>> x ^= 1;
>
> Nach Neandertallogik wäre es OK

Kannst du das mal erklären?

von echter MSPler (Gast)


Lesenswert?

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;

von c-hater-hater (Gast)


Lesenswert?

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.

von echter MSPler (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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