String Werte in Array[x] speichern?



  • Hallo!

    Ich arbeite gerade an einem Projekt, bei dem ich Werte die ich über ein Com-Port von einem µC einlese, trennen und die einzelnen Werte in ein Array zur Weiterverarbeitung speichern möchte.

    Die Werte sehen wie folgt aus: "0234;1023;2001;4567;5466;1234;2555;".

    Es sind also 7 Werte die ich "einfach" in ein Array speichern möchte.

    Bisher habe ich es geschafft die Werte einzulesen und sie in einem Memo-Feld (wie oben beschrieben) auszugeben.

    Ich benütze den C++Builder (falls ich also irgendwelche bestimmten Header-Dateien einschliessen muss, bitte ich da um hinweise).

    Ich weiß, dass es viele Lösungsansätze gibt. Aber keine hat mir wirklich weitergeholfen, deshalb versuche ich es einfach mal auf diesem Weg.

    Dank euch schon mal.

    Gruß



  • Hi,

    das schöne an dieser Sache ist ja, dass die einzelnen "Blöcke" ja mit einem Semikolon getrennt sind. Mein erster Lösungsansatz wäre:

    1. Anzahl Zeichen des Strings ermitteln
    2. Schleife mit dieser Anzahl erzeugen
    3. String Zeichen für Zeichen einlesen
    4. Wenn Zeichen nicht ; dann Zeichen ins Array
    4. Wenn Zeichen = ; dann nächste Position im Array ansprechen
    usw.

    Gruß Torsten



  • Hi torsten!

    Dank dir für deine Idee...

    Hört sich nicht schlecht an, hättest du vielleicht ein Code-Beispiel parat?

    Gruß



  • so, mal auf die Schnelle...

    AnsiString wert = "1234;5678;9abc";
    AnsiString Ziel[4][3];
    int x = wert.Length();
    
    for (int i=0; i < x; i++)
    	{
    	//erst auf ; prüfen und dann...
    	// hier jetzt jedes Zeichen an die korrekte Positin des Arrays speichern
    	}
    }
    

    Gruß Torsten



  • Schau Dir mal AnsiString::Pos und AnsiString::SubString an.



  • oder erst in ne TStringList mit Delimiter, StrictDelimiter und DelimitedText und dann ins array

    noch ein Tip: gib eine genauere BCB-Version an, da einige Funktionen erst in neueren Versionen verfügbar sind, z.B. StrictDelimiter



  • alternativ wäre es noch eine Möglichkeit die ";" durch "," oder " " zu ersetzen und per CommaText einzulesen

    greetz KN4CK3R



  • Hi danke euch erstmal für eure Tipps!
    Ich habs jetzt mal so gemacht....
    Leider bekomme ich nix in mein EditFenster(EWinkel_Min4_1).
    Wie gesagt einlesen in ein Memo funkt...
    Liegt das an der Umwandlung? Also Str, Int oder so?
    Hier ein Auszug aus meinem Code:

    #include <vcl.h>
    #pragma hdrstop
    
    #include <iostream>
    #include <conio.h>
    
    #include <sstream>
    #include <string>
    #include <system.hpp>
    
    char In,Out;
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	 if ((Com5->BytesAvailable())!=0)              //Com2/5
    	 {
    		In = (char)Com5->GetByte();                //Com2/5
    		Memo2->Text = Memo2->Text + AnsiString(In);
    }
    
    void __fastcall TForm1::B_Winkel_Min4Click(TObject *Sender)
    {
    String str= In,str1;
    int index=0, count=4;
    
    str1 =str.SubString(index, count);
    
    EWinkel_Min4_1->Text = str1;
    
    }
    


  • KN4CK3R schrieb:

    alternativ wäre es noch eine Möglichkeit die ";" durch "," oder " " zu ersetzen und per CommaText einzulesen

    greetz KN4CK3R

    Wie mache ich denn das und was hat das fürn Vorteil?



  • String str= In,str1;
    str1 =str.SubString(index, count);
    

    kann so nicht stimmen, denn In ist nur ein char, also nur ein einziges Zeichen und davon versucht du einen SubString zu bilden. Theoretisch sollte zumindest dieser eine Buchstabe dann im Textfeld stehen.

    Für den CommaText müsstest du die ";" durch Kommas ersetzen. Dann könntest du den Text einer Stringliste zuweisen und hättest dein Array.
    Mehr dazu hier (auch wenns nicht C++ ist): http://www.freepascal.org/docs-html/rtl/classes/tstrings.commatext.html

    greetz KN4CK3R



  • mach so:

    AnsiString s = "0234;1023;2001;4567;5466;1234;2555;", MyArray[7];
            int k, z=0;
    
            while(k = s.Pos(";"))
            {
                    MyArray[z] = s.SubString(0 ,k-1);
                    z++;
    
                    k++;
                    s = s.SubString(k, s.Length());
            }
    
            //Hier die Ausgabe des Arrays
            for(int a = 0; a < 7; a++)
            {
                    ShowMessage(MyArray[a]);
            }
    

    so gehts auch:

    AnsiString s = "0234;1023;2001;4567;5466;1234;2555;", *q = &s, MyArray[7];
            int k, z=0;
    
            while(k = q->Pos(";"))
            {
                    MyArray[z] = q->SubString(0 ,k-1);
                    z++;
    
                    k++;
                    *q = q->SubString(k, q->Length());
            }
    
            *q = NULL;
    
            for(int a = 0; a < 7; a++)
            {
                    ShowMessage(MyArray[a]);
            }
    

    pass aber auf das statische array auf, da es ja eine begrenzte grösse von 7 hat.

    ich persönlich würde das array dynamisch anlegen um den code überall einsetzen zu können,
    entweder mit speichererhöhung (realloc) in der schleife oder mit einer funktion die mir vorher
    die anzahl der trennzeichen des strings zurückgibt und dann vor aufruf der schleife den speicher mit dementsprechender grösse belege.



  • oder nen vector benutzen

    greetz KN4CK3R


Anmelden zum Antworten