Array verschieben...

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Array verschieben...

Beitrag von Jside » Mi Mär 18, 2009 3:58 pm

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

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Array verschieben...

Beitrag von Kerli » Mi Mär 18, 2009 4:12 pm

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...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Array verschieben...

Beitrag von Dirty Oerti » Mi Mär 18, 2009 5:31 pm

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.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Array verschieben...

Beitrag von Jside » Mi Mär 18, 2009 5:59 pm

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...

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Array verschieben...

Beitrag von Dirty Oerti » Mi Mär 18, 2009 7:17 pm

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.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Array verschieben...

Beitrag von Xin » Do Mär 19, 2009 8:13 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten