- 12V Akku mit 280 Ah bauen         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 32

Thema: comparison is always true

  1. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Praxistest und DIY Projekte
    ...da ist kein Spielraum für andere Interpretationen.
    Ist leider doch. Wir wissen nicht wie sein uint8_t definiert ist...

    (..aber das ist eher theoretisch..)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #22
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von radbruch
    ...da ist kein Spielraum für andere Interpretationen.
    Ist leider doch. Wir wissen nicht wie sein uint8_t definiert ist...
    Doch, wissen wir. Durch die Warnung, denn die orientiert sich natürlich am tatsächlichen Datentyp, und nicht am Typ-Bezeichner.
    Dass bei ihm ein uint8_t versehentlich größer ist als 8 Bit, scheidet als Möglichkeit daher aus.
    MfG
    Stefan

  3. #23
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.05.2005
    Ort
    Berlin
    Beiträge
    212

    Nun ja,
    Knieschuß is auchn Treffer?
    Ihr habt Recht!
    Das lief alles in einer "while(1){}" Schleife.
    D.h. die ist wahrscheinlich garnicht zum Zuge gekommen,
    da die for Schleife nie beendet wurde.
    Ich hatte halt zum Test die Schleife auf <=254 gesetzt und dann noch ein paar Buchstaben
    in der while Schleife zur Ausgabe gebracht,
    dabei allerdings vergessen, die Schleife wieder zum Testen auf <=255 zu setzen.
    Ist mir wirklich unangenehm.
    'Tschuldigung.

    Gibts denn einen Vergleichsoperator, mit dem ich den vollen Wertebereich
    zum Zählen nutzen kann?
    ==255 ist doch auch Quatsch?

    p.s.
    Hab mir den Thread nochmal durchgelesen, bin noch ein bischen kleiner geworden
    und der Groschen ist laangsam gefallen:
    C ist schon vertrakter als Basic.
    Es wird also solange addiert, wie <= 255 wahr ist, also auch bei 255.
    und das ganze wird dann dank Überlauf zu 0 und wieder wahr.
    Was mich nach dieser Logik dann wundert ist, daß <255 halt nur bis 254 geht.
    Wenn 254 wahr ist, dann müßte doch auch noch eins addiert werden.
    Tuts aber nicht, wenn ich nicht schon wieder geschielt habe.

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Wie ich schon in meinem ersten Post geschrieben habe, hat jeder (?) AVR ein sogenanntes Register SREG.
    Darin gibt es einen Flag, der dir anzeigt, ob das Ergebnis der letzten Operation Null ist.
    Wobei ich noch nie mit diesen Flags direkt gearbeitet habe, demensprechend kann ich dir nicht sagen, ob das ganze funktioniert. Außerdem müsstest du dann den ersten Schleifendurchlauf abfangen.
    Am einfachsten ist es vermutlich, 254 durchläufe zu machen und dann den Code nochmal hintendran zu kopieren (auch wenn mir der Gedanke wehtut).
    Evtl. hat jemand noch ne bessere Idee.

    mfG
    Markus

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Warum nicht einfach ne ui16_t als Zählvariable? Das eine Byte mehr sollte im Speicher ja noch Platz haben.
    #ifndef MfG
    #define MfG

  6. #26
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von tholan
    Was mich nach dieser Logik dann wundert ist, daß <255 halt nur bis 254 geht.
    Wenn 254 wahr ist, dann müßte doch auch noch eins addiert werden.
    Tuts aber nicht, wenn ich nicht schon wieder geschielt habe.
    Doch, wird es. Da aber 255 die Bedingung nicht mehr erfüllt, wird mit dieser 255 der Inhalt der For-Schleife nicht mehr ausgeführt.
    Wenn du aber hinter der For-Schleife count testest, wird es dort 255 sein.

    Die Lösung deines Problems:
    Code:
    uint8_t count = 0;
    do {
        // tue etwas mit count von 0 - 255
    } while (++count);
    MfG
    Stefan

  7. #27
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.05.2005
    Ort
    Berlin
    Beiträge
    212
    Doch, wird es. Da aber 255 die Bedingung nicht mehr erfüllt, wird mit dieser 255 der Inhalt der For-Schleife nicht mehr ausgeführt.
    Wenn du aber hinter der For-Schleife count testest, wird es dort 255 sein.
    Also dieses C hat sich doch bestimmt mal ein Professor auf Pille ausgedacht .
    Irgendwie hats ja ne Logik. Da muß man aber erstmal drauf kommen.
    Ich glaub ich habs kapiert!
    Morgen, ähh Heute werd ichs in meinen Mega16 füttern.
    Habt vielen Dank,
    tholan

  8. #28
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Jaecko
    Warum nicht einfach ne ui16_t als Zählvariable? Das eine Byte mehr sollte im Speicher ja noch Platz haben.
    Weil 16-Bit Rechenoperationen mehr RAM und Rechenzeit brauchen.

    @tholan: Das ist in den meisten Programmiersprachen so. Und wenn du dir mal in irgend einem C-Buch eine ein Ablaufdiagramm der for-Schleife gesehen hast, stellst du fest, dass eben erst inkrementiert wird und dann geprüft.

    Die Lösung von sternst ist tatsächlich die schönste (warum bin ich da eigentlich nicht drauf gekommen???)

    mfG
    Markus

  9. #29
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Zitat Zitat von markusj
    Zitat Zitat von Jaecko
    Warum nicht einfach ne ui16_t als Zählvariable? Das eine Byte mehr sollte im Speicher ja noch Platz haben.
    Weil 16-Bit Rechenoperationen mehr RAM und Rechenzeit brauchen.
    Nur unwesentlich.
    Im ASM sinds nur ein paar Anweisungen mehr.


    Sternst hat die von Dir gesuchte Lösung bereits gepostet. Und das ist nicht die "schönste" Lösung, sondern die logische Alternative.
    Eine Fußschleife und keine Kopfschleife ist hier Deines Problems Lösung.

  10. #30
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    06.05.2005
    Ort
    Berlin
    Beiträge
    212
    Na, ich resümier nochmal:
    Was nicht in meinen Schädel wollte, ist, daß auf "true" getestet wird.
    Ich hab so intuitiv immer mit mir rumgeschleppt, daß in einer Schleife auf
    "false" getestet wird, bis "true" oder
    "gleich" erreicht wird, um die Abbruchbedingung zu liefern.
    Wenn man auf "true" testet, hat man logischerweise dieses Problem,
    da mindestens ein Element "false" sein muß um den Abbruch zu gewährleisten.
    Warum die "do while" Schleife funktioniert, sie fängt immerhin mit ner "falschen" Null an,
    frag ich nicht, weil ichs schon gefunden habe .
    Beim ersten Durchlauf wird hier wohl vor der ersten Addition nicht auf Wahrheit überprüft
    und somit rutscht die erste "0" mit durch, ohne die Schleife abzubrechen.
    Ob das nun schön ist, beurteile ich als Anfänger garnicht.
    Auf jeden Fall würde ich C nicht unbedingt "intuitiv" nennen.
    Ich hab ehrlich gesagt auch noch nicht probiert, was Bascom macht
    bei: "FOR N=0 TO 255" mit "DIM N AS BYTE" ..oder so.
    Der Thread war für mich wirklich sehr lehrreich.
    Ich muß mir mal ein gutes C Buch zulegen.
    thx,
    tholan

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen