PB Beta11 Bug ?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Das stimmt so nicht. Klar, alles besteht aus "Nullen und Einsen", aber Chars sind nun mal nicht als nummerische Variablen gedacht, sie sind für die (Text-)-Zeicheverarbeitung gedacht. Je nach sprache gibt es sogar manchmal gar nicht die bezeichnung String, sondern nur Char.

Und wenn du danach gehst das Char genau wie eine "unsigned" Bytevariable ist, dann muß du aber dazu sagen, das eine "unsigned" auch genau so aufgebaut ist wie eine "signed". Normalerweise gibt es dort im Byteaufbau keinen Unterschied. nur die Interpretation durch Funktionen ist unterschiedlich.
Dann kannst du auch genau so zahl.s nehmen, Strings sind in den meißten fällen so gesehen auch nichts weiter als "zahlen Variabelen", nur halt 4 Byte lang als Pointer. Theoretisch kann man auch rechnen, aber machne Dinge sind halt aus einem ganz bestimmten Grund für bestimmte Dinge gedacht.
Wenn man also mit einem Char wirklich "rechnen will", geht das zwar an sich, ist aber dafür einfach nicht gedacht.

Ich nutze auch in einigen Fällen so eine Krücke, da aber mit Sinn. Zum Beispiel kopiere ich Floats in Longs und umgekehrt. Allerdings mache ich das als Speicherkopie. Dadurch kann ich beim hin und her kopieren mit "in Longs versteckten Floats" die Nutzung der FPU umgehen (um die FPU so für anders freizuhalten). Das hat jetzt zwar nicht mit dem "Charproblem" direkt zu tun, aber auch hier kann man Dinge für was nutzen, wofür sie nicht gedacht sind. Wenn damit aber bestimmte Dinge nicht nutzbar sind (hier bei mir direkt mit den Longs rechnen), dann darf m an sich nicht beschweren.

Und man muß sehr wohl beachten das es auch Unicode gibt. Zwar willst du es vielleicht nicht nutzen, aber an Unicode (ist ja keine PB-Angelegenheit, sondern eine vom Betriebssystem) müßtest du doch erkennen, das Char NICHT in "verkapptes" uByte ist. Alle nummerischen Variablen behalten immer ihre Länge, egal in welchem Betriebssystem bzw. wie kompeliert, Zeichenvariablen nicht.

Kurz gesagt, man kann alles, so auch Char zum Rechnen nehmen, aber das ist halt nicht korrekt.

Das Thema bezieht sich also nicht einfach nur auf das 1-Byte-Char, sondern auf den Verständnisfehler was ein Char ist und wozu er dient.
Char ist genau so unterschiedlich zu nummerischen Variablen wie Longs,Bytes, wie auch diese unterschiedlich zu Floats und Doubles sind.

uByte, sByte, Char (Ascii), Memory (1-Byte) sind nur in einer Art das selbe, sie belegen 8 Bit. Mehr nicht.
Memory (4Byte), Long, Float, String, *Pointer sind genau so das selbe (wie in der von dir gemeinten Art) denn sie nutzen alle 32 Bit.
Aber das war auch schon das einzige wirklich gemeinsame.

Char ist nicht ein uByte. Es hat hier nur "zufällig" die selbe Bitanzahl.
Chars sind (wie alles andere im Computerspeicher auch) nummerische Werte, aber anders codiert als Zahlen. Deshalb kann man Strings nicht mit Longs gleichsetzen.
Alles wird in "Nullen und Einsen" verarbeiten (Bits), das ist das einzige was wirklich stimmt. Aber nummerische Werte werden nicht prinzipiell anders kodiert als Chars. uByte, sByte, Char haben den selben aufbau. Auch sBytes haben nicht wirklich ein Bit belegt für das Vorzeichen. Der einzige unterschied ist die interne Verarbeitung, also der Startwert für die Rechenoperationen.
Und Stringvariablen und Longs sind Speicherintern auch das selbe. Es sind immer 4Bytes auch mit "dem selben Aufbau". in der Stringvariablen steht auch nur ein Zahlenwert.
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.
Dann mußt du aber ach dazu sagen das das "sByte" (mit Vorzeichen) auch genau so codiert ist (was auch immer du damit meinst). Es stimmt schon. 8 Bit bleiben 8 Bit, aber das ist auch schon die einzige gemeinsamkeit. "sByte", "uByte" und Char sind einerseit das selbe (alle drei), andererseit haben sie nichts miteinander zu tun.
http://de.wikipedia.org/wiki/Char

