# dynamische Arrays?



## merlin (21 Mai 2008)

Hallo

Gibt es eigentlich ein Array mit einer dynamischen Grösse zu erstellen?

Ich möchte einen FB erstellen der als OUT ein ARRAY OF STRING liefert. Dieses Array soll aber nicht immer die gleiche Grösse haben sonder ich muss im FB selbst die Grösse entscheiden. Lässt sich das machen?

Wie kann ich die Anahl der ARRAY-Einträge ermitteln?
ARRAY[1..10] OF STRING sind 9 Arrayeinträge. Gibts ne Funktion die mir das ausgibt?

Besten Dank
Thomas


----------



## Larry Laffer (21 Mai 2008)

Hallo,
dynamische ARRAY's gehen nicht. Du könntest ein ARRAY aber auf deinen Max-Bedarf dimensionieren und über eine zusätzliche Variable mit ausgeben welche (wieviele) Elemente benutzt werden.

Gruß
LL


----------



## Ralle (21 Mai 2008)

merlin schrieb:


> Wie kann ich die Anahl der ARRAY-Einträge ermitteln?
> ARRAY[1..10] OF STRING sind 9 Arrayeinträge. Gibts ne Funktion die mir das ausgibt?
> 
> Besten Dank
> Thomas



Und es sind 10 Einträge nach Adam Riese !


----------



## merlin (21 Mai 2008)

Ich könnt ja damit leben dem FB einen IN mit ARRAY_SIZE anzugeben und das OUT dann mit AUSGABE[1..ARRAY_SIZE] OF STRING machen. Aber leider will ned mal das 

und die 2. Frage? Gibts ne Art UBound im TwinCAT?


----------



## drfunfrock (21 Mai 2008)

Du kannst auch mit Pointern auf ein Array arbeiten  und die Grösse des Array mitliefern. Ich habe mich dagegen lange gewehrt, aber manchmal ist es sinnvoll.


----------



## merlin (21 Mai 2008)

ähm, ja hört sich spannend an, wobei i grad gestehen muss, dass ma da ansatz fehlt.

wäre über ein beispiel dankbart.


----------



## drfunfrock (21 Mai 2008)

Da deklarierst einen Pointer p auf Byte. Der wird einer Adresse eines Arrayelementes initialisiert:

p := ADR(meinarray[23]);

Dann kannst du: 

p^ := 1; (* Byte beschreiben *)
a := p^; (* Byte lesen *)
p := p + 1; (* Pointer auf das nächste Arrayelement zeigen lassen *)

Wenn du dann einem FB noch die Grösse des Arrays mitteilst, kannste jede denkbare Schweinerei produzieren.


----------



## Scrat (30 Mai 2008)

merlin schrieb:


> Hallo
> 
> Wie kann ich die Anahl der ARRAY-Einträge ermitteln?
> ARRAY[1..10] OF STRING sind 9 Arrayeinträge. Gibts ne Funktion die mir das ausgibt?
> ...





Hallo Thomas,
mit der Funktion SIZEOF(ARRAY[1..10]) solltest Du die Größe ermitteln können.

Zum Thema dynamische Arrays: Das geht nicht. Arrays müssen ja zuvor deklariert werden, ob lokal oder global. Bei der Deklaration sind keine variablen zur Größenangabe zulässig. 
Wenn Du nun ein Array mit der Größe 1..10 hast, und du beschreibst das Array z.B. bei 0, oder bei 15 (das geht ohne Probleme) werden Variablen willkürlich beschrieben, welche sich  vor oder hinter diesem Speicherbereich  liegen. Dies kann sehr unangenehme folgen haben. Hierfür sollte  zusätzlich die Funktion CHECKBOUNDS verwendet werden.  Diese überwacht  eine Array-Überschreitung und verhindert diese, aber Achtung:  Diese Funktion kann je nach Anwendung die Systemlast hochsetzen.

Gruß
Benjamin


----------

