For ... Next kann nicht mit Byte umgehen? (gelöst.. naja ;))

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

For ... Next kann nicht mit Byte umgehen? (gelöst.. naja ;))

Beitrag von Kurzer »

Hallo zusammen,

folgendes ist mir gerade bei meinem ersten PB Projekt aufgefallen:

Ich nutze eine Byte Variable für eine For Next Schleife, aber die Schleife
wird nicht ausgeführt. Stattdessen springt er (Debugmodus, Steppen) direkt
zum Next und setzt die Zählervariable auf -112.

Benutze ich ein Word als Zählervariable, dann klappt alles wunderbar.

Liegt's an mir oder an PB?

Code: Alles auswählen

Procedure InitCards()
  Protected Count.b, Card.b = 1

  For Count = 0 To 143 Step 1
    Debug Count ; Hier kommt er nie hin, wenn Count eine Bytevariable ist!
  Next Count

  ; ... Rest entfernt...

EndProcedure
Gruß Markus (leicht verwirrt)
Zuletzt geändert von Kurzer am 01.06.2006 10:26, insgesamt 1-mal geändert.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Ich sehe gerade in der PB HIlfe folgendes:

Byte .b 1 Byte -128 bis +127

Wie krank ist das denn?

Den Wertebereich eines Bytes zu verändern? Etwas, was so feststeht wie die Naturgesetze... ? Wer hat sich denn das ausgedacht?

Ein Byte war in meinem bisherigen Leben noch nie Vorzeichenbehaftet.
Sicherlich wird einem JEDER, der auch nur ein bißchen programmiert sagen, daß ein Byte von 0-255 reicht.

Man man... da muß einer aber echt breit gewesen sein, als er sich das ausgeheckt hat. :freak:
(also ist jetzt alles nicht wirklich bös gemeint, aber ist schon ein echter Kulturschock für mich)

Gruß Markus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

zu irgendwelchen problemen mit byte hatten wir schon öfter was.

da du step absolut angibst, wird es wohl als long (bzw. quad in 4.0) angesehen.
sollte zwar eigentlich nicht so komische ergebnisse bringen, aber könnte daran hängen.

wieauchimmer: da du bestimmt kein Händie programmierst, solltest du nicht so geizen mit deinem speicher. ob du nun Longs/Quads für deine zähler benutzt, oder in china platzt'n sack reis is nu echt banane...

[edit]
zu deinem zweiten post: in PB sind alle Variablen nun mal vorzeichenbehaftet, das sind sie auch in anderen programmiersprachen, deshalb gibt es z.b. in C den typ char = unsigned byte.

also, das ist sehr oft so, dass ein byte ein vorzeichen hat, das ist kein grund, hier glei so rumzugreine...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Kaeru Gaman hat geschrieben:...da du step absolut angibst, wird es wohl als long (bzw. quad in 4.0) angesehen.
sollte zwar eigentlich nicht so komische ergebnisse bringen, aber könnte daran hängen.
Ohne Step verhält es sich genauso.
Kaeru Gaman hat geschrieben:wieauchimmer: da du bestimmt kein Händie programmierst, solltest du nicht so geizen mit deinem speicher. ob du nun Longs/Quads für deine zähler benutzt, oder in china platzt'n sack reis is nu echt banane...
Eben, ich nehm ja jetzt auch nen Word, damit gehts.
Es ist aber dennoch ungewöhnlich, finde ich.
Kaeru Gaman hat geschrieben:[edit]
zu deinem zweiten post: in PB sind alle Variablen nun mal vorzeichenbehaftet, das sind sie auch in anderen programmiersprachen, deshalb gibt es z.b. in C den typ char = unsigned byte.

also, das ist sehr oft so, dass ein byte ein vorzeichen hat, das ist kein grund, hier glei so rumzugreine...
Vermutlich liegts einfach daran, daß ich früher viel in Assembler gemacht habe und z.B. C niemals programmier habe. :)

Und rumgreine... tue ich nicht. Sorry, wenn das für Dich so klang.
Ich schrieb ja, daß es nicht wirklich bös gemeint war. Stell Dir halt vor, Du kaufst Dir ein Auto und wenn Du damit nach links lenkst dann fährt es nach rechts usw... Da kriegst Du bestimmt auch erstmal dicke Augen, weil alle anderen Autos, die Du vorher hattest das genau anders gemacht haben. ;)

