TIA Array of String kopieren

Tomatensalat

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen,

ich möchte einen vorbelegten Array[0..4] of String in einen Anderen Array[0....20] of String kopieren.
Beim wiederholten Kopieren der Werte sollen diese an die bereits kopierten Werte angehängt werden , bis das Array voll ist.

Leider scheitere ich bereits beim ersten Kopieren der Werte.
Ich habe bereits einige Systemfunktionen ausprobiert, u.A. blkmov, Fill_Blk und ReadfromArrayDB , leider war hier nichts passendens dabei.
Egal wie ich auf den Inhalt des DBs zugreifen möchte, es scheint immer etwas nicht zu passen.
Oder muss ich eventuell zunächst die einzelnen Strings in ein anderes Format wandeln ?

Kann es sein, das mir der optimierte Baustein probleme macht, und ich dies deaktivieren sollte ?

Vielen Dank und Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ,
super vielen Dank . Genau so eine Funktion habe ich gesucht.
Kannst du mir noch kurz erklären, wie ich das kopieren in einer Schleife am besten umsetze?

Da muss ich ja mit indirekter Adressierung arbeiten.
So siehts aktuell aus , aber möchte ja alle strings kopieren...



Ich denke für eine Schleife sollte man auf SCL bzw. AWL umsteigen, oder ?
 

Anhänge

  • 1.JPG
    1.JPG
    13 KB · Aufrufe: 49
Zuletzt bearbeitet:
Hier ein Beispiel in SCL. Du kannst es auch in AWL umsetzen wenn du magst. SCL finde ich aber einfacher.

Die erste Schleife sucht die erste frei Stelle im Speicher.
Die zweite Schleife kopiert wenn Platz ist die Werte aus dem anderen String Array.

Code:
(*
#"Array_1" = Array[0..4] of String
#"Array_2" = Array[0..20] of String

Temp:
#"i" = int  - Erste Freie Stelle im Array
#"ii" = int
*)

/// Frei stelle im Array_2 suchen
FOR #i := 0 TO 20 DO
    
    IF #Array_2[#i] = '' THEN
        EXIT;
    END_IF;
END_FOR;
/// String kopieren wenn Platz im Speicher
FOR #ii := 0 TO 5 DO
    
    IF #i <= 20 THEN                        // Nur kopieren wenn Speicher nicht voll
        #Array_2[#i] := #Array_1[#ii];      // kopieren
        #ii := #ii + 1;                     // Index erhöhen
    ELSE
        EXIT;                               // Schleife verlassen sofort verlassen wenn Speicher voll
    END_IF;
    
END_FOR;


Stefan
 
Hi Stefan592 ,

ich habe das nun etwas anderst umgesetzt , jedoch vom Priznip her gleich:
Code:
IF #"liste befüllen" THEN
    
    FOR #ii := 0 TO 19 DO // DB Messprogramm durchlaufen und freien Platz finden
        
    IF "Messprogramm"."THIS"[#ii] =''  THEN
        
        FOR #i := 0 TO 19 DO // Durchlaufe den Eingangsstring 20 mal 
            "Messprogramm"."THIS"[#ii] := "Eingangsstring".Stringarray[#i];
             #ii := #ii + 1;
        END_FOR;
      
    END_IF;
    END_FOR;
END_IF;
Über das Bit "liste befüllen" möchte ich, dass die Werte von EingangsDB genau einmal kopiert werden. Aktuell ist es so, dass die Werte permanent in der Schleife kopiert werden , bis der Ziel DB voll ist. Mir fehlt noch die richtige Abbruchbedingung. Kannst du mir sagen, wo ich diese Bedingung am besten reinmache ? Vielen Dank
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde es in etwa so machen :
Code:
IF #"liste befüllen" THEN
    
    FOR #i := 0 TO 19 DO // DB Messprogramm durchlaufen und freien Platz finden
        
    IF "Messprogramm"."THIS"[#i] =''  THEN
        
        FOR #j := 0 TO 4 DO 
            #p := #i + #j ; 
            if #p <= 19 then 
               "Messprogramm"."THIS"[#p] := "Eingangsstring".Stringarray[#j];
            end_if ;
        END_FOR;
      
    END_IF;
    END_FOR;
END_IF;
... ist aber ungetestet ...

Gruß
Larry
 
Hallo Larry Laffer,
deine Version funktioniert genau gleich . Die Werte aus dem Eingangsstring werden in der Schleife kopiert, bis Messprogramm voll ist. Das soll aber nicht so sein .
Muss die Bedingung "liste befüllen" eventuell eine Flanke sein , damit nur einmal abgearbeitet wird ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es so versucht , vom Prinzip her klappt es, hat aber auch nicht die gewünschte Wirkung: sprich, es ist gleich wie vorher .
Code:
#Pulse := #"liste befüllen" AND NOT #Flankenmerker;
#Flankenmerker := #"liste befüllen";

IF #Pulse THEN.....
 
Ich mache das mit der Flanke in SCL meißt so :
Code:
IF #"liste befüllen" and not #"FM_liste befüllen" THEN
    
    FOR #i := 0 TO 19 DO // DB Messprogramm durchlaufen und freien Platz finden
        
    IF "Messprogramm"."THIS"[#i] =''  THEN
        
        FOR #j := 0 TO 4 DO 
            #p := #i + #j ; 
            if #p <= 19 then 
               "Messprogramm"."THIS"[#p] := "Eingangsstring".Stringarray[#j];
            end_if ;
        END_FOR;
      
    END_IF;
    END_FOR;
END_IF;
#"FM_liste befüllen" := #"liste befüllen" ;

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein ähnliches Problem und benötige eure Hilfestellung.

Ich möchte ein Array of Strings durchsuchen ob es gefüllt wurde, wenn es Felder gibt in denen ein anderer Text als xxx steht, dann soll dieser Text umkopiert werden in ein zweites Array. Im zweiten Array sollen dann die Felder nacheinander mit den gefundenen Texten gefüllt werden.

Code:
FOR #T_i := 0 TO 8 DO
        IF #T_name[#T_i] <> 'xxx' THEN
            FOR #T_ii := 0 TO 8 DO
                #flt_text[#T_ii] := #T_name[#T_i];
                #T_ii := #T_ii + 1;
                
            END_FOR;
        END_IF;
        #T_i := #T_i + 1;
        
    END_FOR;

Irgendwie steh ich auf dem Schlauch, da mein zweites Array jedesmal mit ein und dem selben Text voll geschrieben wird.
Hat einer ein Tipp was ich vergessen/falsch habe?

Grüße
 
Zuletzt bearbeitet:
Alles klar, steh nicht mehr auf dem Schlauch und habe es gerade selbst gelöst.
Man benötigt die zweite Schleife nicht. Man muss nur die gefundenen Felder zählen und die Anzahl als Feld Wert nehmen und darauf kopieren :ROFLMAO:
 
Zurück
Oben