Gunnar Bittersmann: Bug?

Hi, warum geht die Schleife (*) rückwärts nicht?

Dim i As Byte
For i = 3 To 1 Step -1
Next

Es kommt die Fehlermeldung "Überlauf".
(Es geht mit Dim i As Integer)

Es geht das Hochzählen:

Dim i As Byte
For i = 1 To 3
Next

Es geht aber auch

Dim i As Byte
i = 3
i = i - 1
i = i - 1
i = i - 1

i darf halt nur nicht negativ werden (als Byte).
Wird's aber auch in der Schleife (*) nicht.

Also warum macht er das nicht? Ist es ein Bug im Compiler?
Gunnar

  1. Halihallo Gunnar

    Dim i As Byte
    For i = 3 To 1 Step -1
    Next

    Versuche mal

    For i = 3 To 1 Step 1

    oder

    For i = 1 To 3 Step -1

    ist etwas dialektabhängig (keine Ahnung, wie es in VB implementiert ist). Evtl. mit
    While/Wend arbeiten, wenn dein Dialekt keine "rückwärtslaufenden" For's kennt.

    Es kommt die Fehlermeldung "Überlauf".

    Mach in die For-Schleife eine Print Anweisung, welche das aktuelle i ausgibt. Das wird
    dir ungemein helfen!

    Wird's aber auch in der Schleife (*) nicht.

    print!

    Also warum macht er das nicht? Ist es ein Bug im Compiler?

    kaum.

    Viele Grüsse

    Philipp

  2. Hi, hallo

    wenn dir die Verwendung des Datentyp Byte nicht sooooo wichtig ist, umgehe das Problem doch durch die Verwendung von Integer :-)

    Was sagt die Doku von VBS zu dem Unterschied zwischen Byte und Integer?

    Tschau, tschüß,
    Frank

  3. Hallo,

    Hi, warum geht die Schleife (*) rückwärts nicht?

    Dim i As Byte
    For i = 3 To 1 Step -1
    Next

    Es kommt die Fehlermeldung "Überlauf".
    (Es geht mit Dim i As Integer)

    Weil es keine negative Bytes gibt? Die Angabe hinter Step hat den selben Typ wie die Laufvariable in FOR - NEXT.

    viele Grüße

    Axel

    1. Weil es keine negative Bytes gibt? Die Angabe hinter Step hat den selben Typ wie die Laufvariable in FOR - NEXT.

      An sowas dachte ich auch schon.

      Aber sollte dann nicht auch

      Dim i As Byte
      i = 3
      i = i - 1

      den Fehler liefern?

      Gunnar

      1. Hallo Gunnar,

        Aber sollte dann nicht auch

        Dim i As Byte
        i = 3
        i = i - 1

        den Fehler liefern?

        Nein, denn hier subtrahierst Du ja von einer Variable eine Zahl, Du verknüpfst sie (»i« und »1«) also mit einem Operator (»-«). Dagegen ist bei »Step -1« die Zahl selbst »-1«, beim anderen Fall ist sie normal »1«.

        Christian

        --
        Hast Du einen Beitrag? Nur her damit!
        http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
        SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
        sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
        1. Hallo Gunnar,

          Aber sollte dann nicht auch

          Dim i As Byte
          i = 3
          i = i - 1

          den Fehler liefern?

          Nein, denn hier subtrahierst Du ja von einer Variable eine Zahl, Du verknüpfst sie (»i« und »1«) also mit einem Operator (»-«). Dagegen ist bei »Step -1« die Zahl selbst »-1«, beim anderen Fall ist sie normal »1«.

          Korrekt! ;-))

          Den Fehler reproduzierst Du so:

          Dim i As Byte
          i = -1

          viele Grüße

          Axel

          1. Hallo Axel,

            Korrekt! ;-))

            Wow - ich komme sogar lebend aus einem VB-Thread heraus. ;-)

            Christian

            --
            Hast Du einen Beitrag? Nur her damit!
            http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
            SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
            sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
            1. Hallo Christian,

              Wow - ich komme sogar lebend aus einem VB-Thread heraus. ;-)

              Naja, das war ja doch wohl eher Grundlagen der Programmierung. Negative Bytes gibt's ja wohl in keiner Programmiersprache. - Obwohl - Ich erinnere mich an eine Diskussion hier, mit Christoph Zurnieden, da ging es darum, dass ein Byte nicht immer 8 Bit haben sollte (Das habe ich mittlerweile eingesehen.) und im Prinzip eine unendliche Informationsmenge speichern kann ;-))

              Hallo Christoph Zurnieden!!
              Wären in Quantensystemen negative Bytes vorstellbar?

              viele Grüße

              Axel

              1. Hi Axel,

                Naja, das war ja doch wohl eher Grundlagen der Programmierung. Negative Bytes gibt's ja wohl in keiner Programmiersprache.

                hmm... ein signed short in C zählt nicht? ;-) Okay, es heißt nicht Byte, aber das gibt's halt nicht in C/C++.

                Gruß,
                Martin

                1. Hi Martin,

                  Naja, das war ja doch wohl eher Grundlagen der Programmierung. Negative Bytes gibt's ja wohl in keiner Programmiersprache.

                  hmm... ein signed short in C zählt nicht? ;-) Okay, es heißt nicht Byte, aber das gibt's halt nicht in C/C++.

                  Du meinst ein signed char? Wertebereich: -128 bis 127 in 8 bit. Das würde gehen ;-))

                  Ein short ist ein 16-bit-Integer-Typ. So viel Speicher wollte der Ur-Poster ja nicht verschwenden ;-))

                  viele Grüße

                  Axel

                  1. Hi Axel,

                    Ein short ist ein 16-bit-Integer-Typ. So viel Speicher wollte der Ur-Poster ja nicht verschwenden ;-))

                    Oops. Das kommt davon, dass ich in den letzten Monaten Java machen muss :-(

                    Gruß,
                    Martin

        2. Nein, denn hier subtrahierst Du ja von einer Variable eine Zahl, Du verknüpfst sie (»i« und »1«) also mit einem Operator (»-«). Dagegen ist bei »Step -1« die Zahl selbst »-1«, beim anderen Fall ist sie normal »1«.

          Dim i As Byte
          i = 3
          i = i + (-1)

          Sollte mich das nun überraschen, dass das keinen Fehler liefert?
          Bei dieser Addition wird offenbar nicht versucht, die -1 in den Typ Byte umzuwandeln.

          Aber ist diese Addition nicht genau das, was nach jedem Schleifendurchlauf mit der Zählervariablen i (bei Step -1) passiert?

          Aber wahrscheinlich werden Schleifen etwas anders gehandhabt und die Schrittweite wirklich in den Typen der Zählervariablen konvertiert.

          Muss man halt bei negativer Schrittweite enormen Speicherplatz verschwenden. ;-)

          Danke Euch,
          Gunnar

          1. Hallo Gunnar,

            Dim i As Byte
            i = 3
            i = i + (-1)

            Sollte mich das nun überraschen, dass das keinen Fehler liefert?
            Bei dieser Addition wird offenbar nicht versucht, die -1 in den Typ Byte umzuwandeln.
            Aber ist diese Addition nicht genau das, was nach jedem Schleifendurchlauf mit der Zählervariablen i (bei Step -1) passiert?

            Nein. Für den Wert Step wird im Arbeitsspeicher genau soviel Platz reserviert, wie für die Laufvariable. Und in diesen Platz (Byte) geht eben der Wert (-1) nicht hinein. Daraus folgt - Überlauf. Du kannst durchaus einen Byte-Wert mit dem Integer-Wert (-1) verrechnen, solange der Byte-Wert dabei im Bereich 0 - 255 bleibt.

            Probiers so:

            Sub test()
             Dim i As Byte
             i = 3
             Do While i > 0
               MsgBox (i)
               i = i - 1
             Loop
            End Sub

            viele Grüße

            Axel

    2. Halihallo Axel

      Es kommt die Fehlermeldung "Überlauf".
      (Es geht mit Dim i As Integer)
      Weil es keine negative Bytes gibt? Die Angabe hinter Step hat den selben Typ wie die Laufvariable in FOR - NEXT.

      Sprich:

      FOR i=3 TO 1 STEP 1

      sollte funktionieren?

      Wäre IMHO auch logisch aufgrund einer Argumentation, die ich in meinem Posting vergass:

      "To" impliziert bereits die "Richtung" in die gezählt wird. Es braucht also gar keine
      negativen Steps zu geben, ist IMHO ein logischer Fehler in einigen Basic-Dialekten...

      Viele Grüsse

      Philipp

      1. Hallo Philipp

        Sprich:

        FOR i=3 TO 1 STEP 1

        sollte funktionieren?

        Nein. Diese Schleife wird gar nicht gestartet.
        VB-Hilfe:

        For...Next-Anweisung

        Syntax

        For Zähler = Anfang To Ende [Step Schritt]
          [Anweisungen]
          [Exit For]
          [Anweisungen]
        Next [Zähler]

        Die Syntax für die ForNext-Anweisung besteht aus folgenden Teilen:

        Teil          Beschreibung
        Zähler        Erforderlich. Numerische Variable, die als
                      Schleifenzähler dient. Eine boolesche Variable oder
                      ein Element eines Datenfeldes ist nicht zulässig.
        Anfang        Erforderlich. Startwert von Zähler.
        Ende          Erforderlich. Endwert von Zähler.
        Schritt       Optional. Betrag, um den Zähler bei jedem
                      Schleifendurchlauf verändert wird. Falls kein Wert
                      angegeben wird, ist die Voreinstellung für Schritt
                      eins.
        Anweisungen   Optional. Eine oder mehrere Anweisungen zwischen For
                      und Next, die so oft wie angegeben ausgeführt werden.

        Bemerkungen

        Das Argument Schritt ist entweder positiv oder negativ. Der Wert des Arguments Schritt legt die Schleifenausführung folgendermaßen fest:

        Wert              Schleifenausführung, wenn
        Positiv oder 0    Zähler <= Ende
        Negativ           Zähler >= Ende

        viele Grüße

        Axel