Lpc Manpages

KONZEPT
	arrays, Felder

BESCHREIBUNG
	Felder werden durch Zeiger auf ihre Feldelemente deklariert:

	string *feld;
	mixed *feld;
	int *feld;
	object *feld;

	Den so deklarierten Zeigern koennen dynamisch Elemente
	zugeordnet werden. Der benoetigte Speicherplatz wird dabei
	automatisch reserviert. Es ist also kein allocate() noetig.

	feld = ({});			Ein leeres Feld
	feld = ({ 0,0,0 });		Ein Feld mit drei Elementen
	feld = allocate(3);		Dasselbe...
	feld = ({ "a","b","c" });	in strings.

	Felder koennen auch bei der Deklaration initialisiert werden,
        dies ist jedoch nur bei globalen Variablen moeglich:

	string *feld = ({});
	string *feld = ({ 0,0,0 });
	string *feld = ({ "a", "b", "c" });

	Felder werden grundsaetzlich immer ueber ihre Zeiger
	angesprochen. Beim Kopieren wird einfach nur der entsprechende
	Zeiger kopiert. Das Feld wird geloescht (d.h. der belegte
        Speicher freigegeben), wenn kein Zeiger mehr auf die Felder
	verweist.

	Ein Feld kann durch die ueblichen Operatoren erweitert und
	verkuerzt werden:

	feld += ({ "hugo" });
	feld += ({ "hugo", "otto" });	fuegt die Elemente "hugo" und
					"otto" dem Feld hinzu.

	feld -= ({ "hugo" });		entfernt alle Elemente mit Inhalt
					"hugo" aus dem Feld!

	Die Laenge eines Feldes erhaelt man mittels

	laenge = sizeof(feld);

	Ist die Laenge eines Feldes groesser als 0, kann man die
	Elemente wie folgt ansprechen:

	feld[0]              = "IMMER das erste Element";
	feld[sizeof(feld)-1] = "IMMER das letzte Element";

	Falls (sizeof(feld)=0) ergibt sich jedoch eine Fehlermeldung.
	Man kann die Elemente auch von "hinten" indizieren:

	feld[<1]  = "IMMER das letzte Element";
	feld[<2]  = "IMMER das vorletzte Element";

	Das Herausholen eines Sub-Feldes geschieht durch

	subfeld = feld[6..8];
	subfeld = feld[6..];	entspricht feld[6..<1]
	subfeld = feld[6..<2];
	subfeld = feld[<2..<1];

	Mehrdimensionale Felder sind selbstverstaendlich moeglich.
	Dabei sind die Elemente eines Feldes selbst wieder Felder
	(d.h. also Zeiger auf Elemente). Sie koennen in der Form

	element = feld[7][3];

	angesprochen werden. Das indizierte Feld kann auch ein
	Funktionsaufruf sein:

	element = func()[2];

VORSICHT
	Gibt eine Routine ein Feld zurueck, so wird tatsaechlich
	nur der Pointer auf das Feld uebergeben. Das Objekt, welches
	diesen Pointer erhaelt, kann nun den Inhalt des Feldes
	aendern, egal wie das Feld deklariert ist.
	(auch private schirmt nicht ab!)

TIP
	Routinen sollten das Feld in ein temporaeres Feld
	umkopieren und dessen Pointer uebergeben:

	string *feld;	/* globale Variable */

	string *query_feld() {
	  return ({})+neu_feld; /* Kopie der Variable feld */
	}

SIEHE AUCH:
	allocate, types