Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem mit READ

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Wuz1980



Anmeldungsdatum: 05.05.2021
Beiträge: 3

BeitragVerfasst am: 05.05.2021, 15:27    Titel: Problem mit READ Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 05.05.2021, 18:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 05.05.2021, 18:03    Titel: Antworten mit Zitat

Hallo Wuz1980 und willkommen im Forum. lächeln

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 grinsen
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Wuz1980



Anmeldungsdatum: 05.05.2021
Beiträge: 3

BeitragVerfasst am: 05.05.2021, 19:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 05.05.2021, 21:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Wuz1980



Anmeldungsdatum: 05.05.2021
Beiträge: 3

BeitragVerfasst am: 06.05.2021, 03:35    Titel: Antworten mit Zitat

Super Tip, danke. Daran hab ich überhaupt nicht gedacht. Vernagelt eben mit dem Kopf durch die Mauer wollen
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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.05.2021, 07:54    Titel: Antworten mit Zitat

Vielleicht liegt es daran?
Code:
restore sprite

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz