AnsiString an ein char Array anhängen
-
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 lieberstrncpy(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 etwasconst 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...