TC2 Arrayzugriff mittels Adressarithmetik ?

Niels Herrmann

Level-2
Beiträge
5
Reaktionspunkte
0
Hallo,

um Funktionen oder Funktionsbaustein so flexibel wie möglich zu gestalten, Überlege ich zurzeit wie man auf Arrays verschiedener Größe zugreifen kann.

Meine Idee ist dabei wie folgt : Ich Übergebe den Baustein die Adresse des Arrays (ADR), die Gesamtgröße des Arrays (SIZEOF) sowie die Große des Array Datentyps (SIZEOF)
Mit der Gesamtgröße sowie der Datentypgröße kann ich die Anzahl der Elemente im Array bestimmen. Mit der Adresse und der Datentypgröße sowie der Elementnummer kann ich einen Adresse von jedem Arrayeintrag ermitteln.

Jetzt ist mir nur noch nicht klar wie ich über die Adresse auf eine Variable Schreiben kann. Mit einem Pointer kann ich von einer Adresse lesen. Wie kann ich mit der Adresse sowohl lesend als auch schreibend zugreifen?

Kann das Überhaupt so funktionieren oder bin ich da auf dem Holzweg?
Ich hoffe das ich meine Problemstellung einigermaßen nachvollziehbar rüberbringen konnte. :)
Die Fragestellung bezieht sich auf Twincat2 da man bei TC3 ja Arrays verschiedener Größe übergeben kann
[*].
 
Zuletzt bearbeitet:
Hallo Niels,

Du mußt den Pointer dereferenzieren. Dazu schreibst Du hinter den Pointer einfach den Akzent ^

Also:

Code:
x : INT;
y : INT;
p_x : Pointer to INT;

x := 3;

p_x := ADR(x); --> p_x zeigt jetzt auf x, enthält also eine Adresse

y := p_x^; --> y ist jetzt gleich 3

p_x^ := 5; --> x ist jetzt gleich 5

Mit Deiner Pointerarthmetik geht das dann über das Array:

Code:
myArray : Array[0..10] of INT;
pArray : POINTER TO INT;
sizeof_INT : DINT;

pArray := ADR(myArray[0]);
sizeof_INT := SIZEOF(myArray[0]);

pArray  --> zeigt auf myArray[0]
pArray + DINT_TO_DWORD(x * sizeof_INT) --> Ergebnis zeigt auf myArray[x]

Gruß
Jens
 
Zurück
Oben