Ich muß zugeben, um diese Dinge habe ich mich lange nicht mehr gekümmert (bestimmt vor 10 Jahren das letze mal aktiv), kann mich daher natürlich (wie bei allem ;-) auch irren.
Klar hast du auf eine Art recht es gibt ja auch manchmal (habe aber noch nicht wirklich kapiert warum) unsigned und signed Chars, auch Chars unterschiedlicher Länge. Eines bleibt aber, es sind "Zeichen".
Ich glaube der Sinn darin lag unter anderem, da es eine einfache Möglichkeit geben sollte, Zeichen ohne Umwege oder Umwandlung in ein "nummerische Variable" zu portieren.

Natürlich kann man schon deutlich sagen, das es nicht wirklich so ganz falsch ist. Char kann man natürlich schon zum rechen kleiner Werte nutzen. Einige Sprachen lassen sogar den Typ "Byte" weg und nutzen dafür Char, andere aber differenzieren hier genau.
http://www.dsdt.info/grundlagen/sprache/variablen.php
http://www.dpunkt.de/java/Die_Sprache_J ... va/29.html

Ich bleibe momentan noch bei der Meinung, weil ich es so mal gelernt habe und bisher auch immer nur bestätigt. Aber ich habe durch meine eigenen Fehler natürlich schon viel gelernt. Ich lasse mich als ohne sauer zu werden gerne beleeren. Diskutieren wir also weiter.

Ich denke aber, das es schon seinen sind hat, warum das Umwandeln eines Zahlenwerts in ein (Ascii-)Zeichen in fast allen Sprachen eine mit einer Funktion geschieht die Character() bzw. chr() oder Chr$() hast. Das der Datentyp "Zeichen" lautet, sollte wohl doch hoffentlich wirklich einen Sinn haben.

So, jetzt muß ich mich aber selbst erstmal stoppen *grins*
Lieber wieder etwas zurück zum Thema. Was natürlich stimmt, Char hin Char her, entweder sollte das Char in der Schleife und beim addieren gleich reagieren, also entweder signed oder unsigned sein. Das stimmt schon. Jetzt ist nur die Frage was richtig sein soll. Soweit ich mich erinnere sind Chars meist unsigned, aber offiziell unterschützt PB soweit ich weiß keine unsigned Variablen. Und "keine" sollte dann wohl auch "keine" bedeuten ;-)
Ist schon interessant was du da festgestellt hattest. Also unter Umständen könnte da doch ein Bug drinn sein. Bin ja mal gespannt was dabei rauskommt.

Grüßle
Toshy
[edit]
ps. Wollte nur noch mal sagen, das ich es ernst gemeint habe, das ich gerne was dazu lernen will, wenn m eine Auffassung nicht ganz korrekt ist.
1. Win10
PB6.1
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag von ullmann »

@Toshy

Im Prinzip reden wir vom gleichen Sachverhalt, Dinge sind gleich gespeichert und man kann sie unterschiedlich interpretieren / nutzen.

Die Begriffe signed/unsigned verwendet man nur im Zusammenhang mit Zahlen, nicht mit Chars.

Gruß Rainer
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 »

Warum sollte man für eine For Next - Schleife kein Long nehmen, wenns doch das schnellste ist?
Wozu ein Char, wo es syntaktisch doch nur irreführend ist und die Schleife
länger dauert?

Solange ihr keine Microcontroller programmiert, sollten die paar Hundert Byte
doch egal sein :mrgreen:
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

er geht ganz einfach ums prinzip, mein lieber.

wenn Char mit While und Repeat korrekt als uByte funktioniert,
soll es das gefälligst auch mit For tun. Basta.
da braucht man das garnicht zu versuchen totzudiskutieren, wie Tosh das angefangen hat,
der sachverhalt ist simpel, unbestreitbar und indiskutabel. Basta².
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

