# einzelne CHAR aus String lesen in ST



## Gerri (3 April 2012)

Hallo, wie kann man in ST einzelne Zeichen aus einem STring bearbeiten.
Meine Vermutung Str1[x] := Str2[y]; ist leider nicht machbar


----------



## Mobi (3 April 2012)

Meinst du REPLACE?


----------



## Gerri (3 April 2012)

geht das auch ohne den LIB´s?


----------



## Mobi (3 April 2012)

Ne der ist in der Standard.lib.


----------



## zotos (3 April 2012)

Gerri schrieb:


> geht das auch ohne den LIB´s?



Kann Deine Steuerung mit Pointern umgehen (also z.B. CoDeSys basierend?) 

Ich kann Dir in Anlehnung an Dein Beispiel aus dem ersten Beitrag mal eine Beispiellösung mit Pointern posten.

Eins vorne Weg ich würde es mit der Standard.lib lösen und bin nicht von der folgenden überzeugt. Es geht mir lediglich darum aufzuzeigen wie es mit Pointern funktionieren könnte:


```
PROGRAM PLC_PRG
VAR
    myString1 : STRING := '123456789';
    myString2 : STRING := '123456789';

    myByteArray1 : ARRAY[0..255] OF BYTE;
    myByteArray2 : ARRAY[0..255] OF BYTE;

    ptString    : POINTER TO STRING;
    ptByteArray : POINTER TO ARRAY[0..255] OF BYTE;

    x : INT := 3;
    y : INT := 4;

END_VAR
```


```
(* String 1 in Bytearray umwandeln *)
ptString := ADR(myString1);
ptByteArray := ptString;
myByteArray1 := ptByteArray^;

(* String 2 in Bytearray umwandeln *)
ptString := ADR(myString2);
ptByteArray := ptString;
myByteArray2 := ptByteArray^;


(* Einzellnes Zeichen Umkopieren *)
myByteArray1[x] := myByteArray2[y];


(* Bytearray wieder in den String zurück wandeln *)
ptByteArray := ADR(myByteArray1);
ptString := ptByteArray;
myString1 := ptString^;
```


----------



## Simatiker (5 April 2012)

Hallo,

zu dem Beispiel von Zotos hab ich eine Anmerkung:
In CoDeSys (V3) erzeugt die Deklaration

```
VAR
   myString1:STRING;
END_VAR
```
einen String mit einer Länge von 80 Zeichen.
Richtig für Zotos Beispiel wäre dem zu Folge

```
VAR
   myString:STRING(255);
   ptString:POINTER TO STRING(255);
END_VAR
```

Zu deiner Frage:





> Hallo, wie kann man in ST einzelne Zeichen aus einem STring bearbeiten.


würde ich dir schon zu den Standard STRING Funktionen raten, aber auch mit Pointern kann man das sehr elegant lösen. Dann aber vorzugsweise mit zwei Pointern, welche jeweils auf ein Byte (Char) zeigen. z.Bsp.:

```
VAR
   myString1:STRING:='Hello';
   myString2:STRING:='a';
   ptby1,ptby2:POINTER TO BYTE;
END_VAR
```


```
ptby1:=ADR(myString1); (*Pointer zeigt auf den 1. character von myString1*)
ptby2:=ADR(myString2); (*Pointer zeigt auf den 1. character von myString2*)
ptby1[1]:=ptby2[0];(*in myString1 steht jetzt 'Hallo'*)
```
Das gilt aber nur für CoDeSys V3, bei V2.3 musst du den Pointer erst hoch zählen und dann immer mit ptby1^ auflösen.


----------



## zotos (15 April 2012)

Jetzt noch mal das ganze in kurz:


```
VAR
    myString1 : STRING := '123456789';
    myString2 : STRING := '123456789';

    ptrByteArray1 : POINTER TO ARRAY[0..79] OF BYTE;
    ptrByteArray2 : POINTER TO ARRAY[0..79] OF BYTE;

    x : INT := 3;
    y : INT := 4;

END_VAR
```


```
(* Pointer laden *)
ptrByteArray1 := ADR(myString1);
ptrByteArray2 := ADR(myString2);


(* Einzellnes Zeichen Umkopieren *)
ptrByteArray1^[x] := ptrByteArray2^[y];
```


----------

