| 
				
					|  | 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 |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 24.06.2016, 12:54    Titel: Array befüllen |   |  
				| 
 |  
				| Hallo, 
 da ich mit FB neu angefangen habe, habe ich gleich eine Frage.
   
 Wie kann ich am besten dies hier realisieren?
 
  	  | Code: |  	  | Dim iMode As Short
 
 iMode = 1
 
 Select Case iMode
 Case 1
 Dim aArray(0 To 2, 0 To 2) As Single = {{0.1, 0.2, 0.3}, _
 {1.1, 1.2, 1.3}, _
 {2.1, 2.2, 2.3}}
 Case Else
 Dim aArray(0 To 4, 0 To 4) As Single = {{-1.0,   -1.0,    -1.0,      -1.0,      0.0}, _
 {-1.0,   -1.0,    -1.0,      0.0,      1.0}, _
 {-1.0,   -1.0,    0.0,      1.0,      1.0}, _
 {-1.0,    0.0,    1.0,      1.0,      1.0}, _
 { 0.0,    1.0,    1.0,      1.0,      1.0}}
 End Select
 
 
 
 Print aArray(1, 1)
 
 | 
 
 Ich möchte der Übersicht wegen diese Array Deklaration behalten und nicht über aArray(0, 0) = 0.1, usw. gehen.
 
 Geht dies überhaupt?
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 24.06.2016, 15:10    Titel: |   |  
				| 
 |  
				| Hallo und willkommen im Forum!   
 Das Problem ist, daß Select Case (ebenso wie z.B. For...Next, Do...Loop oder While...Wend) einen Scope Block darstellt, und eine innerhalb eines Scope Blocks dimensionierte Variable ist auch nur innerhalb dieses Blocks gültig. Um das zu lösen, muß man ein wenig in die Trickkiste greifen:
  	  | Code: |  	  | Declare Sub ArrayUebertragen(aArray() As Single, tmpArray() As Single) 
 Dim iMode As Short
 ReDim As Single aArray(1,1)
 
 iMode = 1
 
 Select Case iMode
 Case 1
 Dim tmpArray(0 To ..., 0 To ...) As Single  = {{0.1, 0.2, 0.3}, _
 {1.1, 1.2, 1.3}, _
 {2.1, 2.2, 2.3}}
 ArrayUebertragen(aArray(), tmpArray())
 Case Else
 Dim tmpArray(0 To ..., 0 To ...) As Single = {{-1.0,   -1.0,    -1.0,      -1.0,      0.0}, _
 {-1.0,   -1.0,    -1.0,      0.0,      1.0}, _
 {-1.0,   -1.0,    0.0,      1.0,      1.0}, _
 {-1.0,    0.0,    1.0,      1.0,      1.0}, _
 { 0.0,    1.0,    1.0,      1.0,      1.0}}
 ArrayUebertragen(aArray(), tmpArray())
 End Select
 
 Print aArray(1, 1)
 Sleep
 
 Sub ArrayUebertragen(aArray() As Single, tmpArray() As Single)
 ReDim aArray(LBound(tmpArray,1) To UBound(tmpArray,1), _
 LBound(tmpArray,2) To UBound(tmpArray,2))
 For x As Integer = LBound(tmpArray,1) To UBound(tmpArray,1)
 For y As Integer = LBound(tmpArray,2) To UBound(tmpArray,2)
 aArray(x,y) = tmpArray(x,y)
 Next
 Next
 End Sub
 
 | 
 Du dimensionierst aArray als dynamisches Array im Hauptprogramm, erstellst im Select Case - Block ein temporäres Array mit dem gewünschten Inhalt und übergibst dann beide Arrays an ein Unterprogramm, das aArray entsprechend redimensioniert und den Inhalt überträgt.
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 24.06.2016, 15:22    Titel: |   |  
				| 
 |  
				| Vielen Dank grindstone. 
 Ich werde es gleich probieren.
  _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 24.06.2016, 15:36    Titel: |   |  
				| 
 |  
				| Was ist die Bedeutung von ... in 
 ? 	  | Zitat: |  	  | Dim tmpArray(0 To ..., 0 To ...) | 
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 24.06.2016, 18:19    Titel: |   |  
				| 
 |  
				| Alte Technikerweisheit: "Wenn gar nichts anderes mehr hilft: Lesen Sie die Gebrauchsanleitung!"   
 Etwas nach unten scrollen bis zum Punkt Initialisierung. Dort ist es besser erklärt, als ich es je könnte.
 
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 24.06.2016, 18:30    Titel: |   |  
				| 
 |  
				| Vor lauter Bäumen sieht man den Wald nicht. 
 
  	  | Zitat: |  	  | The upper bound can be an ellipsis (..., 3 dots). This will cause to upper bound to be set automatically based on the number of elements found in the initializer. When ellipsis is used in this manner, an initializer must be used, and it may not be Any. See the Ellipsis page for a short example. | 
 
 Danke.
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 16.03.2017, 15:26    Titel: |   |  
				| 
 |  
				| Es scheint so, dass das Befüllen eines Arrays auf 512 kb beschränkt ist, wenn ich das so mache: 
  	  | Code: |  	  | Dim Shared As UByte __Earthclouds_600x300png(0 To ...) = _ {&h89, &h50, &h4E, ...}
 | 
 
 Wenn die Hex Bytes eine gewisse Größe überschreiten, dann stürzt der Compiler beim kompilieren ab!
 
 Gibt es einen Workaround dafür, um den Rest auch hinzuzufügen?
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 16.03.2017, 16:07    Titel: |   |  
				| 
 |  
				| Um meine Nichtexperten-Meinung hier einzubringen  Es gibt einen Unterschied, ob die Variablen in den Heap oder den Stack gelegt werden. Statische Arrays werden (glaube ich) in den Stack gelegt, und da ist der verfügbare Platz begrenzt. Ein Ausweg wäre ein dynmisches Array (wieder nur afaik) - allerdings kannst du dem bei der Initiierung keine Werte mitgeben. Bei den Datenmengen würde ich die Werte wahrscheinlich aus einer externen Datei auslesen. _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 16.03.2017, 16:54    Titel: |   |  
				| 
 |  
				|  	  | nemored hat Folgendes geschrieben: |  	  | Um meine Nichtexperten-Meinung hier einzubringen  Es gibt einen Unterschied, ob die Variablen in den Heap oder den Stack gelegt werden. Statische Arrays werden (glaube ich) in den Stack gelegt, und da ist der verfügbare Platz begrenzt. Ein Ausweg wäre ein dynmisches Array (wieder nur afaik) - allerdings kannst du dem bei der Initiierung keine Werte mitgeben. Bei den Datenmengen würde ich die Werte wahrscheinlich aus einer externen Datei auslesen. | 
 
 Ziel ist es, komplett aus dem Speicher die Daten zu lesen. Ich würde gerne die Rotierende Erde Animation noch ein wenig pimpen und müsste dazu noch ein paar Bilder hinzufügen.
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 16.03.2017, 17:32    Titel: |   |  
				| 
 |  
				| Leider stürzt der Compiler auch ab, wenn ich z.B. -t 32768 verwende. 
 Hier die Testdatei Test.bas als Zip gepackt: https://www.mediafire.com/?843c8l6jyxr25t6
 
 @Sebastian: was meinst du mit
 ? 	  | Zitat: |  	  | Präprozessor-Direktiven ja etwas "Syntax-Sugar" bauen | 
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 16.03.2017, 19:18    Titel: |   |  
				| 
 |  
				| Ich würde als Alternative die gute(n) alte(n) DATA - Zeile(n) vorschlagen. 	  | Sebastian hat Folgendes geschrieben: |  	  | Vielleicht kann man sich da mit Präprozessor-Direktiven ja etwas "Syntax-Sugar" bauen, damit man nicht Code:
 ...
 blob(123) = &H42
 blob(124) = &H01
 ...
 
 schreiben muss, um das Array aus Literalen zu initialisieren.
 
 | 
   
 Gruß
 grindstone
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| volta 
 
 
 Anmeldungsdatum: 04.05.2005
 Beiträge: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 17.03.2017, 12:37    Titel: |   |  
				| 
 |  
				| Hi, 239012 Hexwerte +", " (6Byte) = 1,4MB sind zu groß.
 (FB 1.05 32Bit) ca. 87300 Hexwerte sind <512kB und lassen sich so als Array dimensionieren??
 (FB 1.05 64Bit) ca. 26000 Hexwerte lassen sich so als Array dimensionieren??
 
 grindstone Vorschlag funktioniert:
 
  	  | Code: |  	  | Dim Shared As UByte __Earthclouds_600x300png(0 To 239011) Dim As Long i
 Dim d As UByte
 For i= 0 To 239011
 Read d
 __Earthclouds_600x300png(i)=d
 Next
 sleep
 
 Data &h89, &h50, &h4E, &h47, &h0D,   ...........
 
 | 
 _________________
 Warnung an Choleriker:
 Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 17.03.2017, 16:57    Titel: |   |  
				| 
 |  
				| Vielen Dank volta! 
 Ich vermute, dass ich nicht auf Data direkt per Pointer zeigen kann, um den Speicherbereich einfach weiter zu verwenden und somit mir das Kopieren per Read in ein Array sparen kann.
 
 Dann muss ich mein wohl mein FB File2Bas Code Generator anpassen...
 _________________
 Gruß
 UEZ
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 17.03.2017, 17:19    Titel: MACRO |   |  
				| 
 |  
				| Hallo! 
  	  | UEZ hat Folgendes geschrieben: |  	  | @Sebastian: was meinst du mit ? 	  | Zitat: |  	  | Präprozessor-Direktiven ja etwas "Syntax-Sugar" bauen | 
 | 
 Ich meinte etwas vielleicht in so einer Richtung:
 
  	  | Code: |  	  | #MACRO StartBlob(identifier, bytes) Redim identifier(1 To bytes) As UByte
 Scope
 Dim i As Integer = 1
 #MACRO D(value)
 : identifier(i) = value : i += 1 :
 #ENDMACRO
 #ENDMACRO
 
 #DEFINE EndBlob End Scope
 
 
 StartBlob ( MeinBild, 4 )
 D(123) D(42) D(100) D(77)
 EndBlob
 
 StartBlob ( Testdaten, 3 )
 D(&HFF) D(&H0F) D(&H1E)
 EndBlob
 
 Print "MeinBild:"
 For i As Integer = LBound(MeinBild) To UBound(MeinBild)
 Print i; " -> "; MeinBild(i)
 Next i
 
 Print "Testdaten:"
 For i As Integer = LBound(Testdaten) To UBound(Testdaten)
 Print i; " -> "; Testdaten(i)
 Next i
 
 GetKey
 End
 | 
 Aber ob das jetzt unbedingt cooler ist, ...
  Ich hab auch nicht ausprobiert, wie viele Bytes das verkraftet. 
 Viele Grüße!
 Sebastian
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| volta 
 
 
 Anmeldungsdatum: 04.05.2005
 Beiträge: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 17.03.2017, 17:36    Titel: |   |  
				| 
 |  
				| Hi, vor Jahren habe ich mal mit incbin Dateien in das eigene Programm eingebunden. Sollte mit BMP, PNG ebenso gehen.
 
  	  | Code: |  	  | Dim As UByte Ptr StartFile     'Pointer für den Anfang des File Dim As ULong LenFile           'Variable für die Länge des File
 
 Asm
 .balign 16
 jmp START_OF_PROG            'springe zum Label
 
 .balign 4
 START_OF_FILE:               'ab hier beginnt die eingebundene Datei
 .incbin "./incbin.bas"       'Name der Datei
 END_OF_FILE:                 'hier endet die eingebundene Datei
 
 .balign 16
 START_OF_PROG:
 lea ebx, START_OF_FILE       'Lade die Adresse des Label START_OF_FILE nach ebx
 mov dword Ptr [StartFile], ebx 'Speicher die Adresse im Pointer StartFile
 lea eax, END_OF_FILE         'Lade die Adresse des Label END_OF_FILE nach eax
 Sub eax, ebx                 'berechne eax - ebx = Länge des File
 mov dword Ptr [LenFile], eax 'Speicher die Länge des File in der Variablen LenFile
 End Asm
 
 For i As Integer = 0 To LenFile-1
 Print Chr(StartFile[i]);
 Next
 Sleep
 | 
 Hier habe ich den Quelltext 'incbin.bas' eingebunden und gebe ihn Byte für Byte auf das Consolefenster.
 _________________
 Warnung an Choleriker:
 Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 18.03.2017, 11:42    Titel: |   |  
				| 
 |  
				| Ich habe einmal den Gedanken aufgegriffen, auf die in der Programmdatei untergebrachten Daten per Pointer zuzugreifen. Am sinnvollsten schien mir dabei die Verwendung einer Stringkonstanten:  	  | Code: |  	  | Const As String __Earthclouds_600x300png = Chr(&h89, &h50, &h4E, &h47, &h0D, ... | 
 Dabei musste ich feststellen, daß die Zahl der Zeichen in einem CHR - Statement offenbar auf 32 begrenzt ist. Weiß jemand genaueres darüber? In der Referenz habe ich dazu nichts gefunden.
 
 Gruß
 grindstone
 
 PS.: Wäre es nicht am einfachsten, das Bild als Ressource in das Programm einzubinden?
 _________________
 For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
 |  |  
		| Nach oben |  |  
		|  |  
		| volta 
 
 
 Anmeldungsdatum: 04.05.2005
 Beiträge: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 18.03.2017, 14:57    Titel: |   |  
				| 
 |  
				| Genaueres weiß ich auch nicht. Wenn man es ausprobiert, sieht man in den asm bzw. c Dateien das die Compilerfunktion fb_CHR immer nur max 32Werte aufnimmt.
 
  	  | Code: |  	  | DIM As String a = Chr(&h89, &h50, &h4E, &h47, &h0D, &h0A, &h1A, &h0A, &h00, &h00_ , &h00, &h0D, &h49, &h48, &h44, &h52, &h00, &h00, &h02, &h58_
 , &h00, &h00, &h01, &h2C, &h08, &h04, &h00, &h00, &h00, &hB5_
 , &h34, &h05)
 
 a=a +Chr(&h1D, &h00, &h03, &hA5, &h6B, &h49, &h44, &h41_
 , &h54, &h78, &h5E, &hEC, &hBC, &h07, &h90, &h6C, &hC7, &h75_
 , &hA6, &hF9, &h9D, &hBC, &hA6, &h6E, &hF9, &hEE, &h6A, &h6F_
 , &h5E, &hF7, &hF3, &h0E)
 
 ?a
 Sleep
 
 '  FB 1.05 32Bit Test.asm
 '.Lt_0002:
 'push 0
 'push -1
 'push 5
 'push 52
 'push 181
 'push 0
 'push 0
 'push 0
 'push 4
 'push 8
 'push 44
 'push 1
 'push 0
 'push 0
 'push 88
 'push 2
 'push 0
 'push 0
 'push 82
 'push 68
 'push 72
 'push 73
 'push 13
 'push 0
 'push 0
 'push 0
 'push 10
 'push 26
 'push 10
 'push 13
 'push 71
 'push 78
 'push 80
 'push 137  ^Erster Wert
 'push 32  <- nur 32 Werte
 'call _fb_CHR
 
 
 'FB 1.05 64Bit Test.c
 'FBSTRING* fb_CHR( int32, ... );
 '                    erster Wert >
 'FBSTRING* vr$1 = fb_CHR( 32, 137ll, 80ll, 78ll, 71ll, 13ll, 10ll, 26ll, 10ll, 0ll, 0ll, 0ll, ......... );
 '                         ^nur 32 Werte
 | 
 _________________
 Warnung an Choleriker:
 Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
 |  |  
		| Nach oben |  |  
		|  |  
		| UEZ 
 
  
 Anmeldungsdatum: 24.06.2016
 Beiträge: 147
 Wohnort: Opel Stadt
 
 | 
			
				|  Verfasst am: 18.03.2017, 19:48    Titel: |   |  
				| 
 |  
				|  	  | grindstone hat Folgendes geschrieben: |  	  | PS.: Wäre es nicht am einfachsten, das Bild als Ressource in das Programm einzubinden?
 | 
 
 Auch eine Möglichkeit, vielleicht sogar die bessere Wahl. Ich muss nur noch herausfinden, wie das unter FB geht.
 _________________
 Gruß
 UEZ
 |  |  
		| 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.
 
 |  |