Selbstbau eines Tonbandgerätes
#51
In der ersten if-Zeile (Keine Warnung) wertet er das (c = 'x') gar nicht mehr aus, weil das (i <= 3) schon true ist.
VG Jürgen
Zitieren
#52
Ja, stimmt schon. Aber es gibt auch keinerlei Compiler-Warnung, wenn das insofern korrekt ist. Habe mal ein sehr überschaubares Beispiel gemacht, das genau dem Fehler entspricht, der mich soviel Zeit gekostet hat. (Nur dass die Eingabe natürlich nicht schön deutlich über die Eingabe, sondern irgendwie in den Sensoren kamt)

Code:
char c = 'a';
int i = 0;

void setup() {
  Serial.begin (9600);
}

void loop () {
  if (Serial.available()) {
    c = Serial.read ();
    Serial.println (c);
  }
  if ((c = 'x') && (i % 2 ))   // keine Warnung!!
    Serial.println ("hier"); 
  else
    Serial.println ("nicht");
  i += 1;
  delay (1000);
}
Egal, was man eingibt, es kommt immer abwechselnd "hier" und "nicht", der erste Teil der zusammengesetzten Bedingung ist immer wahr.
Für mich als alten Pascal-Fan wäre das eine Gelegenheit, mal über diese Kaugummi-Typisierung von C bzw C++ herzuziehen - verkneife mir das jetzt. Nur das: Warum kein explizites Type-Cast, wenn man es haben will?

Na egal, ich habs ja gefunden, und erstaunlich ist doch, welche Themen noch alle an so einer Bandmaschine dranhängen.

Hier läuft gerade zum 3. Mal ein Band insgesamt mit Bandzugregelung durch. Nachdem ich die Regelspannung (sprich den pwm-Wert) über einen "gleitenden Durchschnitt", z.Zt. über 3 Umdrehungen, laufen lasse, bleibt auch der Bandzughebel sehr schön ruhig und gleichmäßig, ohne diese Software-Dämpfung zappelt er in bestimmten Bereichen ganz schön herum. Klar, eine schöne schwingfähige Angelegenheit aus Motormasse und Federspannung des Bandzughebels. Vielleicht mache ich davon noch ein Diagramm und bringe es hier. So etwas sind jedenfalls für mich produktive Fehler und nicht so blöde Syntax-Geschichten.

Nebenbei mal die Kühlkörper-Temperatur bei diesem Dauerlauf gemessen. Die liegt bei bescheidenen 45 °C, da brauche ich mir darüber jedenfalls keine Sorgen zu machen.

Ansonsten -
MfG
Selbstbauer
Zitieren
#53
Ich schweife mal ab vom Threadtitel - ist ja auch nicht das erste Mal im Forum  Wink

(12.11.2020, 16:52)JUM schrieb: In der ersten if-Zeile (Keine Warnung) wertet er das (c = 'x') gar nicht mehr aus, weil das (i <= 3) schon true ist.

Das ist so nicht richtig.
In
Code:
...
i = 3;
...
if ((c = 'x') && (i <= 3))

steht ja ein && in der Mitte, d.h. beide einzelnen Teile müssen TRUE sein.

"TRUE" in C ist - wenn ein Wert zur bool'schen Auswertung direkt her genommen wird - alles was >0 ist.

Linker Teil:
Nach der Zuweisung c = 'x' steht in c der Integer-Wert 120dez und damit ein Wert >0, somit ist der erste Teil des log. "UND" == TRUE.

Rechter Teil:
Nach der Zuweisung i = 3 ist der rechte Teil des UND immer TRUE.

Somit ist defacto das ganze "If" immer TRUE
Code:
if (TRUE)
 hätte das gleiche bewirkt  Tongue

Schreibt man bspw
Code:
...
i = 3;
...
if ((c = 0) && (i <= 3))
und weißt c also den Integer-Wert 0dez zu, dann wird (c = 0) konstant gleich FALSE und damit das ganze UND nie TRUE.

@Selbstbauer:
Schmeißt Dein Compiler eine Warning oder einen Error ?
Und welchen genau ?
Gruß, Kuni
..............................

http://kuni.bplaced.net/
..............................
Zitieren
#54
Stimmt, Kuni, das && habe ich übersehen.
VG Jürgen
Zitieren
#55
Ich für meinen Teil würde für Neuentwicklung den Teensy4.1 verwenden. Der hat mehr Speicher.
Bei den nächsten Wahlen wähle ich die NSA, denn die sind die einzigen die sich um mich kümmern.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste