Problem mit Variabel

Grüss Euch alle

Ich habe ein Problem mit einer Variabel (dessen Inhalt) und kann nicht nachvollziehen, warum das so ist.

Ich verwende zwei Variabeln:
int targetweight;
int progressbar;

Ich weise dem Wert targetweight einen Wert zu:

targetweight = 1500;

Für eine Progressbar berechne ich:

progressbar = round(weight*100/targetweight);

Nun das Problem: Das Resultat in Progressbar variiert je nach Fortschritt zwischen 0-20.

Das richtige Resultat erhalte ich nun wenn ich wie folgt berechne:

progressbar = round(weight*100/1500);

Was habe ich da übersehen ?!

Danke im voraus
mike

Filling_Blower.ino (8.77 KB)

Du solltest dir mal mehr Gedanken über deine Datentypen machen. Schau die die Wertebereiche verschiedener Typen an und verinnerliche diese

Wenn eine Zahl nur positiv sein kann dann verwende mindestens unsigned int statt int.

Berücksichtige welche Werte die Variablen maximal annehmen können und überprüfe ob das in den Datentyp der Berechnung passt. Dabei beachten, dass normal in int gerechnet. Da hat man schnell einen Überlauf. z.B. 200 * 100 = 20000 350 * 100 = 35000. Das ist schon zu groß für int

Und wenn du irgendwas / 1500 machst musst du nichts runden. Das ist eine Integer-Division

Serenifly:
z.B. 200 * 100 = 20000. Das ist schon zu groß für int

Das passt noch in int (32,767 max).

Gruß Tommy

Serenifly:
Dabei beachten, dass normal in int gerechnet. Da hat man schnell einen Überlauf. z.B. 200 * 100 = 20000. Das ist schon zu groß für int

Zu deinem Beispiel muss ich widersprechen, 20.000 ist noch innerhalb des int-Bereichs (ca. -/+32.700). :wink: :stuck_out_tongue:

Aber im Grunde hast du wohl recht und der TO rechnet über den int-Bereich hinaus, dazu sollte man aber wissen welchen Wert die Variable weight im Fehlerfall hat.

Ich habs auch mit Float und Real versucht. Selbes Resultat.

weighttarget hat nen maximalwert von 1500. Da müsste int kein Problem haben.

Es wirkt mir mehr als wäre weighttarget nicht "stabil" im Speicher. Obwohl ich keine Zuweisung mache, ändert sich dessen Wert, zumindest innerhalb der Schlaufe.

Gibts global - Definitionen für Android ?

Danke für Euren bisherigen Input

Mike

Grrr. Ok, dann 350 * 100 :stuck_out_tongue:
Vielleicht passt auch alles. Aber wenn man int als Datentyp für Dinge wie Gewichte und Zeiten sieht, heißt dass dass jemand nicht darüber nachgedacht hat.

Und oben steht auch das:

int productweight[]={958, 478};

Das lässt darauf schließen dass da vielleicht auch mal höhere Werte auftauchen

weighttarget hat nen maximalwert von 1500. Da müsste int kein Problem haben.

Es geht um die Multiplikationen davor.

targetweight selbst müsste aber immer 1500 sein

Hallo,

du unterschlägst die Variable weight.
Vor deiner Rechnung

//Progress
progressbar = round(weight*100/1500);

setzt du weight auf 0 und targetweight auf 1500, damit ist

while (weight<targetweight) {

immer gültig

und dann machst du vor deiner obigen Rechnung

weight = scale.get_units();

Was passiert hier mit weight?
Das ist die Antwort auf dein Problem.