Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Andt2018
Anmeldungsdatum: 22.12.2017 Beiträge: 7
|
Verfasst am: 01.09.2018, 12:59 Titel: Dateien automatisch in den Ram laden |
|
|
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..
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.09.2018, 19:56 Titel: |
|
|
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, 17:34, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Andt2018
Anmeldungsdatum: 22.12.2017 Beiträge: 7
|
Verfasst am: 02.09.2018, 12:01 Titel: |
|
|
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 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 02.09.2018, 22:49 Titel: |
|
|
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. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 03.09.2018, 13:05 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 03.09.2018, 17:33 Titel: |
|
|
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 |
|
|
|