Seite 1 von 1
Array verschieben...
Verfasst: Mi Mär 18, 2009 3:58 pm
von Jside
Mal eine Frage, ich habe ein Array, beidem ich eine Bestimmte Nummer (Array[<Nummer>]) auf NULL setzte möchte, wie kann ich jetzt den Rest des Arrays am besten verschieben, sodass der NULL Eintrag abgezogen wird? Muss ich dafür eine fette While-Schleife basteln, oder geht es auch einfacher/ressourcenschonender?
Verdeutlicht: von:
1,1,1,1,0,1,1,1,1
auf:
1,1,1,1,1,1,1,1
Re: Array verschieben...
Verfasst: Mi Mär 18, 2009 4:12 pm
von Kerli
Jside hat geschrieben:Muss ich dafür eine fette While-Schleife basteln, oder geht es auch einfacher/ressourcenschonender?
Einfacher ja. Ressourcenschonender nicht
Das Grund dafür ist das was du tun möchtest. Da du einen ganzen Speicherblock verschieben möchtest wird dir nichts anderes übrig bleiben als jeden Teil davon zu kopieren. Du kannst das natürlich mit einer Schleife machen, aber schöner wäre es zb mit '
memmove'.
Wenn du das Array verkleinern möchtest musst du dich noch natürlich selbst darum kümmern...
Re: Array verschieben...
Verfasst: Mi Mär 18, 2009 5:31 pm
von Dirty Oerti
Klüger wäre hier wohl evtl eine Liste.
Dann kannst du durch die Liste durchgehen, und wenn ein Element der Liste die Daten 0 enthält, dann entfernst du es einfach aus der Liste.
Kommt natürlich ganz drauf an, was du machen willst.
Re: Array verschieben...
Verfasst: Mi Mär 18, 2009 5:59 pm
von Jside
Also es geht darum, bei dem Multiplayer-part meiner nochnichts könnenden Engine Spieler zu entfernen, die entweder ein Clientseitiges Timeout haben, oder sich ausgeloggt haben, bei letzterem werden die Werte in einem typedef struct array[] auf NULL gesetzt(IP, Username etc.), bei einem Timeout von X Minuten(jede struct enthält ein Datum/Uhrzeit, der letzten Clientverbindung). Jetzt soll alle 10min eine Funktion ausgeführt werden, die das Player Array aufräumt, also bei Timeouts Daten sichern, und aus dem Array werfen, und bei logout dasselbe. Wenn NULL Werte dabei sind, ist es für das Programm nicht weiter schlimm, es ist ein Integer, mit der Spielerzahl vorhanden; wenn z.b. an alle User eine Message gesendet wird, wird mitgezählt, ob schon die Anzahl der Spieler erreicht ist, wenn nicht, wird die Schleife nicht unterbrochen(Die Sendefunktion hat einen Handler für fehlende Infos). Allerdings Flutet es den RAM unnötig, wenn da ewtl. Tonnenweise Leerer Variablen drin sind, die man sich hätte sparen können....
Ich könnte zwar Leere Slots "resyclen", daher, der nächste, der sich einloggt bekommt einen vorher freigemachten Slot, aber wie gesagt, man kann ja nicht davon ausgehen, das wenn sich z.b. 100 User ausloggen, auch wieder 100 User einloggen, und solange ist der RAM mit 0len zugedröhnt...
Re: Array verschieben...
Verfasst: Mi Mär 18, 2009 7:17 pm
von Dirty Oerti
Naja, also das solltest du auf jedenfall dynamisch über eine Liste lösen, finde ich.
Wird ein Element (= Spieler) nicht mehr gebraucht, dann kannst du einfach den Speicher freigeben nachdem du das Element aus der Liste entfernt hast.
Re: Array verschieben...
Verfasst: Do Mär 19, 2009 8:13 am
von Xin
Jside hat geschrieben:Ich könnte zwar Leere Slots "resyclen", daher, der nächste, der sich einloggt bekommt einen vorher freigemachten Slot, aber wie gesagt, man kann ja nicht davon ausgehen, das wenn sich z.b. 100 User ausloggen, auch wieder 100 User einloggen, und solange ist der RAM mit 0len zugedröhnt...
Es ist hervorragend sich darüber Gedanken zu machen, dass Du nicht zuviel Speicher verschwendest.
Aber bei sehr kleinen Datenstrukturen, da kann man auch mal fünfe grade sein lassen.
Es hat nämlich keinen Sinn, wenn Du statt 100 Nullen und Einsen die Sache mit aufwendigen Algorithmen und dynamischen Datenstrukturen aufbohrst, wenn der Verwaltungsakt dann dazu führt, dass Du mehr Speicher und mehr Rechenleistung verbrätst, um 10 Datensätze "optimiert" zu halten.
Mach Dir klar, wieviele Datensätze Du minimal und maximal brauchst und wenn das Peanuts sind, dann verdopple den maximalen Wert und fertig.
Dann packst du das ganze in eine Schnittstelle, so dass Du die Implementierung im Falle des Falles austauschen kannst und dann implementierst Du die billigeste Methode, die zuverlässig läuft.