Seite 1 von 2

4 Bugs

Verfasst: 07.04.2006 20:17
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!

Verfasst: 07.04.2006 20:31
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:

Verfasst: 07.04.2006 20:54
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.

Verfasst: 07.04.2006 21:07
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

Verfasst: 08.04.2006 10:53
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

Verfasst: 08.04.2006 11:21
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!

Verfasst: 08.04.2006 11:48
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

Verfasst: 08.04.2006 12:10
von ZeHa
Die einfachste Möglichkeit ist es, Gosub einfach überhaupt nicht zu verwenden, sondern Prozeduren.

Verfasst: 08.04.2006 13:21
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

Verfasst: 08.04.2006 13:46
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ß