 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Wuz1980
Anmeldungsdatum: 05.05.2021 Beiträge: 3
|
Verfasst am: 05.05.2021, 16:27 Titel: Problem mit READ |
|
|
Ich bin mit meinem Latein am Ende..
Dieser Code
Code: | restore position
do
read ActivateElement
select case ActivateElement
case 0 to 103
DisplaySingle (ActivateElement)
case is = 253
sleep 500
case is = 254
sleep 750
case is = 255
exit do
end select
loop |
.
.
.
Code: | position:
data 54, 55 9, 64, 65, 253
data 2, 56, 57, 11, 66, 67, 253
data 58, 68, 22, 253
data 60, 70, 24, 253
data 8, 62, 63, 72, 73, 26, 254
data 84, 85, 86, 94, 95, 96, 45, 46, 253
data 30, 87, 39, 97, 48, 253
data 89, 99, 50, 253
data 34, 35, 92, 102, 255 |
lässt sich zwar ohne Fehler kompilieren (Version 1.05.0, Linux), das Programm hängt aber nach dem ersten Aufruf der Sub DisplaySingle in der Endlosschleife fest.
Wenn ich stattdessen die Spaghetticode-Variante
Code: | DisplaySingle (54)
DisplaySingle (55)
DisplaySingle (9)
DisplaySingle (64)
DisplaySingle (65)
sleep 500 |
usw. anwende, funktioniert alles einwandfrei.
Probeweise habe ich auch schon
Code: | read ActivateElement
DisplaySingle (ActivateElement)
read ActivateElement
DisplaySingle (ActivateElement) |
usw. versucht. In dem Fall wird die Sub ebenfalls einmal aufgerufen, danach Beendet sich das Programm.
Kann mir irgendjemand sagen was da schief läuft, bzw. was ich tun kann? Danke im Voraus |
|
Nach oben |
|
 |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 111
