TIA SCL bestimmtes Zeichen aus String löschen

gerdh

Well-known member
Beiträge
88
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo !

ich habe einen String mit 68 Zeichen (es koenne auch gleiche mehrmals vorhanden sein) , und ich möchte ein bestimmtes Zeichen komplett rausloeschen egal wie oft es darin vorkommt.
Hat da einer einen Tip fuer den Ansatz ?
Bei For in habe ich doch das Problem sobald ich eines loesche passt die Zielposition nicht oder ?

Gruss gerd
 

JSEngineering

Well-known member
Beiträge
1.285
Punkte Reaktionen
338
Moin Gerdh,

da würde ich mit einer Schleife zeichenweise durchlaufen und die in einen neuen String kopieren. Halt eben nicht kopieren, wenn das das unerwünschte Zeichen ist.

Gruß
Jens
 

Thomas_v2.1

Well-known member
Beiträge
8.139
Punkte Reaktionen
2.461
Ja, z.B. so in der Art:

Code:
#temp_s := '';
FOR #i := 1 TO LEN(IN := #IN) DO
    IF #IN[#i] <> #C_DEL THEN
        #temp_s := CONCAT(IN1 := #temp_s, IN2 := #IN[#i]);
    END_IF;
END_FOR;
#StringCharDelete := #temp_s;
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.092
Punkte Reaktionen
2.719
Zuviel Werbung?
->Hier kostenlos registrieren
Nein ... du brauchst nur eine Schleife und keinen Counter ...
In etwa so :
Code:
ZielString := "";
for i:=1 to 68 by 1 do
   Z := mid(QuellString,i,1) ;
   if Z <> deinZeichen then
      ZielString := ZielString + Z ;
   end_if;
end_for;
Das ist jetzt allerdings teilweise PseudoCode da ich gerade keine SW zur Hand habe und dies so aus dem Gedächtnis geschrieben habe. MID wird etwas anders sein und beim Zielstring wirst du besser CONCAT einsetzen ...

Gruß
Larry
 

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Um den Widerspruch zwischen Thomas bzw. Ralfs Behauptung einerseits und meiner andererseits aufzuklären:
wir haben alle Recht. Thomas & Ralf sind von der Verwendung von StringBefehlen aus gegangen und ich von der Verwendung von Arrays of Character.

Meine persönliche Abneigung gegen eine in einer Schleife wiederholten Zusweisung der Art Temp := Temp & ... (wahlweise in der CONCAT-Schreibweise) beruht auf wahrscheinlich inzwischen überholten Erfahrungen mit diversen BASIC-Dialekten.
Dort wurde bei jeder Zuweisung ein neuer SpeicherPlatz für Temp belegt, weil die Länge der Variablen sich ständig ändert.
Wenn es dann irgendwann eng im Speicher wurde, wurde eine "GarbageCollection" (sozusagen eine SpeicherEntrümpelung) ausgeführt, die sich deutlich (aber "nur" sporadisch) auf die AusführungsZeit auswirkte. Ein zeitliches Verhalten also, auf das man in einem SPS-Programm lieber verzichtet.

Weiss hier im Forum jemand etwas darüber zu berichten, wie das entsprechende Verhalten bei aktuellen SPS aussieht?
 

Thomas_v2.1

Well-known member
Beiträge
8.139
Punkte Reaktionen
2.461
Der einzige Nachteil beim Aneinanderhängen in der Schleife ist, dass innerhalb von Concat immer die Länge des Strings geprüft wird. Bei SCL oder auch Pascal ist das aber kein großes Performanceproblem, weil die Länge ja im Header angegeben ist. Bei C wird bei strlen immer das komplette Array bis zur \0 durchlaufen um die Länge zu bestimmen. Wenn das innerhalb einer Schleife bei langen Strings angewendet wird, wird damit einiges an Zeit vergeudet. Aber z.B. strcat prüft ja nichts.

Wenn du hier anstelle von Strings ein Char Array anlegst, dann musst du anschließend über CharToString oder so wieder einen String generieren., da muss man aber aufpassen, dass diese Funktion bei Längenangabe = 0 den ganzen String kopiert. Bei Step7 hat man das einfach noch über einen String erledigt, und dann mit einer AT-Sicht darauf manuell die Länge gesetzt. Zugriff auf die Zeichen des Strings geht bei TIA auch noch, aber ich wüsste jetzt nicht wie man anschließend die Länge korrekt setzt.
 

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Zuviel Werbung?
->Hier kostenlos registrieren
Wenn du hier anstelle von Strings ein Char Array anlegst, dann musst du anschließend über CharToString oder so wieder einen String generieren., da muss man aber aufpassen, dass diese Funktion bei Längenangabe = 0 den ganzen String kopiert.
Das habe ich leider nicht verstanden, Thomas.
Eine max. LängenAngabe = 0 wäre sinnlos. Eine Längenangabe des aktuell belegten Bereichs =0 wird ignoriert, also wie eine Längenangabe à la max. Länge behandelt, aber bei Längenangaben 1 bis max. - 1 werden "exakt" beachtet, also nicht auf max "aufgerundet?
 

Thomas_v2.1

Well-known member
Beiträge
8.139
Punkte Reaktionen
2.461
Das habe ich leider nicht verstanden, Thomas.
Eine max. LängenAngabe = 0 wäre sinnlos. Eine Längenangabe des aktuell belegten Bereichs =0 wird ignoriert, also wie eine Längenangabe à la max. Länge behandelt, aber bei Längenangaben 1 bis max. - 1 werden "exakt" beachtet, also nicht auf max "aufgerundet?
Frag bei Siemens nach. Das macht die Anweisung Chars_TO_Strg so.
 
Oben