Seite 1 von 3

PB Beta11 Bug ?

Verfasst: 05.05.2006 16:14
von topsoft
Das geht bei mir:

Code: Alles auswählen

Debug "es geht los"
For W.c = 1 To 126
  ;CallDebugger
  Select W
  Case 3
    Debug Str(W) + " 3"
  Case 6
    Debug Str(W) + " 6"
  Case 9
    Debug Str(W) + " 9"
  Default
    Debug Str(W) + " nicht 3,6,9"
  EndSelect
Next W
End
das nicht:

Code: Alles auswählen

Debug "es geht los"
For W.c = 1 To 127
  ;CallDebugger
  Select W
  Case 3
    Debug Str(W) + " 3"
  Case 6
    Debug Str(W) + " 6"
  Case 9
    Debug Str(W) + " 9"
  Default
    Debug Str(W) + " nicht 3,6,9"
  EndSelect
Next W
End
Gruß Topsoft

Verfasst: 05.05.2006 16:22
von MVXA
mh. Da hat sich Fred jetzt selbst wohin gebissen mit seiner sturren
Ansicht mit signed und unsigned Variablen. Ab 127 ist Char (Byte)
wieder -1. Somit geht die Schleife endlos weiter. Musste mit Long
arbeiten.

Verfasst: 05.05.2006 16:40
von topsoft
Hallo,

schon klar. :) Wollte den Bug nur dokumentieren.

Gruß Topsoft

Verfasst: 05.05.2006 18:15
von Exabot
@topsoft:
It's not a bug, it's a feature!
Also by PB-Design.

Gruß
Spider

Verfasst: 05.05.2006 22:24
von PureLust
MVXA hat geschrieben:Ab 127 ist Char (Byte)
wieder -1.
Da hab ich aber gerade einen kleinen Schock bekommen, da ich Char in meinen Libs für den RGB-Zugriff verwende !!! :o

Das Problem scheint jedoch (zum Glück?) nur bei Verwendung von Char als Zähler in einer For/Next Schleife so zu sein.

Wie in folgendem Beispiel zu sehen ist, funktioniert Char bei 'normaler' Verwendung wie gewohnt:

Code: Alles auswählen

For Z.l = 1 To 140
	a.c = Z
	b.c + 1
	c.b = Z
	d.b + 1
	Debug Str(a)+"  "+Str(b)+"  "+Str(c)+"  "+Str(d)
Next Z
Auch ist es so, dass wenn man als Zählervariable einen Char nimmt und als Endwert eine Zahl > 127, dann läuft die Schleife kein einziges mal durch.

Bsp: For Z.c = 1 To 140 läuft keinmal durch.

Es ist also wohl ein spezieller For/Next-Bug.

Verfasst: 05.05.2006 23:45
von ts-soft
>> Es ist also wohl ein spezieller For/Next-Bug.
Char ist ja auch kein uByte. Kann man wohl nicht erwarten, das es sich wie eins verhält?

Verfasst: 06.05.2006 13:01
von ullmann
Laut Hilfe ist der Byte-Wertebereich von -128 bis +127 definiert.

Und der Char-1-Byte-Wertebereich von 0 bis 255. Wo ist da der Unterschied zu uByte?

Ich sehe es ganz klar als Bug.

Rainer

Verfasst: 06.05.2006 17:01
von Kaeru Gaman
kann ich nur zustimmen.

wenn der wertebereich von Char als 0-255 dokumentiert ist,
muss es sich wie ein uByte verhalten, alles andere ist ein Fehler.

Verfasst: 06.05.2006 18:41
von Toshy
Hi.
Das läßt sich einfach erklären. das PB-Byte hat natürlich wie das Char auch einen "Wertebreich" der 256 "Zahlen/Werte" ermöglicht. Da es sich aber um ein vorzeichenbehaftetes Byte handelt kommt es zu dem Bereich -128 bis +127.
Das Char ist aber KEIN nummerischer Variablentyp, er dient NICHT zum rechnen. ein "Char" / "Character" ist eine "Zeichen" (wie die Zeichenkette eines Strings". Der Unterschied hierbei ist, das es sich um ein einziges Zeichen handelt, aber nicht zwangsweise nur um ein Byte. Ein Char kann auch z.B. 2 Bytes umfassen (Unicode).
Übrigens mal als Anmerkung, trotz meiner schlechten Englischkenntisse bedeutet "Character" im deutschen "Zeichen" :-)

Einen "String" kann man ja auch nur schlecht mit einem Long vergleichen.