|
Verfasst am: 05.05.2021, 19:01 Titel: |
|
|
Die erste Data-Zeile hat zwischen 55 und 9 ein Leerzeichen.
Vielleicht muss der Fehler in der Sub gesucht werden?
Code: | Sub DisplaySingle(Byval ActivateElement As Single)
Print ActivateElement
End Sub
Dim As Single ActivateElement
Restore position
Do
Read ActivateElement
Select Case ActivateElement
Case 0 To 103
DisplaySingle (ActivateElement)
Case Is = 253
Sleep 500
Case Is = 254
Sleep 750
Case Is = 255
Exit Do
End Select
Loop
Print "Fertig"
Sleep
position:
Data 54, 55, 9, 64, 65, 253
Data 2, 56, 57, 11, 66, 67, 253
Data 58, 68, 22, 253
Data 60, 70, 24, 253
Data 8, 62, 63, 72, 73, 26, 254
Data 84, 85, 86, 94, 95, 96, 45, 46, 253
Data 30, 87, 39, 97, 48, 253
Data 89, 99, 50, 253
Data 34, 35, 92, 102, 255
' |
|
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 05.05.2021, 19:03 Titel: |
|
|
Hallo Wuz1980 und willkommen im Forum.
Ich würde sagen, der Fehler liegt in der Sub, vielleicht könntest du die einmal posten. Mein kleines Testprogramm Code: | Sub displaySingle(element As Integer)
Print element,
End Sub
Dim As Integer ActivateElement
Restore position
Do
Read ActivateElement
Select Case ActivateElement
Case 0 To 103
displaySingle (ActivateElement)
Case Is = 253
Sleep 500
Case Is = 254
Sleep 750
Case Is = 255
Exit Do
End Select
Loop
? "OK"
Sleep
position:
Data 54, 55, 9, 64, 65, 253
Data 2, 56, 57, 11, 66, 67, 253
Data 58, 68, 22, 253
Data 60, 70, 24, 253
Data 8, 62, 63, 72, 73, 26, 254
Data 84, 85, 86, 94, 95, 96, 45, 46, 253
Data 30, 87, 39, 97, 48, 253
Data 89, 99, 50, 253
Data 34, 35, 92, 102, 255 | läuft auf jeden Fall einwandfrei.
Gruß
grindstone
EDIT: Ups, da war jemand schneller. Aber die Übereinstimmung der Programme ist wirklich beeindruckend  _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
Wuz1980
Anmeldungsdatum: 05.05.2021 Beiträge: 3
|
Verfasst am: 05.05.2021, 20:59 Titel: |
|
|
Zu aller erst danke für die schnellen Antworten. Ich glaube zwar nicht, dass der Fehler in der Sub liegt (wie gesagt, mit der "Spaghetticode-Variante" funktioniert das Programm einwandfrei), aber hier ist sie inklusive den anderen involvierten Programmteilen (DisplaySingle ist ganz unten):
Code: | sub DisplaySelection (XPos as ubyte, YPos as ubyte, DispAlign as string, DispColor as uinteger)
dim Px as ubyte
restore sprite
if DispAlign = "h" then
for x as ubyte = YPos to YPos + 22
for y as ubyte = XPos to XPos + 4
read Px
if Px = 1 then
pset (x, y), DispColor
end if
next y
next x
else
for y as ubyte = YPos to YPos + 22
for x as ubyte = XPos to XPos + 4
read Px
if Px = 1 then
pset (x, y), DispColor
end if
next x
next y
end if
end sub
function SingleElement (ElementNumber as ubyte) as element
dim as ubyte ElementRow, ElementLine
dim as element Result
select case ElementNumber
case is < 54
ElementRow = ElementNumber \ 9
ElementLine = ElementNumber mod 9
Result.DispAlign = "h"
Result.XPos = 6 + ElementRow * 28
Result.YPos = 8 + ElementLine * 24
case is > 103
return Result
case else
ElementRow = (ElementNumber - 54) mod 10
ElementLine = (ElementNumber - 54) \ 10
Result.DispAlign = "v"
Result.XPos = 6 + ElementRow * 24
Result.YPos = 11 + ElementLine * 28
end select
return Result
end function
sub DisplaySingle (ElementNumber as ubyte)
DisplaySelection (SingleElement (ElementNumber).XPos, SingleElement (ElementNumber).YPos, SingleElement (ElementNumber).DispAlign, ActiveColor)
end sub
|
Zur ergänzung noch die Typdefinition:
Code: | type element
as ubyte XPos, YPos
as string DispAlign
end type |
Ich hätte nach stundenlanger Fehlersuche das Problem am ehesten im Compiler vermutet, aber mit der neuesten Version (1.07.3) ist es das selbe Spiel... |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 05.05.2021, 22:27 Titel: |
|
|
Nebenbei auch immer drandenken: READ und DATA ist ein Stück weit ein altes Sprachkonstrukt aus der Zeilennummern-BASIC-Zeit. FreeBasic lässt wie mittlerweile jede moderne Programmiersprache auch Array-Konstanten zu:
https://www.freebasic-portal.de/befehlsreferenz/dim-175.html
Somit ist also auch
Code: |
Dim As Integer position(0 To ...) = { 54, 55, 9, 64, 65, 253, _
2, 56, 57, 11, 66, 67, 253, 58, 68, 22, 253, 60, 70, 24, 253, _
8, 62, 63, 72, 73, 26, 254, 84, 85, 86, 94, 95, 96, 45, 46, 253, _
30, 87, 39, 97, 48, 253, 89, 99, 50, 253, 34, 35, 92, 102, 255 }
Dim i As Integer
For i = LBound(position) To UBound(position)
ActivateElement = position(i)
...
Next i
|
möglich. Vorteil: Dinge wie Typenprüfung erfolgt zur Übersetzungszeit, während bei READ/DATA erst zur Laufzeit der Fehler auftritt, wenn READ eine Zahl erwartet, aber ein String kommt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Wuz1980
Anmeldungsdatum: 05.05.2021 Beiträge: 3
|
Verfasst am: 06.05.2021, 04:35 Titel: |
|
|
Super Tip, danke. Daran hab ich überhaupt nicht gedacht. Vernagelt eben
Damit funktioniert es.
Rein interessehalber: Hast du trotzdem eine Idee, warum DATA und READ sich so verhalten haben? Ich würde nur gerne wissen, ob ich einen Fehler gemacht habe oder ob das Konstrukt einfach aus "Altersgründen" seine Macken hat. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4688 Wohnort: ~/
|
Verfasst am: 06.05.2021, 08:54 Titel: |
|
|
Vielleicht liegt es daran?
Das wirft auch dein READ im Hauptprogramm an eine andere Stelle. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|