Hallo Toshy, ...

Du hast natürlich vollkommen recht, dass die interne Speicherung verschiedener Typen identisch ist und es im Grunde ja nur auf die Interpretation ankommt.


Deshalb versuche das, was Kaeru ja bereits gesagt hat, nun nochmal in etwas 'ruhigere' Worte zu fassen:

Wenn ein Typ nun mal in einer bestimmten Art und Weise interpretiert wird ... dann doch wohl bitte überall gleich.

Oder bist Du da etwa anderer Meinung? :roll:

Somit leigt beim For/Next (im Vergleich zum restichen Verhalten) doch wohl eindeutig ein Problem bei der Interpretation von Char-Typen vor.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

Passt ja prima, nach genau einem Jahr kommt die Sache wieder hoch.

Man lasse mal diesen Kode laufen und beachte das Ergebnis.
Danach ändere man das Define für die 3 Variablen von Char auf Long.

Code: Alles auswählen

; jear 070507
; Test Char

Dim wert.c(5)

Define.c min, max, HC

wert(0) = 87
wert(1) = 210
wert(2) = 150
wert(3) = 92
wert(4) = 252
wert(5) = 15

min = 255 : max = 0

For ix = 0 To 5
  HC = wert(ix)
  Debug Str(ix) + ".Wert ist : " + Str(HC)
  If HC < min : min = HC : Debug "min neu = " + Str(min) : EndIf
  If HC > max : max = HC : Debug "max neu = " + Str(max) : EndIf 
Next

Debug "min = " + Str(min)
Debug "max = " + Str(max)
Halte das falsche Verhalten der Char-Variablen für einen schlichten Bug.
Die Hilfe erlaubt mit Char eine Variable im Wertebereich 0 bis 255.
Damit sollte man fehlerfrei rechnen können!
Zuletzt geändert von jear am 07.05.2007 22:40, insgesamt 1-mal geändert.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag von ChristianK »

Wie ts-soft [Edit...und toshi natürlich] schon gesagt hat: mit 'Char' rechnet man nicht. kein bug, sondern Programmiererfehler.Es käme mir gar nicht in den sinn, Char zu diesem Zweck zu verwenden.
Zuletzt geändert von ChristianK am 07.05.2007 19:15, insgesamt 1-mal geändert.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

die Hilfe anpassen und das Problem ist beseitigt :)
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

wieso dann icht einfach mit .b rechnen?
Unsigned (vorzeichenlose) Variablen: außer dem Character (.c) Typ (welcher ein vorzeichenloses Byte im ASCII-Modus und ein vorzeichenloses Word im Unicode-Modus darstellt) unterstützt PureBasic derzeit vorzeichenlose Variablen nicht nativ. Aber Sie können diesen kleinen Trick verwenden:
a.b = -64
Debug a & 255 ; ergibt 192
oder ist das auch schlechter prog.-stil?
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Verhalten bei Byte oder Char mit For...Next schleife

Bei "For...Next" wird erst die Bedingung geprüft bevor der weiter Code ausgeführt wird
Dann wird der Zähler um eins erhöht.

Für bei Byte ( -128..+127) und bei Char (Ansi: 0..255) führt das natürlich zu einen Problem.

Der Vergleicher "CMP" vergleicht nur das Byte.

Bei einer Schleife von -128...+127 am Ende (+127) um eins erhöht wird, führt dieses zu einen Bereichs Überlauf.
Der Wert +127 um 1 erhöht wird ergibt dieses somit -128.
Dieses führt zu einer Endlosschleife.

Eindeutiger wird diese bei einer Schleife mit Char (Ansi) von 0 ... 255

Wenn an Ende Wert 255 um 1 erhöht wird ergibt dieses somit 0 und
daher auch eine Endlosschleife.

FF :wink:

P.S. Dieses Verhalten gilt auch für Word und Long
Beachte somit das eine Schleife mit Word von -32768 .. +32767 auch nicht funktionieren wird.

Das ist eine normales Verhalten von den Prozessor bei Addition und somit
in der Verantwortung des Programmierers Bereichsfehler zu vermeiden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Gesperrt