Und noch was, du nimmst hier als Zähler NICHT einen Char, sondern du wandelst intern den Zahlenwert in ein "Stringzeichen" um, beim nächsten durchlauf wird interen der "String" wieder in eine Zahl umgewandelt, hochgezählt und zurückgewandelt. Da kannst du als "Zähler" auch gleich einen String nehmen. Das dies anscheinend funktionert, liegt daran, das sich Chars und Bytes von der Bytebelegung her nicht unterscheiden (solange keine Unicode). Und auch hier bleibt real der Zähler auch weiterhin das "Z" aus der Schleife. beim Char machst du nichts weiter, als das Zeichen, den Buchstaben, also die Bitfolge zu ändern. Oberflächlich das selbe, real aber was ganz anderes.

Als nochmal kurz gesagt:
"Char ist ein Textzeichen, KEIN nummerischer Wert"

[edit]
Daher müßte kompeliert als ASCII-Code

Zeichen.c = 255
Zeichen +1

gleich "0" (NULL) sein,
als Unicode kompeliert müßte

Zeichen.c = 255
Zeichen +1

allerdings das Ergebnis "256" ergeben.
Hier sieht man schon mal den Unterschied.

Gruß
Toshy

Verfasst: 07.05.2006 00:55
von ullmann
@Toshy

Das ganze Thema bezieht sich - erkennbar an allen obigen Beispielen - auf 1-Byte-Char, also nicht Unicode.

Und Char-1-Byte ist ein Wert (Wert! - nichts sonst) von 0 bis 255. Der Computer speichert alle Zeichen als Wert. "A" ist der Wert 65, "µ" ist der Wert 181. Und erst unter Verwendung von Pixeltabellen (Fonts) werden diese Werte in die Pixel (z.B. des "A") umgesetzt. Ich vermute, dass auch die Pixeltabellen nummerisch aufgebaut sind.

Wie wir ein Byte im Speicher interpretieren ist Definitionssache, es kann einen Assemblerbefehl darstellen, ein Zeichen, eine Zahl (mit oder ohne Vorzeichen), einen Farbwert etc.

Chars sind (wie alles andere im Computerspeicher auch) nummerische Werte, aber anders codiert als Zahlen. Deshalb kann man Strings nicht mit Longs gleichsetzen.

Aber Chars mit der Einschränkung ein Byte sind exakt so codiert, wie eine 1-Byte-Zahl ohne Vorzeichen, von 0 bis 255, also exakt so codiert wie ein uByte.

Und man kann sehr wohl mit Char rechnen:

Code: Alles auswählen

Define.c zeichen
zeichen=250
zeichen+1
Debug Str(zeichen)
Und ich bin mir sicher, dass die Eins direkt addiert wird und keine Umwandlung in "Bitfolgen" geschieht. Und wenn ich mit Char rechnen kann, erwarte ich auch das korrekte Zählen in einer For-Next-Schleife, oder wie einer oben genannt hat, als RGB-Farbteil, kurz mit den Eigenschaften als uByte.

Übrigens funktioniert Char in anderen Schleifen korrekt:

Code: Alles auswählen

Zeichen.c=0
While Zeichen<255 
  Debug Str(Zeichen)
  Zeichen+1
Wend
und

Code: Alles auswählen

Zeichen.c=0
Repeat
  Debug Str(Zeichen)
  Zeichen+1
Until Zeichen=255
Es wäre natürlich denkbar, dass Fred, um Operationen an ASCII-Codes zu ermöglichen, das Rechnen und Vergleichen mit Chars gestattet (deshalb würden die Rechnungen und While-Wend und Repeat-Until-Schleifen korrekt ausgeführt), aber ansonsten eine Interpretation als Char will und keine andere Interpretation gestattet (ein Char darf eben kein uByte-Zähler in einer For-Next-Schleife sein).

Diese Sichtweise wäre sehr eng gefasst, nutzerunfreundlich und im Widerspruch zu diesem Code, wo Chars als RGB-Werte korrekt funktionieren (im Unterschied zu Typ Byte .b):

Code: Alles auswählen

Define.c R1,G1,B1
Define.b R2,G2,B2
Debug Str(RGB(180,200,220)) ;Soll
R1=180:G1=200:B1=220
Debug Str(RGB(R1,G1,B1))    ;Ist, korrekte Ausgabe mit Char
R2=180:G2=200:B2=220
Debug Str(RGB(R2,G2,B2))    ;eine korrekte Ausgabe kommt nicht von selbst
Also ist es doch ein For-Next-Bug.

Rainer