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

 
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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.03.2007, 03:51    Titel: Array's Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 01.03.2007, 11:32    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.03.2007, 12:25    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.03.2007, 12:54    Titel: Antworten mit Zitat

Danke, das ist mal 'ne ganz gute Idee auf die ich hätte selbst kommen müssen lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.03.2007, 15:57    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 01.03.2007, 17:56    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.03.2007, 18:00    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.03.2007, 18:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



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

BeitragVerfasst am: 01.03.2007, 18:28    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.03.2007, 18:40    Titel: Antworten mit Zitat

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 zwinkern

@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 ... Zunge rausstrecken


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
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
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