| 
				
					|  | 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, 15: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: 116
 
 
 | 
			
				|  Verfasst am: 05.05.2021, 18: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 05.05.2021, 18: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
 läuft auf jeden Fall einwandfrei. 	  | 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
 | 
 
 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, 19: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: 2530
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 05.05.2021, 21: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, 03: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: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.05.2021, 07: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.
 
 |  |