AnsiString an ein char Array anhängen



  • Nein, ich includiere auch nur was nötig ist.

    Was hast du gegen eine kleine harmlose VCL Funktion?

    Richtig für strxxx ist keine Header einzubinden. Irrtum von mir.



  • Simmt, habe mal wieder nach dem Motto warum Einfach wenn es auch Umständlich
    geht gehandelt.

    Danke für die Hilfe...



  • hermes schrieb:

    Message = new char[OpenDialog1->FileName.Length()+20];
              Message = "File->";
         	strcpy(Message+6,OpenDialog1->FileName.c_str());
         	Application->MessageBox(Message,"File",MB_OK);
    	     delete Message;
    

    Nanana, zu einem new [] gehört auch ein delete []...

    @Christian: Gar nichts. Hab nur ein Problem mit der Argumentation "da muss ich extra noch ne Headerfile einbinden". Was glaubst du was VCL.h anderes macht?



  • Dann sollte man diese Diskussion beenden und jede nimmt das, was gerade am besten passt



  • Ups, delete[].

    Message = new char[OpenDialog1->FileName.Length()+20];
             Message = "File->";
             strcpy(Message+6,OpenDialog1->FileName.c_str());
             Application->MessageBox(Message,"File",MB_OK);
             delete[] Message;
    

    Ich weiss allerdings immer noch nicht, warum im Caption von der MessageBox
    nicht File sondern Reste von Message steht.
    Message sieht eigentlich korrekt aus.
    Was passiert eigentlich bei delete ohne [], wird da nur die Speicherstelle
    für den Pointer freigegeben, der angefordert Speicher aber nicht.



  • Welches delete du hier verwendest ist sowieso egal da du bei

    Message = "File->";
    

    den vorher geholten Pointer ja wieder überschreibst.
    also lieber

    strncpy(Message,"File->",OpenDialog1->FileName.Length()+19);
    

    und dann

    strncat(Message,OpenDialog1->FileName.c_str(),,OpenDialog1->FileName.Length()+19);
    

    Ich würde der Übersichtlichkeit halber die maximale Größe deines Arrays vorher in eine Variable schreiben.
    Noch besser ist aber die AnsiString-Variante von Christian.

    Ein einfaches delete würde hier den Speicher des ersten Elementes deines Arrays freigeben.
    also immer:
    bei new []
    immer delete[]



  • Welches delete du hier verwendest ist sowieso egal da du bei
    Message = "File->";
    den vorher geholten Pointer ja wieder überschreibst.

    Gebe zu habe hier noch so meine Problem.

    char* Message;

    Message = new char[20];
    Message = "File";

    Klar, ich überschreibe den Pointer.
    void test(char* x)
    {
    *x = 10; // Hier beschreibe ich indirect über den Zeiger
    // die Speicherstelle
    }
    *Message = 1; //Hier beschreibe ich die erste Speicherstelle des
    //Arrays indirect über den Pointer.

    Message = "File"; //Ist aber nicht möglich das verwirrt ein bischen.
    //Cannot convert char
    to char, wieso *Message ist
    //doch der Zeiger auf ein char Array.

    Sprich ich möchte das Array mit einem String initialisieren wie

    char x[] = "File";
    Hier habe ich allerdings keinen Speicher allociert.



  • *Message ist das erste Element deines char Arrays (* ist der Dreferenzierungsoperator) und somit natürlich ein char während "File" ein Stringliteral und somit ein const char* ist.
    Message ist der Zeiger auf dein char-Array.



  • Message = "File";
    Hier überschreibe ich also den Pointer Message mit dem const char Pointer des Stringliterals.

    Wenn ich soetwas schon mache, sollte ich zumindest Casten.
    Message = (char*)"Hallo";
    oder?



  • Nein. Sowas sollte man überhaupt nicht machen.
    Zuweisungen von Stringliteralen sollten nur bei der Deklaration gemacht werden. Also so etwas

    const char* Message = "File";
    


  • Jo, danke für die Lehrreiche Diskussion.



  • Hallo ich nochmal,

    Message = "File"; //Fehlermeldung des Compilers:
    //Cannot convert char
    to char.

    während "File" ein Stringliteral und somit ein const char* ist.

    Dann verstehe ich allerdings die Fehlermeldung des Compilers nicht.
    Müsste es dann nicht, Cannot convert const char* to char, heissen?



  • Mit *Message dereferenzierst Du das erste Zeichen aud dem char-Array (char*) Message. Somit ist *Message ein einzelnes char aus dem Array - und die Fehlermeldung absolut korrekt.

    *Message = 'F';
    

    wäre in Ordnung...


Anmelden zum Antworten