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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: String in Array of String schreiben

  1. #1
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Liebes SPS Forum,

    Ich möchte Zustände Loggen und Strings in einem Array ablegen.


    DiagArrayLog^[i]:= StringTest;

    Bei diesen Aufruf kommt immer ein PageFault.

    Ist dies zulässig?
    Hat jemand eine Idee warum dieser Fehler auftritt?

    Besten Dank für Eure Unterstützung.
    Geändert von carepicha (10.10.2013 um 11:33 Uhr)
    Zitieren Zitieren String in Array of String schreiben  

  2. #2
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Schonmal so geschrieben?

    DiagArrayLog[i] := StringTest;
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  3. #3
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Dass geht nicht.

    Ich poste mal den gesamten Code um mein Problem genauer zu beschreiben;
    Ich ein Struct gemacht habe (Diag) und den Pointer übergebe ich. Deshalb braucht es meiner Meinung nach das ^ zwingend.
    Ich möchte das Struct in ein separates Array kopieren damit ich verschiedene Zustände festhalten kann.
    Genau bei dieser Zuweisung gibt es den Page Fault.

    Aufgrund dessen habe ich versucht lediglich ein Wert des Types STRING in ein Array zu schreiben.
    => Auch hier passiert der gleiche Fehler
    => Dies deutet darauf hin, dass es mit der Zuweisung eine Strings in ein Array ein Problem gibt.

    Für weitere Hinweise bin ich dankbar.

    (*Log the machine status*)

    (*diag*)
    DiagArrayTemp := ADR (Diag);

    count :=SIZEOF(Diag)-1; (*the array runs from 0..n*)



    FOR i:= 0 TO count BY 1 DO
    DiagArrayLog^[i]:= DiagArrayTemp^[i];
    DiagArrayLog^[i]:= StringTest;
    nicount:=i;

    END_FOR;

  4. #4
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Einfache Methode

    ArrayNeu[x].ItemNeu1:=ArrayAlt[y].ItemAlt1; (*ArrayNeu[1...n] of Struct*)

    Irek

  5. #5
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Du hattest eben doch recht, ich hatte das DiagArrayLog fälschlicherweise mit Pointer definiert

    Jetzt habe ich eine weitere Frage;

    Wenn ich den (SizeOf) mache, dann gibt es einen Count von 1701;
    Das macht auch insofern Sinn den,
    21 Anzahl Strings im Struct
    81 = Bit = Datengrösse eines Strings (Ist auch so in den Schulungsunterlagen definiert.
    =1701

    Warum ist der Count 1701,
    Mich interessiert ja nicht die Grösse des Datenbereiches, sondern Anzahl Strings

    Hat jemand eine Idee?
    Was muss ich anschliessend Unternehmen dass die entsprechenden Strings auch im Logger Array auf Platz 0-21 stehen und nicht zwischen 0 und 1701 verteilt sind?

    Vielen Dank für Eure Unterstützung

  6. #6
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von carepicha Beitrag anzeigen
    Du hattest eben doch recht, ich hatte das DiagArrayLog fälschlicherweise mit Pointer definiert

    Jetzt habe ich eine weitere Frage;

    Wenn ich den (SizeOf) mache, dann gibt es einen Count von 1701;
    Das macht auch insofern Sinn den,
    21 Anzahl Strings im Struct
    81 = Bit = Datengrösse eines Strings (Ist auch so in den Schulungsunterlagen definiert.
    =1701

    Warum ist der Count 1701,
    Mich interessiert ja nicht die Grösse des Datenbereiches, sondern Anzahl Strings

    Hat jemand eine Idee?
    Was muss ich anschliessend Unternehmen dass die entsprechenden Strings auch im Logger Array auf Platz 0-21 stehen und nicht zwischen 0 und 1701 verteilt sind?

    Vielen Dank für Eure Unterstützung

    Item1:string(50); (*50 Bytes werden im Speicher fuer den String "reserviert", damit hat jeder Arraitem gleiche Groesse*)

    (*Anzahl Strings*)
    Anzahl:=0;
    while _i < ArrayItem_Max+1 do
    if ArraItem[x].String <> '' then
    Anzahl:=Anzahl+1;
    end_if;
    _i:=_i+1;
    end_while;


    Irek

  7. #7
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Irek Beitrag anzeigen
    Einfache Methode


    ArrayNeu[x].ItemNeu1:=ArrayAlt[y].ItemAlt1; (*ArrayNeu[1...n] of Struct*)


    Irek
    Genau so möchte ich das machen, aber momentan habe ich noch ein Problem mit dem Syntax;

    Mein Struct heisst ST_Diag

    Bedeutet dass ich mache 2 Instanzen vom Struct?
    Diag:ST_DIAG;
    DiagLogger:ST_DIAG;

    und dann

    DiagLogger[i]:=Diag[i];

    kommt der Fehler
    <Index> ist nur für Arrayvariablen zulässig

    Oder was ist Eure Meinung wie mehrere Strings geloggt werden sollen?

    Danke für Eure Hilfe
    Geändert von carepicha (10.10.2013 um 17:46 Uhr)

  8. #8
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Irek Beitrag anzeigen
    Item1:string(50); (*50 Bytes werden im Speicher fuer den String "reserviert", damit hat jeder Arraitem gleiche Groesse*)


    (*Anzahl Strings*)
    Anzahl:=0;
    while _i < ArrayItem_Max+1 do
    if ArraItem[x].String <> '' then
    Anzahl:=Anzahl+1;
    end_if;
    _i:=_i+1;
    end_while;




    Irek


    Danke für den Vorschlag,

    Könntest du mir erklären warum es dann so gut sein soll?
    Ist dann zu erwarten dass anschliessend die geloggten Daten im Array auf 1-21 stehen?

    Danke für deine Bemühungen.

  9. #9
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Im Quellarray sind die Informationen zufällig verteilt. Also prüfe ich jeden Eintrag auf den Inhalt.
    Das wird in den erste While-Schleife erledigt. Wird etwas gefunden kopieren wir das in den Ziel-Array. Damit es auch funktioniert muss ich den Arrayindex inkrementieren, also der erste Eintrag in den ArrayNeu[1].etwas, der nächste in den ArrayNeu[2].etwas.
    Am Ende sind alle relevanten Einträge erfasst und können weiter verarbeitet werden.
    Deklaration String:STRING(40); reserviert im Speicher 40 byte, sonst werden 80 daraus.
    Wenn ich also ein Array aus STRUCT Elementen habe, bin ich in der Lage über die Adresse
    ArraySTRUCT[X].Eintrag den gewünschten Element zu bearbeiten.


    Neue_Wert:=ArraySTRUCT[X].Eintrag
    oder
    ArraySTRUCT[X].Eintrag:=Neue_Wert;


    Irek

  10. #10
    Registriert seit
    02.05.2012
    Beiträge
    49
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Irek Beitrag anzeigen
    Im Quellarray sind die Informationen zufällig verteilt. Also prüfe ich jeden Eintrag auf den Inhalt.
    Das wird in den erste While-Schleife erledigt. Wird etwas gefunden kopieren wir das in den Ziel-Array. Damit es auch funktioniert muss ich den Arrayindex inkrementieren, also der erste Eintrag in den ArrayNeu[1].etwas, der nächste in den ArrayNeu[2].etwas.
    Am Ende sind alle relevanten Einträge erfasst und können weiter verarbeitet werden.
    Deklaration String:STRING(40); reserviert im Speicher 40 byte, sonst werden 80 daraus.
    Wenn ich also ein Array aus STRUCT Elementen habe, bin ich in der Lage über die Adresse
    ArraySTRUCT[X].Eintrag den gewünschten Element zu bearbeiten.


    Neue_Wert:=ArraySTRUCT[X].Eintrag
    oder
    ArraySTRUCT[X].Eintrag:=Neue_Wert;

    Danke für deine Beschreibung.
    Kann es sein dass der Befehl für das Speichern im ZielArray fehlt?
    Sonst ist es soweit klar.

    Noch eine Frage für die Zuweisung.

    Warum
    Neue_Wert:=ArrayStruct[x].Eintrag

    Ich möchte ja den Wert jeweils indexiert zum Struct hinzufügen.
    Erfolgt dies nicht mit
    ArraySTRUCT[X]:=Neue_Wert;


    Danke für Eure Hilfe

Ähnliche Themen

  1. Test
    Von Anonymous im Forum Feldbusse
    Antworten: 0
    Letzter Beitrag: 06.11.2003, 18:29

Lesezeichen

Berechtigungen

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