c_str funktionier nicht
-
Hallo Leute,
habe folgenden code:
#include "stdafx.h" #include "test.h" #include <string> #include <cstring> #include <mysql++.h> #include <iostream> #include <iomanip> using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define WIN32_LEAN_AND_MEAN #define MT4_EXPFUNC __declspec(dllexport) #define DB_HOST "localhost" #define DB_USERNAME "root" #define DB_PASSWORD "********" #define DB_DATABASE "plankson" #pragma pack(push,1) struct MqlStr { int len; const char* string; }; #pragma pack(pop) MT4_EXPFUNC void __stdcall DLL_Test(MqlStr * Result) { mysqlpp::Connection conn(false); if (conn.connect(DB_DATABASE, DB_HOST, DB_USERNAME, DB_PASSWORD)) { mysqlpp::Query query = conn.query(); query << "SET NAMES 'utf8'"; query.execute(); query << "SELECT * FROM indicators"; int i = 0; if (mysqlpp::StoreQueryResult res = query.store()) { mysqlpp::StoreQueryResult::const_iterator it; for (it = res.begin(); it != res.end(); ++it) { mysqlpp::Row row = *it; Result[i].string = row[1].c_str(); i++; } } } }leider steht in der Result[n] immer nur ein komisches zeichen, jedoch nicht der erwartete string.
Result[n] wird nicht in C++ weiterverarbeitet, sondern in einer anderen sprache die call-by-reference unterstützt.
woran liegt das?
danke.
lg
-
c_str() liefert einen Zeiger in die interne Datenrepräsentation des Strings. Der wird natürlich ungültig, wenn der String neuen Speicher anfordert oder aus dem Scope fällt. Wenn du willst, daß die Daten unabhängig vom String weiterleben, mußt du schon eigenen Speicher anfordern und per copy() füllen.
(und die Freigabe nicht vergessen)PS: Ich hoffe, der Funktionsparameter zeigt auf ein ausreichen großes Array, um alle selektierten Werte reinpacken zu können.
-
Vielen dank.
Komisch ist aber, dass wenn ich result per cout ausgebe funktionierts, nur wenn ich die result vom hauptprogramm aufrufe gehts nicht. Danke
-
tomplank schrieb:
Komisch ist aber, dass wenn ich result per cout ausgebe funktionierts, nur wenn ich die result vom hauptprogramm aufrufe gehts nicht. Danke
Wo gibst du es denn aus, etwa direkt nach der Zuweisung? An er Stelle ist klar, daß es funktioniert - dort existiert der String auch noch und der Zeiger ist auch noch gültig.
-
Du bist anscheinend ein Profi, ich nur ein Anfänger.
Also meinst du ich sollte es in etwa so machen:
strcpy(Result[0].string, row[1].c_str());Danke
-
Ja, wenn du vorher dafür gesorgt hast, daß Result[0].string auf einen ausreichend großen Speicherbereich verweist (mindestens row[1].size()+1 Zeichen), sollte das klappen.
-
Hallo Profis,
habs jetzt so gemacht, leider ist das Problem noch immer das selbe:
#include "stdafx.h" #include "test.h" #include <string> #include <cstring> #include <mysql++.h> #include <iostream> #include <iomanip> using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define WIN32_LEAN_AND_MEAN #define MT4_EXPFUNC __declspec(dllexport) #define DB_HOST "localhost" #define DB_USERNAME "root" #define DB_PASSWORD "********" #define DB_DATABASE "plankson" #pragma pack(push,1) struct MqlStr { int len; const char* string; }; #pragma pack(pop) MT4_EXPFUNC void __stdcall DLL_Test(MqlStr * Result) { mysqlpp::Connection conn(false); if (conn.connect(DB_DATABASE, DB_HOST, DB_USERNAME, DB_PASSWORD)) { // Retrieve a subset of the sample stock table set up by resetdb // and display it. mysqlpp::Query query = conn.query(); query << "SET NAMES 'utf8'"; query.execute(); query << "SELECT * FROM indicators"; int i = 0; if (mysqlpp::StoreQueryResult res = query.store()) { cout << "We have:" << endl; mysqlpp::StoreQueryResult::const_iterator it; for (it = res.begin(); it != res.end(); ++it) { mysqlpp::Row row = *it; const char * tt = new char[row[1].size() + 1]; tt = row[1].c_str(); Result[i].string = tt; i++; } } } }danke und lg aus tirol
-
const char * tt = new char[row[1].size() + 1]; tt = row[1].c_str();Das ist ja auch genauso falsch wie bisher - zusätzlich ergänzt um ein Speicherleck, weil in der zweiten Zeile die Adresse des angeforderten Speichers überschrieben wird (und der Zeiger danach weiterhin in die internen Daten des Strings zeigt). Ersetz' diese Zeile doch durch deinen strcpy()-Aufruf (oder std::string::copy()).
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.