Go Down

Topic: Tasterschaltung (Read 10446 times) previous topic - next topic

TelosNox

michael mir ist klar, dass meine Variante keinen wechselseitigen Ausschluss enthält, der war aber auch nicht explizit gefordert (zumindest hab ichs nicht so verstanden). Wenn man damit umgehen will, dass mehrere Taster zugleich gedrückt sein können und dann trotzdem nur einer Aktiv sein soll, dann muss man z.B. die Variante nehmen, die ich ganz am Anfang gepostet habe (eine Variable auf den aktiven Kanal setzen und die Variable dann auswerten).
Oder man arbeitet beim lesen der Pins mit XOR, um einen eindeutigen Kandidaten zu erhalten (da wirds aber mit steigender Anzahl der Taster schnell dreckig).

Code: [Select]

  Leds.Led01 = digitalRead(14);
  Leds.Led02 = digitalRead(15) ^ Leds.Led01;
  Leds.Led03 = digitalRead(16) ^ Leds.Led01 ^ Leds.Led02;
  Leds.Led04 = digitalRead(17) ^ Leds.Led01 ^ Leds.Led02 ^ Leds.Led03;


Sowas wird Mendel aber im Moment vermutlich maßlos überfordern.

Mendel13

ist "bool" die kurzform von "boolean" ?

TelosNox

Das ist die Syntax dafür und bedeuted boolean, ja. Wenn du boolean schreiben würdest, dann meckert der compiler.

combie

#33
Jun 24, 2015, 08:42 am Last Edit: Jun 24, 2015, 09:06 am by combie
Das ist die Syntax dafür und bedeuted boolean, ja. Wenn du boolean schreiben würdest, dann meckert der compiler.
Meiner nicht.
Und schaut man in die Tiefen, dann wird man sehen, dass boolean ein alias von bool ist.
Quote
Code: [Select]
typedef bool boolean;
In Arduino.h
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Serenifly

#34
Jun 24, 2015, 09:00 am Last Edit: Jun 24, 2015, 09:02 am by Serenifly
ist "bool" die kurzform von "boolean" ?
Jein.

Der C++ Datentyp ist bool. In der Arduino IDE hat man das wahrscheinlich boolean genannt damit es identisch zu Processing ist, was auf Java basiert und dort heißt es boolean.

Neuerdings ist es das gleiche. Seit ein neueren IDE Version ist boolean ein Alias (typedef) von bool. Das war leider nicht immer so. Am Anfang war das idiotischerweise ein Alias von unsigned char (was in C vor dem C99 Standard üblich war). Das heißt man konnte einem boolean einen Wert > 1 zuweisen und den hat er behalten. Das macht einen Unterschied wenn man einen boolean der > 1 ist mit true verglichen hat. Da das natürlich nicht wahr ist. Mit bool hat man dieses Problem nicht. Dem kann man auch Werte > 1 zuweisen und der Compiler korrigiert das automatisch.

Aber wenn du eine aktuelle Version hast ist bool wie gesagt identisch zu boolean.

TelosNox

Interessant, ich hatte compile Fehler wegen boolean (oder ich hatte bool keine Ahnung mehr) und nachdem ich es auf die andere Variante geändert hatte, ging es dann.
Allerdings benutze ich nicht die IDE, sondern Eclipse mit Plugin.
Vielleicht wars aber auch so, dass an der betreffenden Stelle die Arduino.h noch gar nicht includiert war. Das könnte es erklären.

Mendel13

verstehe ich richtig:
bool(ean)  setzt wie int eine variable, nur dass es keine ganzzahl ist (wie bei int +-32.schiessmichtot) sondern "nur" 1 oder 0 bzw. true / false ?

TelosNox

So ist es. Ein boolean ist ein reiner Wahrheitswert bzw. einfach ein Schalter mit "ein" und "aus".

Serenifly

#38
Jun 24, 2015, 01:34 pm Last Edit: Jun 24, 2015, 01:37 pm by Serenifly
Bei den neueren Arduino Versionen stimmt das.

Bei den alten stimmt es nur für bool, und boolean ist statt dessen nichts anderes als ein unsigned char (d.h. das gleiche wie byte).

Das wurde in 1.6.0rc2 geändert:
Quote
Arduino "boolean" type is now mapped to "bool" instead of "uint8_t" (Christopher Andrews)
Das ist vielleicht verwirrend. Aber der Unterschied ist da. Bei boolean als unsigned char statt bool, macht das nicht was man vielleicht denkt:
Code: [Select]

