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:

Dateien automatisch in den Ram laden

 
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
Andt2018



Anmeldungsdatum: 22.12.2017
Beiträge: 7

BeitragVerfasst am: 01.09.2018, 11:59    Titel: Dateien automatisch in den Ram laden Antworten mit Zitat

Hallo ich möchte automatisch Dateien in einem Array laden, für den Arrey zu grosse, lerre Dateien oder Ordner werden dabei gefiltert.
Das klappt mit meinem Code, alledings stelle ich mir die Frage ob das ganze auch elegant geht.. grinsen
Code:
dim as ubyte loaded_data (1000000)
dim as uinteger next_data_ptr
type header_data
    filename as string
    filesize as uinteger
    filepointer as uinteger
end type

open pipe "DIR *.* /B" for input as #1
dim as string fn
dim as uinteger filecounter
dim as uinteger loaded,not_loaded

'count files
do
    input #1,fn
    filecounter+=1
loop until eof(1)=-1
close #1
open pipe "DIR *.* /B" for input as #1
dim as header_data header(filecounter)
dim as uinteger header_nr
do
    sleep 1
    cls
    locate 1
    PRINT "LOADING.."
    PRINT "FREEMEMORY : ";ubound(loaded_data)-next_data_ptr
    PRINT "LOAD FILE..";
    input #1,fn
    print fn
    if open (fn for binary access read as #2) = 0 then
        if lof(2) > 0 and lof(2) < ubound(loaded_data)-next_data_ptr then
            dim as ubyte buffer(lof(2))
           
            get #2,,buffer()
            with header(header_nr)
                .filename = fn
                .filesize = lof(2)
                .filepointer = next_data_ptr
           
           
                if ubound(loaded_data)-next_data_ptr < .filesize then PRINT "FILE TO BIG" : not_loaded + = 1 : CLOSE #2 : CONTINUE DO
                dim as uinteger buffercount
                for i as integer = next_data_ptr to next_data_ptr + ubound(buffer)
                    loaded_data(i)=buffer(buffercount)
                    buffercount+=1
                next
                next_data_ptr+=ubound(buffer)+1
                color 15
                PRINT "FILE LOADED TO -> ";HEX(@loaded_data(0) + . filepointer)
                loaded + = 1
            end with
        else
            color 4
            print "FILE EMPTY?? / FILE TO BIG"
            not_loaded + = 1
        end if
    else
        color 4
        print "ERROR OPENING : ";FN
        not_loaded + = 1
    end if
    if freefile = 3 then close #2
    color 7
loop until inkey <> "" or eof(1)=-1
PRINT "READY"
PRINT "LOADED :";loaded ; " OBJECTS"
PRINT "NOT LOADED : ";not_loaded ; " OBJECTS"
sleep
[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.09.2018, 18:56    Titel: Antworten mit Zitat

1) Das sieht mir von der Struktur her sehr nach einer C - Übersetzung aus.
2) Ein paar Kommentare hätten die Analyse des Programms sehr erleichtert. Und
3) ja, es geht eleganter (und auch deutlich schneller):
Code:
#Include "dir.bi"

Dim As String loaded_data, fn
Dim As UInteger next_data_ptr, not_loaded
Dim As UInteger MAX_LEN = 1000000 'maximale archivlänge

Type header_data
   filename As String
   filesize As UInteger
   filepointer As UInteger
End Type

ReDim As header_data header(0)

fn = Dir("*", -1 Xor fbDirectory) '1. datei
Do While Len(fn) 'wenn datei gefunden
   Cls
   Color 7
   Print "LOADING.."
   Print "FREEMEMORY : ";MAX_LEN - Len(loaded_data)
   Print "LOAD FILE..";fn
   Open fn For Binary Access Read As #2
   If (Len(loaded_data) + Lof(2) <= MAX_LEN) AndAlso (Lof(2) > 0) Then 'datei weder zu groß noch leer
      ReDim Preserve header(UBound(header) + 1) 'neuen header anlegen
      With header(UBound(header))
         .filename = fn
         .filesize = Lof(2)
         .filepointer = Len(loaded_data) + Lof(2) 'next_data_ptr   
         loaded_data += Input(Lof(2), 2) 'dateiinhalt an archiv anhängen
         Color 15
         Print "FILE LOADED TO -> ";Hex(StrPtr(loaded_data) + .filepointer) 'speicheradresse
      End With
   Else
      Color 4
      Print "FILE EMPTY?? / FILE TOO BIG"
      not_loaded += 1
   EndIf
   Close 2   
   fn = Dir("", -1 Xor fbDirectory) 'nächste datei
Loop

Color 7
Print
Print UBound(header);" LOADED FILES  (";Len(loaded_data);" BYTES )"
Print not_loaded;" NOT LOADED FILES"
Sleep


Allerdings bin ich mir nicht sicher, ob filepointer wirklich auf den Beginn der folgenden Datei zeigen soll.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 03.09.2018, 16:34, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Andt2018



Anmeldungsdatum: 22.12.2017
Beiträge: 7

BeitragVerfasst am: 02.09.2018, 11:01    Titel: Antworten mit Zitat

Ich bin gerade dabei eine Gameengine zu schreiben, das einzigste was schrott war ist eben mein Fileloader gewesen.
Danke jetzt weiss ich ich wie die Funktionen schreiben soll.
Sehr schön gemacht lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.09.2018, 21:49    Titel: Antworten mit Zitat

Andt2018 hat Folgendes geschrieben:
Ich bin gerade dabei eine Gameengine zu schreiben.
In diesem Fall ist es besser, einen ZString statt eines variablen Strings als Datenpuffer zu benutzen. Grund: Ein "normaler" String wird möglicherweise im Speicher verschoben, wenn er verändert wird, man müsste also vor jedem Lesezugriff die Gültigkeit des Pointers überprüfen. Ein ZString dagegen bleibt während der gesamten Programmlaufzeit, wo er ist, da ihm sein Speicher beim Programmstart fest zugeteilt wird.

Ich habe den obigen Programmschnipsel entsprechend geändert.

Gruß
grindstone

P.S.: Ich hoffe, du stellst deine Engine mal vor., wenn sie fertig ist. lächeln
_________________
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
nemored



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

BeitragVerfasst am: 03.09.2018, 12:05    Titel: Antworten mit Zitat

Bei ZSTRING natürlich dann mit Nullbytes aufpassen, falls vorhanden.
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 03.09.2018, 16:33    Titel: Antworten mit Zitat

Stimmt. Len bei einem ZString zählt nur bis zum ersten Nullbyte, im Gegensatz zum String, dort wird die echte Länge zurückgegeben. Vielen Dank für den Hinweis. Also: Zurück zur ersten Version.

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
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