Seite 1 von 1

ReDim

Verfasst: 11.11.2005 01:19
von Nero
Nabend,

Ich habe mir eben mal eine ReDim Procedure geschrieben mit der man
Arrays vergrößern oder verkleinern kann.
Vieleicht kann es ja noch jemand hier brauchen.

Der Procedure einfach den Pointer des Arrays, die neue länge und die länge der array felder (nur bei structuren wichtig ansonsten NULL oder 4 übergeben)

Es wird der Pointer auf das neue Array zurückgegeben den einfach dem alten Array zuweisen und vertig.

Kleiner Beispiel code

Code: Alles auswählen

Procedure ReDim(Pointer.l, Len.l, Fieldlen.l)

fLen.l = SizeOf(LONG)

If Fieldlen <> 0 : fLen = Fieldlen : EndIf

Fields.l = PeekL(Pointer - 8)
If Len < Fields 
    
  PokeL(Pointer - 8, Len + 1)
  ProcedureReturn Pointer
Else

oldArrayLen.l = (Fields * fLen + 8) 
newArrayLen.l = (Len * fLen)


newArray = AllocateMemory(newArrayLen + 8)
CopyMemory(Pointer - 8, newArray, oldArrayLen)

PokeL(newArray, newArrayLen)

ProcedureReturn newArray
EndIf
EndProcedure

Structure User
      ID.l
      Files.l
EndStructure

Dim StructTest.User(0)

StructTest(0)\ID = 1
StructTest(0)\Files = 2000

Debug StructTest(0)\ID
Debug StructTest(0)\Files

StructTest() = ReDim(@StructTest(), 9, 8)

StructTest(0)\ID = 1
StructTest(0)\Files = 91532
StructTest(3)\ID = 4
StructTest(3)\Files = 1010101
StructTest(7)\ID = 8
StructTest(7)\Files = 9000
StructTest(9)\ID = 10
StructTest(9)\Files = 123123

Debug StructTest(0)\ID
Debug StructTest(0)\Files
Debug StructTest(3)\ID
Debug StructTest(3)\Files
Debug StructTest(7)\ID
Debug StructTest(7)\Files
Debug StructTest(9)\ID
Debug StructTest(9)\Files

StructTest() = ReDim(@StructTest(), 3, 8)

Debug StructTest(0)\ID
Debug StructTest(0)\Files
Debug StructTest(3)\ID
Debug StructTest(3)\Files

Ich habs auch mal als UserLib erstellt -> http://www.communityworld.de/redim.zip

Verfasst: 11.11.2005 14:10
von Nero
So hab nochmal ne kleinigkeit geändert.

http://www.communityworld.de/redim.zip oder einfach oben die Procedure nehmen

Verfasst: 11.11.2005 15:16
von NicTheQuick
Ich benutze dazu einfach nochmal [c]Dim[/c]. :?

Verfasst: 11.11.2005 16:31
von Nero
Stimmt schon der nutzen ist etwas fragwürdig *g* allerdings war es auch nur ne übung um mich mit dem aufbau und verwaltung der arrays im speicher etwas vertraut zu machen damit mein kleines projeckt losgehen kann.

Aber vieleicht hat auch jemand dafür verwendung daher hab ich es mal gepostet.

Verfasst: 11.11.2005 16:41
von Kaeru Gaman
als persönliche übung ist das auch gewiß nützlich ;)

und posten ist auch nicht verkehrt, vielleicht bekommst du ja von den echten speicherverwaltungs-cracks noch tipps.

Verfasst: 12.11.2005 00:18
von Nero
Naja jeder fängt klein an *g*

Hab PB jetzt schon so lange und nie wirklich was mit gemacht das will ich
nun mal ändern und da dachte ich mir ich bau mir nen Level editor für RPG maps.

Najo leider gefiel mir die technik wie die sprites aus nem tileset
geschnitten werden nicht was mich widerum zu einem eigenem TileSet format inspirierte :) Dann fand ich von MVXA den thread über seine RamDisk welche sich dazu recht gut eignete nur war sie noch nen weng Bugy er hatt sie zwar gefixt und mir den Code gegeben allerdings
gibts da keine Verzeichnis structur und er nuzt dafür Linked list was mir nicht gefiel daher bin ich vom Level Editor zum TileSet format und nun bei ner eigenen implementation eines MemoryDrives auf basis von arrays zu erstellen gelandet. :?
Das grobe DateiSystem hab ich mir schon ausgearbeitet nur ohne das notige wissen über arrays und wie man die im speicher am besten manipuliert will ich es erst garnicht anfangen also erstmal fleisig übungs code tippen. :)

Über umwege kommt man halt auch irgentwann mal zum Ziel *lol*

Verfasst: 12.11.2005 10:23
von Kaeru Gaman
ich persönlich verwende lieber einzelsprites statt eines tisets.

im graka-speicher beansprucht das auch nicht mehr platz,
und das clipping zur laufzeit entfällt.

Verfasst: 12.11.2005 13:24
von Nero
Geht mir genauso nur ich mag es nicht wen ich massig einzelne images dafür
in nem ordner habe. Mit so nem MemDrive läst sich das aber umgehen und man kann auch seine Maps und die verschiedenen layer darin speichern ohne sich groß gedanken über ein map format zu machen welches alles beinhaltet
einfach einfach den memdrive laden und man hat auf alle nötigen daten zugrif direckt im speicher kann sie dort ändern und wen man vertig ist einfach den MemDrive sichern.

Es ist halt universell einsetzbar und muß ja auch nicht unbedingt nur für Maps ect. herhalten.