- Beiträge
- 21.965
- Reaktionspunkte
- 6.836
-> Hier kostenlos registrieren
Der Vorschlag von MFreiberger ist doch DIE Lösung und macht nicht wirklich mehr Arbeit. Um den Compiler dazu zu bringen, die Arraygrenzen automatisch irgendwo auslesbar hinzuschreiben, braucht man das interessierende Array nur an einen Baustein mit Array[*] übergeben. Der Baustein kann dann die Arraygrenzen zurückgeben:Man könnte auch einfach die Funktion UPPER_BOUND und LOWER_BOUND für Arrays freigeben die nicht über Variablen definiert werden. Dann kann man sich als Programmierer angewöhnen die Grenzen eines Arrays grundsätzlich über diese Funktionen zu ermitteln um niemals das Problem einer Grenzüberschreitung zu haben.Man könnte dafür eine FC spendieren. Innerhalb ein Array[*] of xyz (ich hoffe der Datentyp ändert sich nicht?). Darin UPPPER- und LOWER_BOUND verwenden und die Ober- und Untergrenze dann ausgeben.
Das man das ganze über Umwege lösen kann oder über Konstanten nur an einer Stelle gesammelt ändern muss ist mir klar. Würde man aber die Funktionen für oben genannte Arrays ebenfalls freigeben und nicht statt dessen einen Fehler generieren, würde man sich wieder einiges an "Handarbeit" sparen.
Code:
FUNCTION "FC_GetBounds_Int" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
ARR : Array[*] of Int;
END_VAR
VAR_OUTPUT
LB : DInt; // Lower_Bound
UB : DInt; // Upper_Bound
END_VAR
BEGIN
#LB := LOWER_BOUND(ARR := #ARR, DIM := 1);
#UB := UPPER_BOUND(ARR := #ARR, DIM := 1);
END_FUNCTION
Code:
#LowerB := LOWER_BOUND(ARR := "DB_Data".iArray, DIM := 1); //so nicht zulässig
#UpperB := UPPER_BOUND(ARR := "DB_Data".iArray, DIM := 1); //so nicht zulässig
"FC_GetBounds_Int"(ARR := "DB_Data".iArray, LB => #LowerB, UB => #UpperB); //so funktioniert es
Wo macht diese Lösung "einiges an Handarbeit"?
Harald