Klammern richtig in vergleich abfrage von Variablen setzten

Hallo zusammen,

bin der Werner und 63 Jahre alt und habe aktuell grade echts ein Brett vor dem Kopf.

Es geht darum das ich ein bestehendes Programm auf meine Bedürfnisse umbaue muss und da ist ein Punkt an dem sich alles aufhängt,

ich komme mit diesem Klammern Salt einfach nicht vorwärts denn Klammerrechnen hab ich mal ganz anders gelernt und auch unter Basic angewandt, leider komme ich nur alle 6 Monate mal dazu was zu schreiben und das gestaltet sich normalerweise nicht so kompliziert.

Ich verstehe einfach nicht den Sinn der Klammersetzung !

Die Rechnung ist allerdings ganz einfach, am Ende benötige ich ein (*true+) oder ein (false) um mit ( If ) und ( else ) weiter machen zu können.

Ich hab die Original Zeile drin gelassen welche ich allerdings um die Variable rssiC erweitern muss, hier gelistet ist nur der letzte versuch das ding anzupassen, ich hab mehrere Varianten erfolglos durchgespielt.

Das sketch mal als Text weil ich noch nichts hochladen darf, ich bruch jetzt echt Schützenhilfe.

Gruß

Werner

//##################################################################
void setup() {
// put your setup code here, to run once:
Serial.begin (19200);
//
int rssiA = 50;
int rssiB = 50;
int rssiC = 50;
int DIVERSITY_CUTOVER = 5;

// if((int)abs((float)(((float)rssiA - (float)rssiB) / (float)rssiB) * 100.0) >= DIVERSITY_CUTOVER) // ## Orginal ##

if((int)abs((float)((float)rssiA - (((float)rssiB) / (float)rssiB))-((float)rssiC) / (float)rssiC))) * 100.0) >= DIVERSITY_CUTOVER)
{
Serial.print (" ungleich ");
}
else{
Serial.print (" alle gleich ");
}
}

void loop() {
// put your main code here, to run repeatedly:

}

//###################################################################

Du darfst schon hochladen :wink: in der IDE auf Bearbeiten, Für Forum kopieren , hier einfügen :wink:

Danke für den Hinweis.. ich bin nicht mehr so fit und war es auch nie wirklich richtig. das ist alles Learning by doing... und manchmal verfluche ich auch die Arduino IDE..

Ich werde mir das mal zu Gemüte führen allerdings war die Aussage eine ganz klare !

" Entschuldige, neue Benutzer dürfen keine Anhänge hochladen."

Test:

void setup() {
  // put your setup code here, to run once:
Serial.begin (19200);
//
int rssiA = 50;
int rssiB = 50;
int rssiC = 50;
int DIVERSITY_CUTOVER = 5;

//    if((int)abs((float)(((float)rssiA - (float)rssiB) / (float)rssiB) * 100.0) >= DIVERSITY_CUTOVER) // ## Orginal ##  

if((int)abs((float)((float)rssiA - (((float)rssiB) / (float)rssiB))-((float)rssiC) / (float)rssiC))) * 100.0) >= DIVERSITY_CUTOVER)
{
Serial.print (" ungleich ");
}
else{
Serial.print (" alle gleich ");
}

}

void loop() {
  // put your main code here, to run repeatedly:

}

Nicht Anhang.
Wenn Du einen Beitrag verfasst, dann in der IDE BEARBEITEN - FÜR FORUM KOPIEREN und dann mit der Maus in den Post geklickt und mit der rechten Maustaste einfügen oder mit Strg-V
Geht auch bei neuen Usern :slight_smile:

du sollst keine Anhänge hochladen, sondern den Code mit Code Tags hier einfühgen.

Nicht als Anhang nur dein Sketch (Programm) hier einfügen

Ok.. habs geschnallt.. Danke !!!! :rofl:

Manchmal hilft ein C++ Buch.
Gerade auch bei der Operatorenrangfolge.
Auch das Casting wird dort beschrieben.

Wer sowas schreibt, hat 1 Monat auf einer Streckbank seiner Wahl verdient.

Mir reichen die 2 Tage die ich damit zugebracht habe das ding anpassen zu wollen.. ich bin einfach zu alt für sowas und im Zeitalter von Foren sollte es doch möglich sein schnell eine Abhilfe zu bekommen.

