# Array index 0 oder 1 beginnen



## robiman (28 März 2019)

Hab mal eine Frage an die Allgemeinheit
Wie geht ihr damit um?
Ach ja, mir geht's speziell um TIA

Ist es sinnvoller/praktischer ein Array von 0 an oder von 1 an zu benutzen

Also quasi wenn ich 10 Elemente benötige
Array[0..9]
oder 
Array[1..10]
oder
Array[0..10]
wobei ich bei letzten ja 11 Elemente habe

Ich benötige die Array für die verschiedensten Zwecke bis hin natürlich für die HMI
Standard Daten, Strings oder auch UDT's

Ich find das immer etwas unschön index 0 auch zu benutzen


----------



## faust (28 März 2019)

robiman schrieb:


> ...
> Ich find das immer etwas unschön index 0 auch zu benutzen
> ...



Hallo robiman,

Bit0 addressierst du aber doch mit Sicherheit auch ...


Gruß, Fred


----------



## MFreiberger (28 März 2019)

Moin robiman,

ich halte es für sinnvoller mit 0 zu beginnen, da es einige SIEMENS-Bausteine gibt, die sowieso immer bei 0 beginnen (ich meine Serialize und Deserialize gehören auch dazu).
Auch wenn Du mit der MOD-Funktion einen Ringpuffer bespaßt ist natürlich der beginn bei 0 sinnvoll.

Andererseits kann es helfen, wenn man 10 Messwerte hat, die den Sensoren 1-10 zugeordnet sind, auch ein Array bei 1 zu beginnen.

Das ist also immer Aufgabenspezifisch.

Ich verwende einen Index, der bei 0 beginnt eigentlich immer dann, wenn es um programminterne Berechnungen/Schleifen geht.
Andere "Indexstarts" verwende ich, wenn es sinnvoll ist (Zuordnung INDEX des Array <> andere Variable).

VG

MFreiberger


----------



## blackpeat (28 März 2019)

Immer bei 0 wenn ich 10 brauche wo sich aber 1-10 besser eignen bleibt 0 auch mal leer. Oder 0 wird zum initialisieren genutzt.


----------



## vollmi (28 März 2019)

Grundsätzlich bei 0 angefangen. Wenn es um standardarrays geht wo der arrayplatz keine weitere bedeutung hat oder eher für die Wertigkeit steht. Wenn der Arrayplatz allerdings einen zusammenhang mit dem Objekt hat, dann nummeriere ich auch mal ganz unkonventionell.

Ich hab z.B. 100 Klappen die nummeriert sind. Auf 5 CPUs verteilt. dann haben die Klappen auf CPU eins den Arrayplatz 1..22 auf cpu 2 arrayplatz 23..54 etc. Auf diesen CPUs fangen die arrays dann entsprechend bei 23 an und enden bei 54.
Auf der Mastercpu kopiere ich diese Arrays dann in ein masterarray von 0..100

mfG René


----------



## robiman (28 März 2019)

bin auf das Thema gekommen wie ich Daten zu Regalplätzen ablegen muss
Da gibt es halt den Platz 0 nicht

In diesen speziellen Fall habe ich jetzt auch von 1 begonnen
Hatte bis heute noch nie was an der vorgegeben Einstellung 0  bei Array[0..1] geändert, immer nur die "bis" Größe


----------



## MFreiberger (28 März 2019)

Moin robiman,

bei den Regalen unterschiedlicher Hersteller, mit denen ich mich bisher im RetroFit befassen musste, hat die Regalmatrix tatsächlich immer mit 1 begonnen. Allerdings waren häufig die E/A-Plätze vorgelagert und für diese habe ich dann die Koordinate 0 verwendet.

VG

MFreiberger


----------



## Ralle (28 März 2019)

Array, die auch mit HMI-VAriablen im TIA verbunden werden unbedingt mit 0 beginnen, da es sonsdt zu "Verschiebungen" bei der Anzeige der Daten im HMI kommt.


----------



## robiman (28 März 2019)

Ist mir grad vor einer Stunde auf die Füße gefallen
Array geht jetzt bei 0 los dann ist auch bei  Index Variable=1 auch im Array das Element 1 angesprochen

Bei Index =1  wird sonst bei Array Deklaration Array1..10       das Element 2 angesprochen :evil:, also quasi intern wird immer von 0 gezählt


----------



## Heinileini (28 März 2019)

robiman schrieb:


> Ist mir grad vor einer Stunde auf die Füße gefallen
> Array geht jetzt bei 0 los dann ist auch bei  Index Variable=1 auch im Array das Element 1 angesprochen
> Bei Index =1  wird sonst bei Array Deklaration Array1..10       das Element 2 angesprochen :evil:, also quasi intern wird immer von 0 gezählt


Ich habe keine Ahnung, *was* Dir in Wirklichkeit *wohin* gefallen ist, aber gefallen hat mir Dein post #9 ganz und gar nicht.
Wie meinst Du das??? Waren die ganzen Antworten jetzt für die Katz? 

Gruss, Heinileini


----------



## PN/DP (28 März 2019)

Er meint vermutlich das spezielle Siemens-Feature, daß bei Arrays, die mit HMI-Variablen verbunden sind, das Array mit Index 0 beginnen MUSS, wie Ralle oben in #8 erwähnte.

Harald


----------



## xperia (28 März 2019)

Bei TIA beginne ich meistens mit Index 1.
Wenn z.b. die Länge eines Arrays über eine Konstante bestimmt wird, 
finde ich es somit lesbarer bei der Verwendung von FOR Schleifen.



```
FUNCTION "Test" : Real
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_IN_OUT 
      Values : Array[1..#NUMBER_OF_VALUES] of Real;
   END_VAR


   VAR_TEMP 
      i : Int;
      Averrage : Real;
   END_VAR


   VAR CONSTANT 
      NUMBER_OF_VALUES : Int := 10;
   END_VAR




BEGIN
	
	#Averrage := 0.0;
	FOR #i := 1 TO #NUMBER_OF_VALUES DO
	    #Averrage := #Averrage + #Values[#i];
	END_FOR;
	
	#Test := #Averrage / #NUMBER_OF_VALUES;
END_FUNCTION
```


Natürlich kann ich der Konstante auch den Wert 9 zuweisen und das Array bei 0 beginnen lassen.
Dann müsste ich meine Konstante auch umbennen damit diese auch in anderen Programmteilen wieder Sinn macht.





```
#Averrage := 0.0;
	FOR #i := 0 TO #NUMBER_OF_VALUES_MINUS_1 DO
	    #Averrage := #Averrage + #Values[#i];
	END_FOR;
	
	#Test := #Averrage / (#NUMBER_OF_VALUES_MINUS_1 + 1);
```


----------

