AnsiString an ein char Array anhängen
-
Christian211 schrieb:
Einsparpotential in der Zeit am falschen Ort zu finden glauben
Danke geht seit 26 Jahren sehr gut

Stimmt... denn Tipparbeit ist ja auch bei der Softwarentwicklung der absolute Zeitfresser... egal. Ist ein anderes Thema.
Was mich viel eher interessieren würde, ist die Tatsache, was du eigentlich für ein Problem mit dem Includieren von headerfiles hast:
Christian211 schrieb:
Kann ich nicht nachvollziehen. Für strncpy und weitere sind Headerdateien einzubinden für die entsprechende VCL Funktion nicht.
Es ist doch genau der tiefere Sinn, das man nur headerfiles included die man auch benötigt. Oder gehörst du auch zu denen die ein Headerfile "includeAll.h" machen, wo schlussendlich eine Liste mit #include für jedes erdenkliche Headerfile steht, womöglihc noch einige using-Anweisungen, und dann das einfach in alle Module "includeall.h" includen?
-
KlausB schrieb:
wo ist denn da das "new" und das "delete"
desweiteren ist das sehr gefaehrlich den char* auf 30 Zeichen festzulegen
was passiert denn wenn du mehr als 30 Zeichen da reinschreibstvoid __fastcall TForm1::Button1Click(TObject *Sender) { char* Message; if(OpenDialog1->Execute()) { Message = new char[OpenDialog1->FileName.Length()+20]; Message = "File->"; strcpy(Message+6,OpenDialog1->FileName.c_str()); Application->MessageBox(Message,"File",MB_OK); delete Message; } }Gibt aber folgendes Problem, im Caption der MessageBox steht nicht File sondern
ein Rest von Message. Habe mir Message genauer angeschaut, ist aber alles
korrekt.
-
Wie wäre es mit
String Message; if(OpenDialog1->Execute()) { Message="File->"+OpenDialog1->FileName; Application->MessageBox(Message.c_str(),"File",MB_OK); }
-
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 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...