4 Bugs

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
PureBaser
Beiträge: 180
Registriert: 08.09.2004 21:20
Wohnort: Berlin
Kontaktdaten:

4 Bugs

Beitrag von PureBaser »

Hallo!
Nach einem Jahr kurz vor der lang, lang ersehnten Version 4 grüße ich wieder alle recht herzlich!!! Nunja nun fange ich seit 2 Tagen an zu programmieren. Nun habe ich in den Tagen mehr oder weniger Bugs oder vermeintliche Fehler gefunden.
Wer Lust hat und es kann, mag mich bitte aufklären oder die Bugs weiterleiten :)
(Alle Beispiele mit PB 3.94 unter Win98SE) (Ich bin mir sicher, dass die Bugs auch in V4.00Beta enthalten sind)




1. GoSub funktioniert nicht

Code: Alles auswählen

OpenConsole()
abcd:
PrintN("1")
PrintN("2")
Return
PrintN("3")
Delay(5000)
Gosub abcd
PrintN("4")
PrintN("5")
Delay(5000)
CloseConsole()
End
Normalerweise sollte das Programm eine 1231245 untereinander zeigen. Stattdessen passiert absolut gar nichts!




2. Stringsproblematik (oder String-Unlogik)

2.1 a$ und a.s sind NICHT identisch! Ein String den man also einmal a$ genannt hat kann man nicht mehr mit a.s ansprechen und umgekehrt! Eigentlich sollte sowas doch möglich sein, da die Datentypen absolut identisch sind! Die verschiedene Verhaltensweise fällt insbesondere bei Val(a) auf - Hier darf man auschließlich nur "Val(a$)" schreiben und nicht etwa "Val(a.s)" oder Val(a) selbst wenn vorher "Global a.s" festgelegt wurde. Wenns nicht zuändern ist, bitte diese Besonderheit im Handbuch explizit aufführen!

2.2 - "Global a.s" reicht es, nachfolgend nur den Variablenstring ohne Datentyp anzugeben, bei "Global a$" muss immer das Dollarzeichen mitangegeben werden. Wenns nicht zuändern ist, bitte diese Besonderheit im Handbuch explizit aufführen!




3. 16 Farben (4Bit) Modi geht nicht!

Stattdessen erscheint eine Fehlermeldung!
Zwar vielleicht veraltet, aber eher sollte man diese Funktion reparieren oder ausbauen (bzw. in der Hilfe unkommentiert lassen oder als inoffizielle Funktion ansehen) - immer noch viel besser als ein zusätzlicher Fehler!




4. Entommen aus Beispiel 7_1 des PB-Tutorium (bei PureBasic.de)

Code: Alles auswählen

; 1. Inizierung
InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Beispiel 7_1")
Global BallX.w
Global BallY.w
Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w

BallX = 319
BallY = 239
BewegX = -1 ; warum lässt sich hier nicht +1 einsetzen?
BewegY = -1 ; warum lässt sich auch hier nicht +1 einsetzen?
SchlaegerX = 639 - 10
SchlaegerY = 239 - (30 / 2)
....
Das Problem wird in den Kommentaren beschrieben.




5. Überprüfung der Eingabe

Überprüfen, dass nur Zahlen eingeben worden sind, funzt net! Es dürften nur Zahlen 0 bis 9 (einzeln) eingegeben werden! Zusatzfrage: Wie macht man, das nur diese Zahlen in beliebiger Reihenfolge (einschließlich Punkt und Minus-Zeichen) eingegeben werden?

Mein Code:

Code: Alles auswählen

For a.b = 0 to 9	; ich dachte
Next
Repeat
PrintN("Zahl 1 eingeben: ")
Zahl1.s = Input()
Until Val(Zahl1) = a.b
Next


Danke!
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 »

1. GoSub funktioniert nicht
Dank Return wird er niemals bei GoSub ankommen

2. Stringsproblematik (oder String-Unlogik)
a.s <> a$ es sind 2 unterschiedliche Stringvariablen!!!

3. 16 Farben (4Bit) Modi geht nicht!
Können die meisten aktuellen Grafikkarten auch nicht

4. Entommen aus Beispiel 7_1 des PB-Tutorium (bei PureBasic.de)
Weil das + nicht mitgeschrieben wird

5. Überprüfung der Eingabe
Der Code ist total falsch und überprüft nicht auf Zifferneingabe!

Wo sind die Bugs :lol:
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
Benutzeravatar
PureBaser
Beiträge: 180
Registriert: 08.09.2004 21:20
Wohnort: Berlin
Kontaktdaten:

Beitrag von PureBaser »

Aha Danke! :oops:

Hmm, noch ne kleine Frage zu 1.:

Ist das nicht ein wenig unflexibel, wenn GoSub nur vor dem Return stehen darf? Naja der Befehl soo ja eh vermieden werden.
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 »

Code: Alles auswählen

OpenConsole()
Gosub abcd
PrintN("3")
Delay(5000)
Gosub abcd
PrintN("4")
PrintN("5")
Delay(5000)
CloseConsole()
End 
abcd:
PrintN("1")
PrintN("2")
Return
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
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

>>Ist das nicht ein wenig unflexibel, wenn GoSub nur vor dem Return stehen darf?

Nein, Gosub muss vor dem Return stehen, da Return an eine mit Gosub auf dem Stack abgelegte Programm-Adresse zurückspringt. Wenn da vorher nix abgelegt wurde, springt es irgendwohin, ja nachdem welcher Wert vorher im Stack war. Ist auch bei anderen Sprachen (Assembler) so.

Sven
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Wenns nicht zuändern ist, bitte diese Besonderheit im Handbuch explizit aufführen!

Es ist nicht zu ändern, und diese Besonderheit IST im Handbuch explizit aufgeführt!
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
DeltaG
Beiträge: 112
Registriert: 10.09.2004 18:15

Beitrag von DeltaG »

Sven hat geschrieben:>>Ist das nicht ein wenig unflexibel, wenn GoSub nur vor dem Return stehen darf?

Nein, Gosub muss vor dem Return stehen, da Return an eine mit Gosub auf dem Stack abgelegte Programm-Adresse zurückspringt. Wenn da vorher nix abgelegt wurde, springt es irgendwohin, ja nachdem welcher Wert vorher im Stack war. Ist auch bei anderen Sprachen (Assembler) so.

Sven
Meine bescheidene Anfängermeinung dazu:
Die Aussage ist so nicht ganz richtig. 'Gosub' muß nicht vor 'Return' stehen.
Vielmehr muß vom Programmablauf her ein 'Gosub' vor einem 'Return' abgearbeitet werden.
Minimalistenbeispiel dazu:

Code: Alles auswählen

Goto 1
2:
Debug "hier ist 2"
Return
1:
Debug "hier ist 1"
Gosub 2
End
Ich gebe zu, daß es nicht der gewünschte Programmierstil ist, aber zeigt ein Beispiel für die logisch richtige Antwort.
Würde man die erste Erklärung als richtig nehmen, müßte dieses Beispiel auch funktionieren:

Code: Alles auswählen

Goto 1
Gosub 1
Debug "hier ist das Ende"
End

1:
Debug "hier ist 1"
Return
Es trifft zwar hier wiederum der Grund für das Nichtfunktionieren zu (fehlende Return-Adresse auf dem Stack), aber nicht die Erklärung, denn 'Gosub' steht vor 'Return.

:oops:
DeltaG
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Die einfachste Möglichkeit ist es, Gosub einfach überhaupt nicht zu verwenden, sondern Prozeduren.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
DeltaG
Beiträge: 112
Registriert: 10.09.2004 18:15

Beitrag von DeltaG »

erbsenzählenein=1
ZeHa hat geschrieben:Die einfachste Möglichkeit ist es, Gosub einfach überhaupt nicht zu verwenden, sondern Prozeduren.
Deshalb ja:
Ich gebe zu, daß es nicht der gewünschte Programmierstil ist,...
Trotzdem löst das nicht das grundsätzliche Problem.
Man ist auch mit Prozeduren nicht davor gefeit, ähnliche Probleme zu haben.

Beispiel:

Code: Alles auswählen

Debug "start"

machwas()

End

Procedure machwas()

Debug "Ich mach was"

EndProcedure
Im Gegensatz dazu:

Code: Alles auswählen

Procedure machwas()

Debug "Ich mach was"

EndProcedure

Debug "start"

machwas()

end
Auch hier hat man im ersten Beispiel das gleiche Problem wie beim Gosub-Beispiel.
Natürlich kann man dieses neuerliche Problem mittels 'Declare' beheben. Doch darum geht es hier nicht.
Es geht um die Positionierung der Befehle im Programm- bzw. Kompilierablauf und unter der Berücksichtigung, daß ein Einpaßkompiler verwendung findet.

erbsenzählenein=0

DeltaG
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 »

@DeltaG
Verstehe ich nicht? :freak:
Labels werden immer gefunden, egal wo sie im Code stehen. Ist nur eine
Adresse

Proceduren müssen vorher declariert sein, da ja nicht nur eine
Speicheradresse bekannt sein muß, sondern auch Speicher für die Parameter
reserviert werden muß
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
Gesperrt