dynamische Arrays?

merlin

Level-1
Beiträge
184
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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?
 
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.
 
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.
 
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?

Thomas



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
 
Zurück
Oben