Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.03.2007, 03:51 Titel: Array's |
|
|
Hi, hab ma wieder 'ne Frage...
Kann man bei einem Array einträge ab einer bestimmten position einfach vor bzw zurück verschieben,
Beispiel, ich hab ein Array mit 100 einträgen, will den 50 Eintrag löschen, so das der 51 Eintrag und die folgenen dann um einen eintrag vorgeschoben werden... habe das bislang mit einer For Next, Array (xx+1) = Array (xx) gemacht, ist nicht gerade sehr effektiv.... |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 01.03.2007, 11:32 Titel: |
|
|
Hi,
wenn es tatsächlich nur mit umkopieren machbar ist, gibt es keine andere Lösung.
Du solltest aber mal darüber nachdenken ob nicht eine Kennzeichnung dieses Eintrags als 'gelöscht' (wie in Datenbanken) möglich ist.
Z.B. alle Werte sind normal positiv, ein Eintrag von -1 wird 'übersprungen', das erspart das umkopieren. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.03.2007, 12:25 Titel: |
|
|
Ich habe mich mit diesem Problem auch lange beschäftigt.
Wenn es um Array Zugriffe geht, die Daten wie ein Schieberegister (Buffer behandeln sollen) dann gibts da nur die rabiate Lösung.
For x = 1 to max -1
array(x) = array(x+1)
next
andernfalls, wenn du vor hast, z.B. Zugriffe auf ArrayTypen, die Daten beinhalten. z.B. Socket-Listen, oder dergleichen, kansnt du das mit einem Zusätzlichen Flag in dem Type Realisieren. Dafür gäbe es dann 2 Möglichkeiten der Optimierung.
[VB]
Code: | Private Type MeinTyp
V_InUse as boolean 'Die Prüfung ob dieser Arrayeintrag innutzung ist
V_SocketID as Long 'Die Socket-ID, oder was man auch immer machen will
End Type |
So sähe dann die Typen-Struktur aus. Bei einer Prüfung kann man nun so vorgehen.
Ein Leeren eintrag erstellen / suchen:
Code: | Dim ID as long
ID = 0
For x = 1 to max
If Array(x).V_InUse = False then
ID = x
exit for
endif
next
if id = 0 then 'Wenn keines gefunden wurde, dann neues erstellen
max = max + 1
id = max
redim preserve Array(max) as MeinTyp
endif
array(id).V_InUse = true
'ID kannst du jetzt z.B. deiner Funktion zurück geben. |
Zum leeren / Löschen brauchst du auch nur das V_InUse Flag auf False zu setzen. Ohne Daten zu löschen
Eine 2te Optimierung wäre die Eintragung in eine "EmptyListe", wodurch lange suchzeiten nach leeren Array einträgen gespart wird.
Array Löschen
Code: | Array(LöschID).V_InUse = false
For x = 1 to LeerArrayListeMax
if LeerArrayListe(x) = 0 then
LeerArrayListe(x) = LöschID
exit for
endif
next |
Dann braucht man später nur in der liste nach sehen, welche IDs schon leer sind., und muss nicht das ganze Array nach dem Flag durchsuchen.
Das Flag ist allerdings nötig, um GENAU zu prüfen, ob man ein Aktiven Eintrag nutzt. Das hilfe Fehler zu beseitigen!!
Code: | Dim ID as long
ID = 0
For x = 1 to LeerArrayListeMax
If LeerArrayListe(x) > 0 then
ID = LeerArrayListe(x)
LeerArrayListe(x) = 0
exit for
endif
next
if id = 0 then 'Wenn keines gefunden wurde, dann neues erstellen
max = max + 1
id = max
redim preserve Array(max) as MeinTyp
endif
array(id).V_InUse = true
'ID kannst du jetzt z.B. deiner Funktion zurück geben. |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.03.2007, 12:54 Titel: |
|
|
Danke, das ist mal 'ne ganz gute Idee auf die ich hätte selbst kommen müssen denn nach einigen Gedanken könnte ich das Array nach dem löschen gar nicht verscheiben weil ich so endlos viele Daten in anderen Variablen mit umschreiben müsste und das würde dann wohl etwas zu weit führen von der Geschwindigkeit mal ganz abgesehen....
in meinem Fall kommt aber leider nur die erste Methode in Frage, da das Array anfangs leer und erst im verlauf des Programms genutzt wird... |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.03.2007, 15:57 Titel: |
|
|
Das läst sich allerdings auch mit den anderen Möglichkeiten machen! .. Diese sind genauso ausgelegt, das auch hier das Array von anfang an Leer ist (keine einträge hat), udn es später stück für stück gefüllt wird.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 01.03.2007, 17:56 Titel: |
|
|
In Scheme bestehen Listen aus Wertepaaren, von denen der zweite jeweils ein Zeiger auf das nächste Listenelement ist. Das bedeutet auf der einen Seite, dass man sich zum Auslesen eines Listenelements immer erst durch die ganze Liste hangeln muss. Andererseits lässt sich da ein Element leicht löschen oder einfügen. Zum Löschen von Feld 50 muss lediglich der Zeiger des Feldes 49 auf das Feld 51 gesetzt werden.
Je nach Anwendungsgebiet kann man sich so einen Datentyp sicher selbst schreiben. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.03.2007, 18:00 Titel: |
|
|
falsch!
Das reicht leider nicht aus! .. denn, wenn feld 51 ebvenfalls leer ist, muss trotzdem eien schleife ein gebaut werden, welche solange ein befülltes element sucht, auf das der zeigen deuten kann. (aber, ich gebe zu, das dies eine weitere optimierung ist)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.03.2007, 18:06 Titel: |
|
|
Als ich den Entschluss gefasst habe mir für mein Projekt eine dynamische Engine zu schreiben konnte ich nicht ahnen das die vorher getesteten einzelnen funktionen so komplex werden würden. Es geht mir dabei ja darum das ich eine Grafik in einen Screen laden will, der automatisch einen Freien platz dafür sucht die Daten speichert und verteilt anhand des geladenen Scripts, welcher Typ die Grafik ist wozu sie gehört, ob es einer Animations-Sequenz gehört ect... bin gröstenteils noch mit dem UDT Aufbau beschäftigt, den ich möchte später nur noch sagen, Usereingabe, Verarbeitung, Bildaufbau fertig... _________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 01.03.2007, 18:28 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | falsch!
Das reicht leider nicht aus! .. denn, wenn feld 51 ebvenfalls leer ist, muss trotzdem eien schleife ein gebaut werden, welche solange ein befülltes element sucht, auf das der zeigen deuten kann. (aber, ich gebe zu, das dies eine weitere optimierung ist) |
Die Nummer 51 ist mir doch völlig egal. Ich schaue, worauf das 50. Element verweist (und das kann nicht leer sein, sonst wäre die Liste unterbrochen) und lasse nun einfach das 49. Element auf dieses verweisen. Die Nr. 51 wird damit automatisch zu Nr. 50.
Wenn es unverständlich ist, versuche ich mal ein Beispiel einzustellen. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.03.2007, 18:40 Titel: |
|
|
ich glaub, ich weis schon worauf du hinaus willst.
Du verweist nicht "auf das nächste" element, sondern du verweist auf "das nächste element, DAS auf das nächste verweist" ..
aber, das ist n grosser unterschied
@Eternal ... tja .. is alles nicht so einfach. ... aber, Sieh es mal so .. du kannst nur dazu lernen, udnbeimnächsten versuch wird dein Projekt dann schon um einiges effektiver ...
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|