-         

Ergebnis 1 bis 10 von 10

Thema: unsigned volatile long ??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.05.2007
    Beiträge
    18

    unsigned volatile long ??

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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.
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    ..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ß

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.05.2007
    Beiträge
    18
    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!!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Zitat Zitat von Ali_Baba
    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ß

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Code:
    int main(void)
    {
    	unsigned volatile long = 0;
    	long += 1;
    }
    ergibt beim avr-gcc

    Code:
    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

    雅思特史特芬
    开发及研究

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    06.05.2007
    Beiträge
    18
    Sorry, bitte!!!

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

    unsigned volatile long Pumpenzeit_Boden = 0;

    Ali_Baba

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    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

    雅思特史特芬
    开发及研究

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    06.05.2007
    Beiträge
    18
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •