PB Beta11 Bug ?

Fragen und Bugreports zur PureBasic 4.0-Beta.
topsoft
Beiträge: 67
Registriert: 16.09.2004 11:55
Wohnort: nrw

PB Beta11 Bug ?

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
topsoft
Beiträge: 67
Registriert: 16.09.2004 11:55
Wohnort: nrw

Beitrag von topsoft »

Hallo,

schon klar. :) Wollte den Bug nur dokumentieren.

Gruß Topsoft
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

@topsoft:
It's not a bug, it's a feature!
Also by PB-Design.

Gruß
Spider
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
Zuletzt geändert von PureLust am 07.05.2006 01:20, insgesamt 2-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
1. Win10
PB6.1
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag 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
Gesperrt