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:

Array befüllen
Gehe zu Seite 1, 2  Weiter
 
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
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 24.06.2016, 12:54    Titel: Array befüllen Antworten mit Zitat

Hallo,

da ich mit FB neu angefangen habe, habe ich gleich eine Frage. happy

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 24.06.2016, 15:10    Titel: Antworten mit Zitat

Hallo und willkommen im Forum! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 24.06.2016, 15:22    Titel: Antworten mit Zitat

Vielen Dank grindstone.

Ich werde es gleich probieren. lächeln
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 24.06.2016, 15:36    Titel: Antworten mit Zitat

Was ist die Bedeutung von ... in
Zitat:
Dim tmpArray(0 To ..., 0 To ...)
?
_________________
Gruß,
UEZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 24.06.2016, 18:19    Titel: Antworten mit Zitat

Alte Technikerweisheit: "Wenn gar nichts anderes mehr hilft: Lesen Sie die Gebrauchsanleitung!" grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 24.06.2016, 18:30    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 16.03.2017, 15:26    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 16.03.2017, 16:07    Titel: Antworten mit Zitat

Um meine Nichtexperten-Meinung hier einzubringen grinsen 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
Benutzer-Profile anzeigen Private Nachricht senden
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 16.03.2017, 16:54    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Um meine Nichtexperten-Meinung hier einzubringen grinsen 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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 16.03.2017, 16:56    Titel: Antworten mit Zitat

Hallo,

nemored, ja, wenn man REDIM statt DIM verwendet, hat man das Problem AFAIR nicht. Aber dafür unterstützte REDIM (zumindest früher) die explizite Initialisierung der Arrays mit { } nicht.

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. lächeln

Was man auch probieren könnte, wäre beim Compilieren den Stack-Speicher per Kommandozeilenoption -t hochzusetzen:
Siehe dazu: https://www.freebasic-portal.de/befehlsreferenz/der-compiler-458.html

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
UEZ



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 16.03.2017, 17:32    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 16.03.2017, 19:18    Titel: Antworten mit Zitat

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. lächeln

Gruß
grindstone
_________________
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
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.03.2017, 12:37    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 17.03.2017, 16:57    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.03.2017, 17:19    Titel: MACRO Antworten mit Zitat

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, ... lächeln Ich hab auch nicht ausprobiert, wie viele Bytes das verkraftet.

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.03.2017, 17:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.03.2017, 17:43    Titel: Antworten mit Zitat

Stimmt, noch besser. Daraus könnte man ja auch ein MACRO machen, um es leicht für n einzubindende Dateien wiederverwenden zu können.

Ich glaube, im internationalen Forum gab es doch auch von djpeters mal eine Bibliothek dafür oder?
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 18.03.2017, 11:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 18.03.2017, 14:57    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 24.06.2016
Beiträge: 129
Wohnort: Opel Stadt

BeitragVerfasst am: 18.03.2017, 19:48    Titel: Antworten mit Zitat

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
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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