AnsiString/char problem
-
hallo junix, auch wenn ich mich bcb-fanati nenne, heißt es nicht, dass ich alles selbst herleiten kann.
deshalb reagiere ich auf jansens vorschlag:
In der h/klasse:
public:
char* name;
char* getName();in der cpp:
char* table::getName()
{
return name;
}
//---------------------------------------------------------------------------wird doch ´der name der tabelle als char* zurückgegeben und das funktioniert nicht die umwandlung zu ansistring
btw, ich will hier unbedingt kein ansistring verwenden, sondern mit char* arbeiten, nur dann halt umwandeln
-
bcb-fanati schrieb:
hallo junix, auch wenn ich mich bcb-fanati nenne, heißt es nicht, dass ich alles selbst herleiten kann.
Was heisst hier selbst herleiten? - Vielleicht wirfst du einfach mal einen Blick in die BCB Hilfe?
-junix
-
ich habe mir den konstruktor angeschaut, und konnte nur erkennen dass kein char* sondern nur const char* akzeptiert wird, deshalb hab ich die zuweisung folgendermaßen abgeändert:
const char* test = ((table*)db->tableList->Items[i])->getName();
Ed_TableName->Text = AnsiString( test );wieder zugriffsverletzung, diesmal natürlich in der zweiten Zeile
was mach ich denn jetzt noch falsch bzw. hab ich in der konstruktor-hilfe nicht erkannt?
Der Konstruktor erzeugt eine Instanz von AnsiString.
__fastcall AnsiString();
__fastcall AnsiString(const char* src);
__fastcall AnsiString(const AnsiString& src);
__fastcall AnsiString(const char* src, unsigned char len);
__fastcall AnsiString(const wchar_t* src);
__fastcall AnsiString(int src);
__fastcall AnsiString(double src);__fastcall AnsiString(char src);
__fastcall AnsiString(short);
__fastcall AnsiString(unsigned short);
__fastcall AnsiString(unsigned int);
__fastcall AnsiString(long);
__fastcall AnsiString(unsigned long);
__fastcall AnsiString(__int64);
__fastcall AnsiString(unsigned __int64);
__fastcall AnsiString(const WideString &src);Beschreibung
Der Konstruktor für AnsiString ist überladen, so daß der Wert des Strings mit verschiedenen Typen initialisiert werden kann:
Wenn der Konstruktor ohne Parameter aufgerufen wird, erzeugt AnsiString einen leeren String.
Wenn ein einzelner Parameter mit einem nullterminierter String übergeben wird, wird der Wert mit dem übergebenen String initialisiert.
Wenn ein weiterer AnsiString (der "Kopier-Konstruktor") übergeben wird, wird eine Kopie des übergebenen AnsiString erzeugt.
Wenn ein Zeichen-Array und eine Länge übergeben werden, wird ein String erzeugt, der eine Kopie der ersten mit len angegebenen Zeichen von src darstellt. Enthält src beispielsweise den Zeichen-String "Hallo" und hat len den Wert 2, dann würde der erzeugte AnsiString den nullterminierten String "Ha" enthalten.
Wenn ein einzelner Parameter mit einem nullterminierten Wide-Zeichen-String übergeben wird, wird der Wert mit dem übergebenen String initialisiert.
Wenn ein numerischer Wert übergeben wird, konvertiert der Konstruktor diese Wert in dessen String-Repräsentation. Für die Konvertierung wird das allgemeine Zahlenformat mit 15 signifikanten Stellen verwendet.
-
Wie wird denn name gesetzt? Machst du eine Kopie von dem String, oder speicherst du nur den Zeiger?
-
Ich wette, dein "name" in deiner Klasse ist kein gültiger String zum Zeitpunkt des Aufrufs des AnsiString-Konstruktors.
-
lest ihr immer nur den letzten beitrag??
oben hab ich doch schonmal den relevanten coden mit getName und name aufgeführt, da könnt ihr doch kucken, was ich genau falsch mache. bis jetzt gab es noch keinen konkreten hinweis, sondern nur vermutungen!
deshalb jetzt nochmal code und meine bisherigen änderungen:
FEHLERZEILE:
Ed_TableName->Text = AnsiString(((table*)db->tableList->Items[i])->getName());
RELEVANTER CODE:
In der h/klasse:
public:
char* name;
char* getName();in der cpp:
char* table::getName()
{
return name;
}
//---------------------------------------------------------------------------GEÄNDERTER CODE, SO WIE JUNIX ES MIT SEINER KONSTRUKTOR-"HILFE" VORGESCHLAGEN HAT:
In der h/klasse:
public:
const char* name;
const char* getName();in der cpp:
const char* table::getName()
{
return name;
}
//---------------------------------------------------------------------------@MFK: siehe Code, ist das falsch?
@WF: Aha, kann ich leider nichts mit anfangen!
-
Den entscheidenden Teil des Codes hast du immer noch nicht gezeigt. Wie setzt du name? Gibt es eine setName-Funktion? Wenn ja, wie rufst du sie auf? Oder ist der Zeiger einfach uninitialisiert? Dann ist klar, warum das nicht klappt.
-
bcb-fanati schrieb:
@WF: Aha, kann ich leider nichts mit anfangen!
Aha. Wenn du das nicht verstehst, dann solltest du dir mal ein C++-Tutorial reinziehen. Wenn du es nicht verstehen willst, dann ist es eben dein Problem, und mir ist es egal! :p
-
danke, daran lag es wirklich, ich hab die setName() funktion nirgends aufgerufen.
SORRY! thx @ MFK
n8
-
Bitte, gern geschehen.
-
WebFritzi schrieb:
Ich wette, dein "name" in deiner Klasse ist kein gültiger String zum Zeitpunkt des Aufrufs des AnsiString-Konstruktors.
...weshalb man zurückgelieferte Zeiger immer prüfen sollte...
-junix