Bug?
Gunnar Bittersmann
- vb-script
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
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
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
Hallo,
Hi, warum geht die Schleife (*) rückwärts nicht?
Dim i As Byte
For i = 3 To 1 Step -1
NextEs 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
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
Hallo Gunnar,
Aber sollte dann nicht auch
Dim i As Byte
i = 3
i = i - 1den 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
Hallo Gunnar,
Aber sollte dann nicht auch
Dim i As Byte
i = 3
i = i - 1den 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
Hallo Axel,
Korrekt! ;-))
Wow - ich komme sogar lebend aus einem VB-Thread heraus. ;-)
Christian
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
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
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
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
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
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
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
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