Step 7 [SCL] String bearbeiten/auswerten mit AT-Sicht

netsroht

Level-2
Beiträge
28
Reaktionspunkte
1
Hallo,

ich schlage mich seit gestern mit einem Problem rum, bei dem ich nicht weiterkomme.

Zum Hintergrund:
Ich möchte ich SCL einen String bearbeiten/auswerten. Hierzu benötige ich dessen (aktuelle) Länge.

Ich habe hierfür eine lokale Sicht erstellt:

Code:
    test : STRING[5];
    _test AT test : STRUCT
        maxi : BYTE;
        actu : BYTE;
        str1 : BYTE;
        str2 : BYTE;
        str3 : BYTE;
        str4 : BYTE;
        str5 : BYTE;
        str5 : BYTE;
       END_STRUCT;

Beim compilieren bekomme ich den Fehler
Der Typ der Sicht ist nicht mit dem Typ der Variablen verträglich.


Wenn ich jetzt eine string um ein Zeichen länger anlege
Code:
    test : STRING[[COLOR=#FF0000]6[/COLOR]];[COLOR=#FF0000][/COLOR]
    _test AT test : STRUCT
        maxi : BYTE;
        actu : BYTE;
        str1 : BYTE;
        str2 : BYTE;
        str3 : BYTE;
        str4 : BYTE;
        str5 : BYTE;
      [COLOR=#FF0000]  str6 : BYTE;[/COLOR]
       END_STRUCT;

dann funktioniert es...

Kann mir das jemand erklären bzw. mit weiterhelfen. Mir reicht ein String der Länge 5....

Gruß, netsroht
 
Wahrscheinlich ist eine Kopierleiche die Ursache für Dein Problem.
Es ist zwei mal die selbe Zeile untereinander geschrieben, und zwar "str5 : BYTE"

Gruss Marco
 
Genau so ist es... war ein Schreibfehler.

Richtig ist
Code:
    test : STRING[5];
    _test AT test : STRUCT
        maxi : BYTE;
        actu : BYTE;
        str1 : BYTE;
        str2 : BYTE;
        str3 : BYTE;
        str4 : BYTE;
        str5 : BYTE;
       END_STRUCT;

Jemand eine Idee, woran das liegt, dass es nicht klappt?
 
Hallo,
das ist für mich erstaunlich denn eigentlich darf die AT-Sicht auch kleiner als die Original-Variable sein.
Welche Version von SCL verwendest du ?

Schöner wäre es übrigens, wenn du statt der einzelnen Bytes des Strings ein Array of Byte in entsprechender Größe definierst ...

Gruß
Larry
 
Ich könnte mir vorstellen (aber ich weiss es nicht). Dass er bei einer strukturierten Sicht diese immer auf ein Wort füllt und das beim String nicht der Fall ist.
Dann hast du deine 8 Byte in der Struktur wohingegen der String nur 7 Byte Lokaldaten reserviert.

Aber reine Vermutung.
 
Nur mal aus Interesse, String[7] und String[8] testen.
--> siehe Vollmi
 
ungerade Anzahl Zeichen funktioniert, wahrscheinlich aus oben genannten Grund nicht.
undokumentiert!
 
Hallo,
das ist für mich erstaunlich denn eigentlich darf die AT-Sicht auch kleiner als die Original-Variable sein.
Welche Version von SCL verwendest du ?
Version 5.3 SP6

Schöner wäre es übrigens, wenn du statt der einzelnen Bytes des Strings ein Array of Byte in entsprechender Größe definierst ...

Gruß
Larry
Code:
    test : STRING[5];
    _test AT test : STRUCT
        maxi : BYTE;
        actu : BYTE;
        str : ARRAY[1..5] OF BYTE;
    END_STRUCT;

Leider gleiches Ergebnis.


Ein String mit einer Länge von 5 besteht ja aus 7 Bytes, wobei im DB quasi 8 Bytes (4 Words) geblockt werden.

Eine lokale Sicht wie oben hat ja genau 7 Bytes. Also sollte es nach meiner Logik gerade gehen.

Sehr komisch...
 
Eine lokale Sicht wie oben hat ja genau 7 Bytes. Also sollte es nach meiner Logik gerade gehen.

Ich weiss das es aufgehen sollte. Aber wär nicht das erste mal das lokaldaten anders gehandhabt werden als das das handling in einem DB. Und ich wüsste jetzt ehrlichgesagt nicht wie man das definitiv nachprüfen könnte wie die lokaldaten effektiv adressiert werden wenn man einen String drauf legt.

Ich habs mal nachgesehen und einen übersetzten Baustein mit 5 zeichen string wegkopiert und in awl geöffnet. es werden gerade anzahl bytes reserviert.

es kann auch sein das die Fehlerüberprüfung des Compilers das einfach enger sieht. IMHO ein Fehler aber nicht zu ändern.

mfg René
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…