PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unsigned volatile long ??



Ali_Baba
04.03.2009, 00:01
Hallo,

kann es sein, dass es die Variable unsigned volatile long nicht gibt??

Wenn ich die Variable unsigned volatile long = 0 (in Tausenderschritten) hochzählen lasse kehrt sie sich bei + 32000 in den negativen Bereich.

Gibt's also diese Variable nur 'short' und nur 'signed' ??

In meiner Anwendung möchte ich die Sekunden eines Tages hochzählen (60*60*24 = 86400).

Danke!

Ali_Baba

SprinterSB
04.03.2009, 00:09
Möglicherweise

-- ist das nur ein Problem der Ausgabe (nimmt nur 16 Bit und stellt die signed dar)
-- verwendest du avr-gcc mit -mint8
-- int auf avr-gcc ist 16 Bit, möglicherweise ein Überlauf bei einem (impliziten) Typ-Konvertierung/Cast

Sicher

-- gibt unsigned volatile long = 0 einen Syntaxfehler, weil das alles Schlüsselworte in C sind und kein Bezeichner angegeben ist.

wkrug
04.03.2009, 09:04
Ich bin nun nicht wirklich der C Crack, aber müsste es nicht
volatile unsigned long int xyzvariable
heissen ?
Bei CodeVision wird damit eine 32Bit Variable mit Vorzeichen aufgemacht.

Gock
04.03.2009, 10:00
..Du meinsst ohne Vorzeichen, eben unsigned und ohne int. Genau!
volatile unsigned long Variable sollte eigentlich gehen, es geht aber auch volatile uint32_t Variable;
Ist vielleicht einfacher...
Gruß

Ali_Baba
04.03.2009, 11:56
Hallo,

unsigned volatile long = 0 ergibt keinen(!) Syntaxfehler. Das Programm arbeitet und rechnet mit der 'long-Variable' offenbar richtig und normal.

Es scheint wirklich ein Problem bei der Übernahme der Zahl in die LCD-Anzeige zu sein, da ja mit der Variable richtig gerechnet wird.

[itoa (test, buffer , 10);] buffer ist eine Char-"Variable" mit 10 Zeichen

Ich werde es nochmal genauer testen und melde mich wieder.

Danke, schon 'mal!!

Ali_Baba

@Sprinter: Deinen Alias-Namen hättest du wirklich nicht besser wählen können!! :-) Danke!!

Gock
04.03.2009, 12:29
unsigned volatile long = 0 ergibt keinen(!) Syntaxfehler. Das Programm arbeitet und rechnet mit der 'long-Variable' offenbar richtig und normal.
Ja aber mit welcher Variablen denn? Die hat doch gar keinen Namen. Wie soll denn das Programm dann richtig rechnen?
Es sei denn der Begriff "long " ist Deinem Compiler nicht bekannt bzw. reserviert und er nennt sie daher "long". Das ist aber äußerst unwahrscheinlich.
Ich würde zuerst diesen offensichtlichen Missstand beheben (auch wenn kein Fehler gemeldet wird) und dann weiter sehen.
Gruß

sast
04.03.2009, 12:48
int main(void)
{
unsigned volatile long = 0;
long += 1;
}


ergibt beim avr-gcc



test.c: In function 'main':
test.c:6: error: expected identifier or '(' before '=' token
test.c:7: error: expected identifier or '(' before '+=' token
make.exe: *** [test.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:01


Was für einen Compiler verwendest du denn, dass so etwas geht. Du solltest dir vielleicht mal die Schlüsselwörter für deinen Compiler ansehen.

oder hast du bloß vergessen unsigned volatile long test zu schreiben?

itoa sagt aber doch, dass du int in ascii wandeln willst gibts da nicht ltoa?
Ich verwende diese Funktionen eher selten, ist also nur ne Vermutung.

sast

Edit: hab ich gerade noch im Netz gefunden

Diese drei Funktionen wandeln eine Zahl vom angegebenen Format in einen String. Dabei erwartet ..
.. itoa() einen signed Integer (vorzeichenbehaftete Ganzzahl, 16Bit)
.. ltoa() einen long signed Integer (vorzeichenbehaftete Ganzzahl, 32Bit)
.. ultoa() einen long unsigned Integer (vorzeichenlose Ganzzahl, 32Bit)

war aber keine Referenz von z.B. avr-gcc

Ali_Baba
04.03.2009, 12:52
Sorry, bitte!!!

So wär's richtig gewesen und so steht's auch im Programm:

unsigned volatile long Pumpenzeit_Boden = 0;

Ali_Baba ](*,)

sast
04.03.2009, 12:57
dann versuche es doch mal mit ltoa oder ultoa

das würde auch die 32000 erklären, wenn da ein signed int gecastet wird

sast

Ali_Baba
04.03.2009, 21:31
Meine fehlerhafte Verwendung von itoa für long int Variablen war die Ursache für mein Problem:

unsigned volatile long test1 = 0;
unsigned volatile long test2 = 0;

test2 = test1 / 10;

-> dann wird die Ausgabe (LCD) negativ, wenn test1 größer als ca 32000 wird.
Trotzdem wird richtig gerechnet, denn die Ausgabe von test2 bleibt positiv.

Das heißt, der Überlauf findet erst statt, wenn itoa die Variable 'bearbeitet'

Danke für die Hilfe!!

Ali_Baba