Character-Variablen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Character-Variablen

Beitrag von PureBasic4.0 »

Hi, Leute

Ich möchte Character Zahlen in eine Datei reinschreiben. Funktioniert auch soweit. Wenn ich jetzt aber große Zahlen größer 200 (aber kleiner als 255) in die Datei reinschreibe und die Datei hinterher mit PB wieder öffne und die Zahlen auslese, bekomme ich oft negative Zahlen heraus. Weiß jemand, wo das Problem liegt?

Danke,
PureBasic4.0
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

byte ist vorzeichenbehaftet.
ist aber kein problem, benutze "Zahl & 255", dann eliminierst du das vorzeichen.

Code: Alles auswählen

a.b = -93
Debug a
Debug a & 255
Debug Chr(a & 255)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Als Alternative gleich .c nehmen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

vor allem ReadCharacter / WriteCharacter...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

das ist ja mein Problem. ich schreibe per writecharacter eine Zahl in ne Datei rein und bekomme (readcharacter) manchmal eine negative Zahl heraus (besonders bei >200)
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

lol tatsächlich :lol:

Code: Alles auswählen

CreateFile(0, "test.txt")

WriteCharacter(0, 255)
CloseFile(0)

ReadFile(0, "test.txt")
Debug ReadCharacter(0)
so gehts

Code: Alles auswählen

CreateFile(0, "test.txt")

WriteCharacter(0, 255)
CloseFile(0)

ReadFile(0, "test.txt")
c.c = ReadCharacter(0)
Debug c
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, wenn ich das zweite beispiel verwende, klappt alles, auch mit ner schleife für die werte...

@4.0
ich kann mir nicht vorstellen, dass du irgendwo debug verwendest.

also ist das wohl ein type-problem beim direkten verwenden des rückgabewertes.
mich würde jetzt wirklich mal interessieren, wie dein code an der stelle aussieht, wo der fehler auftritt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Es hat nichts mit dem direkten verwenden des Rückgabewertes zu tun,
das mach ich bei c.c = ReadCharacter(0) ja auch. Nur wird hier halt die
-1 als 255 dargestellt, da Character-Variablen in ASCII-Mode zwar auch
nur 1 Byte haben, aber bei der Ausgabe als unsigned interpretiert werden.

Das Problem liegt darin, dass entweder ReadCharacter() falsch deklariert
wurde (nicht Character als Rückgabetyp, sondern Byte), oder Debug nicht
mit zurückgegebenen Character-Werten von Funktionen klar kommt.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

Der Code, der die Datei schreibt:

Code: Alles auswählen

Red = Red(Farbe)
Green = Green(Farbe)
Blue = Blue(Farbe)
WriteCharacter(1,Red)
WriteCharacter(1,Green)
WriteCharacter(1,Blue)
Der Code, der aus der Datei liest:

Code: Alles auswählen

Red = ReadCharacter(1)
Green = ReadCharacter(1)
Blue = ReadCharacter(1)
Debug "Rot:"+Str(Red) ;Negative Zahl (bei hohen Zahlen)
Debug "Grün:"+Str(Green)  ;Negative Zahl (bei hohen Zahlen)
Debug "Blau:"+Str(Blue)  ;Negative Zahl (bei hohen Zahlen)
Farbe = RGB(Red,Green,Blue)
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
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 »

Solange Du Deine Variablen richtig deklarierst, gibt doch keine Problem
Es sollte zwar auch anders gehen :freak: , aber richtig deklarieren sollte man sowieso

Code: Alles auswählen

Red.b = Red($DD69EA)
Debug Red
File.l = CreateFile(#PB_Any, "c:\test.bin")
If File
  WriteCharacter(File, Red)
  CloseFile(File)
EndIf

File.l = ReadFile(#PB_Any, "c:\test.bin")
If File
  readRed.c = ReadCharacter(File)
  Debug readRed
  CloseFile(File)
EndIf
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
Antworten