boolean var = 10;
if (var == true)
{
}

Das passt dagegen:
Code: [Select]

boolean var = 10;
if (var)
{
}


Das ist ein Grund weshalb ich vorher schon immer bool verwendet habe. Ab 1.6.0 trifft das wie gesagt nicht mehr zu. Das ist auch genau der Grund weshalb es geändert wurde.

Mendel13

ich bin verwirrt, sorry ...

Quote
So ist es. Ein boolean ist ein reiner Wahrheitswert bzw. einfach ein Schalter mit "ein" und "aus".
Quote
boolean var = 10;
???

Serenifly

Allgemein ist 0 false und alles was ungleich 0 ist true. Wenn man sowas macht:
Code: [Select]

if (var)

Das Problem ist jetzt dass wenn man == true oder == false schreibt, true da wirklich nur 1 ist.

Und es gibt Anwendungen wo man einem bool eine Zahl größer als 1 zuweist. Bei einem richtigen bool (oder ab 1.6.0 auch boolean) wird der Wert dann automatisch auf 1 gekürzt.

Das wird für dich nicht relevant sein, aber es gibt ein paar solcher Feinheiten wo man da schnell reinfällt. Für die meisten Anwendungen wird man da aber nur true/false oder HIGH/LOW zuweisen, welche nur 0/1 sind.


Oder kürzer:
Vor 1.6.0 gibt es einen feinen Unterschied zwischen bool und boolean. Ab 1.6.0 ist es das Gleiche.

Mendel13

"Allgemein ist 0 false und alles was ungleich 0 ist true."

so ists dann klar. verwirrung beseitigt.

agmue

Bin blutiger anfänger, was programmierung angeht. aber ich kämpfe mich durch!!
Spart vier Byte  :) ist aber auch deutlicher in der Aussage.
Steht ihr alle auf redundanten Code oder gehts um das einfachere Verständnis?
Ich habe mit meiner Bemerkung zum Sparen von Bytes versehendlich einen Wettbewerb ausgelöst. Das war nicht in meiner Absicht, auch wenn das Ergebnis (struct und XOR) für mich durchaus interessant geworden ist. Einem "blutigen Anfänger" nützt ein perfektes Programm nichts, wenn er weit davon entfernt ist, es zu verstehen. Den Fragesteller dort abzuholen, wo er steht, war mein Versuch.

Mir ging es um den Unterschied zwischen Konstanten und Variablen, sowie um die bewußte Wahl eines Variablentyps. Ignoriert man diesen Punkt, kann man schnell ins Stolpern geraten.

Mal sehen, was aus den "Radiotasten" wird.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

TelosNox

agmue daher fragte ich ja, ob die Beispiele wegen dem Verständnis redundant geschrieben sind.

Ich frage mich halt immer: Versuche ich dem Anfänger auch gleich ordentliches Coden beizubringen oder versuche ich es so verständlich wie nur möglich zu machen (auch wenn dann haufenweise redundanter Code entsteht).

Um Bytes sparen gehts mir übrigens nicht, lediglich um die Lesbarkeit (nicht gleichzusetzen mit Verständlichkeit) und die Wartbarkeit.

Ich denke Mendel muss jetzt erstmal ein wenig rumspielen, so lernt er am schnellsten und wenn dann die konkreten Fragen wieder auftauchen, wird er sich melden.

Mendel13

leute so wie ihrs macht ists ok. klar mach ichs umständlich ... speicherintensiv ... wenn ichs rennen lernen will muss ich erst lernen, die kackwindel -eine zeit notwendigen übels- wegzulassen ;-)

ich hab den code soweit fertig -redundant aber tut- , löte das zeugs grad auf lochraster.

werde ihn hier reinstellen und dann könnt ihr ihn ja zerreissen, bitte nicht mich  :smiley-confuse:

wie gesagt: trockene theorie ist gift für mich. aber anhand der praxis vertehe ichs. hm. bis jetzt wars zumindest so ...

ich werd noch ne gute zeit hier sein ... mir schwirrt eine pwm-pumpensteuerung mit drucksensor im kopp rum ... da kommt die tastersteuerung irgendwann auch dazu ... aber die tasten sind für mich ne gute einstiegsdroge.

dickes lob an euch. ihr geht gut respektvoll mit mir frischling um. ich hoffe auf nen stand zu kommen, bei dem ich nem anderen das "zurückbezahlen" kann. thx

Go Up