AnsiString/char problem
-
moinsen
bei folgender Zuweisung verweigert der Compiler seinen Dienst bzw. meldet eine Zugriffsverletzung. GetName liefert einen char*. Ändere ich das um in einen (Ansi)String, funktioniert die Zuweisung wunderbar.
String tabellen_name = ((table*)(db->tableList->Items[i]))->getName();
Ich möchte aber beim char* bleiben und da ich hier in einigen Beiträgen gelesen haben, dass diese Zuweisung automatisch typ-umgewandelt wird, muss es doch irgendwie gehen!? Ach übrigens: auch wenn ich um den gesamten rechten Ausdruck ein AnsiString() mache zur "erzwungenen Typumwandlung", kommt die Zugriffsverletzung an Adresse blabla.
Was mach ich falsch? (Achja: es geht! wirklich, wenn ich getName einen AnsiString returnen lasse, also das ganze davor stimmt, das problem liegt nur! bei der nicht möglich char* -> ansistr zuweisung)
mfg & thx
-
vielleicht hilft:
AnsiString.c_str();
(Mit strcpy in Variable Kopieren!)
-
hmm du meinst das für den linken Term? AnsiString.c_str = ... !?
mfg
-
Nicht direkt. War allgemein gemeint zur wandlung AnsiString zu char*.
Ev.:
AnsiString AS;
C_Text char[256];AS = ((table*)(db->tableList->Items[i]))->getName();
strcpy(C_Text,AS.c_str());
-
Ein Blick in die FAQ wirkt da wahre Wunder...
-junix
-
leider hilft ein blick in die faq keine wunder!
unter der rubrik ansistring steht nur das gegenteil von dem was ich will - nämlich AS nach char* konvertieren. ICH WILL ES ANDERSHERUM!Und genau das habe ich oben auch deutlich gemacht. Außerdem geht es ja mit AnsiString() als erzwungene Typumwandlung nicht
Wie geht es denn nun, dass mein Problem zu lösen ist?
Junix, deine Antwort also leider
-
Zeig doch mal die entsprechenden Teile deiner getName-Funktion, insbesondere, wie du den zurückzugebenden Zeiger deklarierst und initialisierst etc.
-
Gut, dann bewirkt ein Blick in die Konstruktordokumentation von AnsiString in der BCB Hilfe wunder...
-junix
-
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