|
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: 129 Wohnort: Opel Stadt
|
Verfasst am: 24.06.2016, 13: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: 1212 Wohnort: Ruhrpott
|
Verfasst am: 24.06.2016, 16: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 24.06.2016, 16:22 Titel: |
|
|
Vielen Dank grindstone.
Ich werde es gleich probieren. _________________ Gruß,
UEZ |
|
Nach oben |
|
|
UEZ
Anmeldungsdatum: 24.06.2016 Beiträge: 129 Wohnort: Opel Stadt
|
Verfasst am: 24.06.2016, 16: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: 1212 Wohnort: Ruhrpott
|
Verfasst am: 24.06.2016, 19: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 24.06.2016, 19: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 16.03.2017, 16: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: 4599 Wohnort: ~/
|
Verfasst am: 16.03.2017, 17: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 16.03.2017, 17: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 16.03.2017, 18: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: 1212 Wohnort: Ruhrpott
|
Verfasst am: 16.03.2017, 20:18 Titel: |
|
|
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.
| Ich würde als Alternative die gute(n) alte(n) DATA - Zeile(n) vorschlagen.
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: 1875 Wohnort: D59192
|
Verfasst am: 17.03.2017, 13: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 17.03.2017, 17: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, 18: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: 1875 Wohnort: D59192
|
Verfasst am: 17.03.2017, 18: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: 1212 Wohnort: Ruhrpott
|
Verfasst am: 18.03.2017, 12: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: 1875 Wohnort: D59192
|
Verfasst am: 18.03.2017, 15: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: 129 Wohnort: Opel Stadt
|
Verfasst am: 18.03.2017, 20: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.
|
|