Das in der Formel was nicht stimmt ist mir schon klar. es war nur ein weiter unnützer versuch.

Vielleicht schreibst Du die Formel erst mal ohne die ganzen float Casts... Wenn die wirklich notwendig sein sollten (warum auch immer), kannst Du die als Letztes einfügen.

In deinem Beispiel fehlt zumindest mal die "{" Klammer der If Bedingung.

Möchtest du!

Wir sind keine Erfüllungsgehilfen, die man jederzeit ausnutzen kann.
Hilfe zur Selbsthilfe gibts hier.

Auch wenn dir das nicht klar ist, kein Mensch sieht/weiß, was das Dingen tun soll.

Hab ich mir auch schon überlegt weil ich das mal überhaupt nicht verstehe das man den aufwand betreibt zumal man vorher alle Werte mit zb. map´t :

rssiA = map(rssiA, rssi_min_a, rssi_max_a , 1, 100); // scale from 1..100%

also über 100 wird der Inhalt nie gehen.

man könnte also auch ohne das ganze drum herum den vergleich realisieren.. aber naja.. ich hab das nicht geschrieben

Hab ich doch im Eingangspost geschrieben was sinn und zweck ist.

Das ist richtig, aber die Divisionen sind Dein Problem.
Im Gegensatz zu einer Tabellkalkulation oder einem Taschenrechner wird ohne explizite Angabe immer mit ganzen Zahlen gerechnet. Alle Deine Nachkommastellen würden also unter den Tisch fallen.
Dafür ist das casten auf float gedacht.
Man könnte natürlich auch die drei Zahlen von vornherein schon als float einplanen udn hätte den ganzen Unfug nicht.
Könnte dann so aussehen:

void setup()
{
  // put your setup code here, to run once:
  Serial.begin (19200);
  //
  float rssiA = 50.0;
  float rssiB = 50.0;
  float rssiC = 50.0;
  int DIVERSITY_CUTOVER = 5;
  //    if((int)abs((float)(((float)rssiA - (float)rssiB) / (float)rssiB) * 100.0) >= DIVERSITY_CUTOVER) // ## Orginal ##
  if (abs((rssiA - rssiB / rssiB - rssiC / rssiC) * 100.0) >= DIVERSITY_CUTOVER)
  {
    Serial.print (" ungleich ");
  }
  else
  {
    Serial.print (" alle gleich ");
  }
}

void loop()
{
  // put your main code here, to run repeatedly:
}

Da ich nicht weiss, was die Formel machen soll, nur auf gut glück.
Klammer vor Punktrechnung vor Strichrechnung.
Mach was draus.

1 Like

Guter Ansatz.. müsste ich mal schauen ob das zum Rest von Programm passt

Danke

Die "original" Rechenvorschrift könnte man schon auf folgendes verkürzen:

abs( ( (rssiA - rssiB) / static_cast<float>(rssiB) ) ) * 100.0

wenn also z.B. rssiA = 49 ist und rssiB = 50 so wird
rssiA - rssiB = -1 ergeben
Das durch rssiB wird -0,002 ergeben
und * 100.0 im abs() ergibt 2

So geht bei der Division der Nachkommateil nicht verloren...

Wie das jetzt aber auf die dritte Komponente rssiC noch aufgebohrt werden soll ist mir nicht klar...

Ich hab die drei Variablen die gemappt sind. sollte rssiA 5 % ( DIVERSITY_CUTOVER) unterschreiten soll das ( if ) zum Einsatz kommen, ansonsten wird keine Zustandsänderung eingeleitet im Programm.

Ich verstehe es überhaupt nicht.. den ich komme mit den Klammern nicht klar.. die Prozedur ist für mich LOGISCH und sie funktioniert ja auch unter Verwendung von der Original Zeile die ich drin belassen habe.

Die Klammern sind auch logisch....

((rssiA - rssiB) / rssiB) * 100.0;
((rssiA - rssiB) / static_cast<float>( rssiB ) ) * 100.0;
abs( ((rssiA - rssiB) / static_cast( rssiB ) ) ) * 100.0;

@Kai-R

ich glaube ich mach da an besten eine separate abfrage von rssiC.. wäre noch das einfachste.. allerdings hab ich im Flash nur noch 150 byte frei und ich bin noch nicht fertig mit dem umschreiben.