Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: String zählen

  1. #11
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.569
    Danke
    63
    Erhielt 258 Danke für 218 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Ralle: Aus Interesse hatte ich gestern an der Lösung gebastelt. Zwar mit einer WHILE-Schleife aber sonst genauso mit DELETE etc...

    Ich bin nicht sicher, ob ich da was falsch gemacht habe. In einem String der aus 'FCGFCGFCG' bestand, hatte ich zum Schluss noch einen STRING 'FCG' übrig, den er nicht mehr gezählt hat.

    Ich habe dann noch folgendes ausprobiert:

    Code:
    STRING2 := 'FCG'
    A := FIND(IN1 := STRING2,IN2 := 'FCG');
    A war in diesem Fall = 0. Kann das sein?
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  2. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Das wäre die Variante in pipboy Stil.
    Waren noch zwei Änderungen notwendig.
    In der äußeren Schleife +1 ergänzt und
    nach der inneren Schleife Vergleich auf "j > LenSearchFor" da nach Ende der For-Schleife der Index größer als die Abbruchbedingung ist.

    Code:
    FUNCTION StringSuchN : INT
    //
    // Gibt die Anzahl der Vorkommen von String "SearchFor" in "SearchIn" zurück
    //
    CONST
        STR_MAX := 100;  // Stringlänge
    END_CONST
    
    VAR_INPUT
        SearchIn : STRING[STR_MAX];     //String der durchsucht werden soll
        at_SearchIn AT SearchIn : STRUCT
            len_max : BYTE;
            len_act : BYTE;
            chars : ARRAY[1..STR_MAX] OF BYTE;
        END_STRUCT;
        SearchFor : STRING[STR_MAX];    //String dessen Vorkommen gesucht werden soll
        at_SearchFor AT SearchFor : STRUCT
            len_max : BYTE;
            len_act : BYTE;
            chars : ARRAY[1..STR_MAX] OF BYTE;
        END_STRUCT;
    END_VAR
    
    VAR_TEMP
        LenSearchIn : INT;
        LenSearchFor : INT;    
        i, j : INT;
        found : INT;                // Anzahl der Vorkommen
    END_VAR
    
    BEGIN
    
    LenSearchIn := BYTE_TO_INT(at_SearchIn.len_act);
    LenSearchFor := BYTE_TO_INT(at_SearchFor.len_act);
    
    found := 0;
    FOR i := 1 TO LenSearchIn - LenSearchFor + 1 DO
        FOR j := 1 TO LenSearchFor DO
            IF at_SearchIn.chars[i + j - 1] <> at_SearchFor.chars[j] THEN
                EXIT;
            END_IF;
        END_FOR;
        IF j > LenSearchFor THEN
            found := found + 1;
            i := i + LenSearchFor - 1;  // Suche hinter letztem Fund fortsetzen
        END_IF;
    END_FOR;
    
    StringSuchN := found;
    END_FUNCTION

  3. #13
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Ich hatte testweise am Schluß auch mal 'FCG', das ging, allerdings hatte ich noch Zeichen zwischen den einzelnen 'FCG'.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. #14
    Registriert seit
    17.10.2007
    Beiträge
    263
    Danke
    5
    Erhielt 52 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Ich habe dann noch folgendes ausprobiert:

    Code:
    STRING2 := 'FCG'
    A := FIND(IN1 := STRING2,IN2 := 'FCG');
    A war in diesem Fall = 0. Kann das sein?
    Hallo,

    gibt 'FIND' nicht die Position des ersten Vorkommens zurück? Dies wäre in deinem Fall ja 0, sprich: ganz vorne (Zeichen 0).

    Ohne Gewähr, einfach aus der Hüfte geschossen ohne Verifizierung )


    Gruß, Fred

  5. #15
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von faust Beitrag anzeigen
    Hallo,

    gibt 'FIND' nicht die Position des ersten Vorkommens zurück? Dies wäre in deinem Fall ja 0, sprich: ganz vorne (Zeichen 0).

    Ohne Gewähr, einfach aus der Hüfte geschossen ohne Verifizierung )

    Gruß, Fred
    Nein, 0 wird zurückgegeben, wenn nichts gefunden wird, das 1. Zeichen hat die 1 als Pos.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #16
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    @Ralle: Aus Interesse hatte ich gestern an der Lösung gebastelt. Zwar mit einer WHILE-Schleife aber sonst genauso mit DELETE etc...

    Ich bin nicht sicher, ob ich da was falsch gemacht habe. In einem String der aus 'FCGFCGFCG' bestand, hatte ich zum Schluss noch einen STRING 'FCG' übrig, den er nicht mehr gezählt hat.

    Ich habe dann noch folgendes ausprobiert:

    Code:
    STRING2 := 'FCG'
    A := FIND(IN1 := STRING2,IN2 := 'FCG');
    A war in diesem Fall = 0. Kann das sein?
    Du hast Recht, wenn ich als String nur 'FCG' vorgebe, dann funktioniert Find nicht und liefert 0 zurück. Noch ein Leerzeichen dazu, dann geht es. Ich hatte zwar 'FCG' als letztes Literal im String, aber davor noch ein paar Füllzeichen. Dadurch war mein letzter String beim Suchen nicht genau 3 Zeichen lang und funktionierte.

    Einziger Workarround, der mit mal eben einfällt, vor dem Bearbeiten ein beliebiges Zeichen an den String anhängen (CONCAT).

    Ich hab das oben in meinem Code mal verändert. Komische Sache, das.
    Geändert von Ralle (22.02.2013 um 23:16 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #17
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.569
    Danke
    63
    Erhielt 258 Danke für 218 Beiträge

    Standard

    Irgendwie blöd. Das gehört auch zu den Dingen die ich an solchen "fertigen" Bausteinen nicht mag. Man weiß nicht, ob der Baustein das tut was man erwartet.

    Alternativ könnte man bei dem Rückgabewert von 0 mit "EQ_STRNG" auf 'FCG' vergleichen und dann ggf. am Schluß noch 1x zählen.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  8. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    habt ihr mal versucht, was dabei herauskommt, wenn man statt 'FCG' einen String miz gleichem Inhalt an FIND übergibt ?
    Ich könnte mir vorstellen, dass hier die übergebene "Konstante" von FIND gar nicht als wirklicher String verstanden wird - das ist jetzt aber auch nur ein "Schuß ins Blaue" ...

    Gruß
    Larry

  9. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Hm, das scheint wohl ein Fehler in der FIND Funktion zu sein.

    Dort wird vor dem Vergleich abgefragt:
    1) ob die Länge von IN1 == IN2 ist, dann wird Null ausgegeben
    ODER
    2) ob die Länge von IN1 - IN2 < 0 ist, dann wird Null ausgegeben

    1) ist so gesehen falsch. Die Kommentare die in dem Baustein vorhanden sind sagen auch etwas anderes, nämlich dass bei 1) die Länge von IN1 auf =0 geprüft werden soll.

  10. #20
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Larry
    Nein, das ändert nichts, ich hab das mal mit Suchstring als Input getestet.

    @Thomas_v2.1
    Würde mich mal interessieren was die sich bei 1) gedacht haben, warum sollte man 2 gleichlange Strings nicht mit Find untersuchen?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  2. Antworten: 13
    Letzter Beitrag: 24.09.2009, 12:54
  3. Int na. String und String zusammensetzen
    Von bastler im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 09.11.2008, 20:29
  4. Ein String kopieren in einen anderen String
    Von CanYouHelpMe im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2008, 17:21
  5. STRING aus einzelnen STRING's zusammenstellen
    Von ollibolli im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.08.2006, 09:39

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •