Diese Datentypen treiben mich in den Wahnsinn! AnsiString <=> String?!



  • hi Oklino hier. Vor kurzem habe ich ja dank euch diese TStringList hinbekommen. Jetzt hab ich damit nen bisschen gearbeitet und ecke wieder an.

    Ich möchte eine Funktion benutzen die einen std::string erwartet(daran kann ich nichts ändern). Wenn ich nun versuche da ein Element einer StringList reinzupacken meckert der Compiler. was nun? 😞



  • Du kannst das über const char* umwandeln. Etwa so

    std::string str = list->Strings[0].c_str();
    


  • aaah jo danke 🙂

    wenn ich jetzt versuche 2 Felder miteineander zu verbinden und anzuhängen klappt das ganze wieder nicht.

    sprich:

    strE = List->Strings[0].c_str()+" "+List->Strings[1].c_str();
    "ungültige Zeigeraddition" ??
    jedoch:
    strE = List->Strings[0].c_str();
    strE += " ";
    strE += List->Strings[1].c_str();
    wird akzeptiert o_O



  • Ist doch logisch. Im ersten Teil hast du versucht const char* (also Pointer) zu addieren. Das kann nicht funktionieren.
    Der zweite Teil ist ok, da sowohl std::string als auch AnsiString einen Konstruktor für const char* haben und somit implizit konvertieren.



  • Aus der Hilfe:

    Die Methode c_str gibt das AnsiString-Objekt als nullterminiertes Zeichen-Array zurück.

    char* __fastcall c_str() const;

    Beschreibung

    Es wird ein Zeiger auf ein nullterminiertes Zeichen-Array zurückgegeben, das die gleichen Zeichen wie das AnsiString-Objekt enthält.

    Zeichenketten kann man mit + konkatenieren, bei Zeigern wird so eine Addition durchgeführt.



  • Folgender Ansatz hat sich für mich als am problemlosesten gezeigt:

    AnsiString ListenEintrag;
    ListenEintrag = List->Strings[0] + " " + List->Strings[1]; 
    strE = ListenEintrag.c_str();
    


  • Fincki schrieb:

    Folgender Ansatz hat sich für mich als am problemlosesten gezeigt:

    AnsiString ListenEintrag;
    ListenEintrag = List->Strings[0] + " " + List->Strings[1]; 
    strE = ListenEintrag.c_str();
    

    Da ist die Klammerung doch leichter...

    string strE = (List->Strings[0] + " " + List->Strings[1]).c_str();
    


  • Stimmt, das ist leichter zu schreiben und leichter zu lesen, eleganter. Meine Version ist aber besser zum debuggen, deswegen meinte ich problemlos.



  • Fincki schrieb:

    Meine Version ist aber besser zum debuggen, deswegen meinte ich problemlos.

    Und sie belegt unnötig Speicher ... Aber wer kümmert sich auch heutzutage schon noch um sowas ...



  • Reyx schrieb:

    Und sie belegt unnötig Speicher ... Aber wer kümmert sich auch heutzutage schon noch um sowas ...

    Hast du noch keinen 64 Bit Rechner mit 160 GB RAM? 😉 😃 😃


Anmelden zum Antworten