Gruß Markus
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Kurzer hat geschrieben:Ich sehe gerade in der PB HIlfe folgendes:

Byte .b 1 Byte -128 bis +127

Wie krank ist das denn?

Den Wertebereich eines Bytes zu verändern? Etwas, was so feststeht wie die Naturgesetze... ? Wer hat sich denn das ausgedacht?

Ein Byte war in meinem bisherigen Leben noch nie Vorzeichenbehaftet.
Sicherlich wird einem JEDER, der auch nur ein bißchen programmiert sagen, daß ein Byte von 0-255 reicht.

Man man... da muß einer aber echt breit gewesen sein, als er sich das ausgeheckt hat. :freak:
(also ist jetzt alles nicht wirklich bös gemeint, aber ist schon ein echter Kulturschock für mich)

Gruß Markus
full acknowlegde .
Seit nunmehr 4 Jahren wo ich das PB kenne hat es nix mit
Standards am Hut.

Sowas gibts nur hier , ein sByte :)
Rings hat geschrieben:ziert sich nich beim zitieren
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag von ullmann »

Sicher gab es Gründe, dass Fred in PureBasic (seiner Programmiersprache wohlgemerkt) den Typ Byte vorzeichenbehaftet (signed) implementiert hat.

In der Hilfe steht es ja eindeutig drin Bytebereich: -128 bis +127

Was passiert in deiner For-Next-Schleife?

Der Endwert 143 passt nicht in den signedByte-Werte-Bereich. Er wird unsigned eingetragen (%1000111) und dann signed gelesen (=-113). Und deshalb wird die Schleife nicht durchlaufen.

Code: Alles auswählen

count1.c=%1000111
count2.b=%1000111
Debug Count1
Debug Count2
Rainer
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Bzgl. Standards:

In Java: byte von -128 bis 127
In C: char von -128 bis 127 (dort gibt es aber alternativ auch unsigned char)
...
!UD2
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Froggerprogger hat geschrieben:Bzgl. Standards:

In Java: byte von -128 bis 127
In C: char von -128 bis 127 (dort gibt es aber alternativ auch unsigned char)
...
wir reden aber hier von BASIC
und da iss der standard meines wissens nach (und ich
programmiere seit 1987) das ein byte immer von 0-255 geht.
oder wie in asm von 0 bis $FF .
im übrigen ist ein Char etwas anderes wie ein byte(per definition) .
und vielleicht ist mein wissen auch fehl am platze und ich bin
schon zu verseucht von anderen 'INDUSTRIE tauglichen Sprachen'.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Rings hat geschrieben:wir reden aber hier von BASIC
und da iss der standard meines wissens nach (und ich
programmiere seit 1987) das ein byte immer von 0-255 geht.
Obs Standard ist weis ich nicht, ich kann aber ebenfalls bestätigen, das ich in allen Basic's (und das sind einige) die ich bisher in den Fingern hatte (außer eben PB) tatsächlich das Byte immer von 0-255 geht. Ungewöhnlich ist es daher schon, aber wenn man es weis kann man ja damit umgehen, wenn auch manchmal umständlicher.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Von anderen BASICs weiss ich das nicht mehr so genau.
Aber soo schlimm ist es ja auch nicht, wenn man weiss, ob signed oder unsigend verwendet wird.

@DieDieDasNochNichtKannten
Und wenn man z.B. Bytes mit Bytes verrechnet führt dank Zweierkomplement beides sowieso zum selben Ergebnis. Liest man also aus einer Datei Bytes aus und verrechnet die miteinander über +-*/ ist es egal, ob man dies signed oder unsigned tut, oder wie sie beim Schreiben gemeint waren, man schreibt in jedem Fall dieselben Bits zurück.
Auch bei z.B. Robotersteuerungen. Falls in der Anleitung steht, man sende die 215, dann weist man einfach die 215 einem Byte zu und schickt die los, auch wenn die intern eine negative Zahl ist - sie hat dieselben Bits gesetzt.
!UD2
Antworten