Forum: Compiler & IDEs Arduino - long Variable nimmt nur Höchstwert einer int an!


von Stefan K. (stefan1919)


Lesenswert?

Hallo,
ich habe ein total simples Programm das nicht so macht wie ich mir das 
vorstelle:

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

void loop () {
    int Poti = 0;
    long verzoegerung;
    int Potiwert;
    Potiwert = analogRead(Poti);
    verzoegerung = Potiwert*1000;
    Serial.print("Poti: "); Serial.println(Potiwert);
    Serial.print("Verzoegerung: "); Serial.println(verzoegerung);
    delay (verzoegerung);
    }

Ich benutze: Arduino Mega 2560 V3 und Arduino IDE 1.0.5-r2


Das Problem ist dass die Variable "verzoegerung" die ich als long-Typ 
deklariert habe keinen Wert über 32768 annehmen möchte!

Also wenn ich das Poti einstelle dass "Potiwert" = 32 ist dann habe ich 
als "verzoegerung" = 32000 auf dem Serial-Monitor stehen und delay macht 
dann auch 32 Sekunden.
Wenn ich aber "Potiwert" = 33 einstelle dann ist "verzoegerung" = -32536
und bei "Potiwert" = 34 ist "verzoegerung" = -31536 ! Es wirkt so als 
wäre
"verzoegerung" immer noch eine int-Variable.

Ich hatte diesen Programmteil eigentlich in einer selber geschriebenen 
Library verwendet und dachte es liegt an einer fehlerhaften Deklaration 
aber als ich den Programmteil nochmal separat als neuer Sketch probiert 
habe fiel ich aus allen Wolken - das Problem ist immer noch vorhanden!

Das ist bestimmt nur ein Leichtsinnsfehler von mir aber ich mache jetzt 
schon einen kompletten Tag daran rum und komme einfach nicht auf die 
Lösung!

von Rene H. (Gast)


Lesenswert?

Vorab, ich kenne Arduino nicht, aber C++.

Hast du schon mal versucht, Potiwert auf long zu casten?

Also: (long)Potiwert*1000;

von Tom (Gast)


Lesenswert?

Potiwert ist ein int und 1000 ist auch ein int. Wenn man die beiden 
multipliziert, kommt erstmal ein int heraus, der natürlich überläuft. 
Danach erst wird das Ergebnis in Verzoegerung gespeichert.

von Stefan F. (Gast)


Lesenswert?

> int Potiwert;
> verzoegerung = Potiwert*1000;

Potiwert ist ein Integer.
1000 ist auch ein Integer (gilt für alle Zahlen, die nicht zu groß 
sind).

Integer * Integer ergibt einen Integer, weil ein Algorithmus verwendet 
wird, der nur Integer kann.

Du musst einen der beiden Operanden als Long Integer kennzeichnen. Am 
Einfachsten so:

verzoegerung = Potiwert * 1000L;

von Stefan K. (stefan1919)


Lesenswert?

:-) nee das glaube ich ja nicht - das hat geholfen! Danke!!
Das probiere ich jetzt gleich noch in meiner Library aus.

von Stefan K. (stefan1919)


Lesenswert?

Also in der Bibliothek funktioniert es jetzt auch! Ich hatte ja 
allesmögliche probiert aber auf die Idee mal andere oder alle Variablen 
auf long zu setzen kam ich nicht.
Danke euch drei für die schnelle und kompetente Hilfe!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es hätte auch genügt, die 1000 als „long“ zu schreiben: „1000L“.

Eine von beiden Seiten der Multiplikation muss halt mindestens long
sein, damit das Ergebnis es auch ist.

von Stefan F. (Gast)


Lesenswert?

> Es hätte auch genügt, die 1000 als „long“ zu schreiben: „1000L“.

Das hatte ich bereits vor zwei Wochen geschrieben 
(Beitrag "Re: Arduino - long Variable nimmt nur Höchstwert einer int an!"). 
Doppelt gemoppelt hält besser?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Doppelt gemoppelt hält besser?

Sorry, war mir entgangen.

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.