-2

ポインタのアドレスを wxWidgets ライブラリの wxString に変換しようとしています。

私は、C++ の入出力ストリーム システムを説明するコンソール ベースの例を紹介するこの本を持っています。ここでは、いくつかのポインタのアドレスをあまり複雑にすることなく出力できます。

const char *const variable = "again";
cout << static_cast<void*>(variable);

これまでのところ、例は理解できましたが (複雑な問題です)、例から GUI を作成して自分自身を訓練し、本と一緒に wxWidgets クラスを調べたいと思います。wxAny クラスの As() メソッドを使用していくつかの変換に成功し、警告やエラーなしでコンパイルすることさえできました。しかし、実行時に型を変換しようとすると「Assert failure」が発生します。

プログラムを続行させると、wxTextCtrl に次のように出力されます。

ﻌњ̎X(

何か案は??(ところで、Windows 7システムでMingw32およびwxWidgets 3.0でCodeBlocksを使用しています)これは、アサートの失敗を引き起こすコードです:

void ConsoleFrame::OnbtnFrase2Click(wxCommandEvent& event)
{
string chaine2("Value of the pointer: ");
void* puntero = &chaine2;
wxAny anyThing= puntero;
consoleText->AppendText(anyThing.As<wxString>());
}

これは、アサート失敗エラーを発生させるメソッドです。以前にコードを修正してくれた @Grady に感謝します。void* を wxString に変換できないようです。問題の要点はわかっていますが、ポインターのアドレスをテキスト コントロール (コンソール画面ではなく) に出力するという元の問題の解決策が見つかりません。

4

4 に答える 4

0

ポインターのアドレスとポインターの内容には違いがあり、特に C スタイル (文字のヌル終了シーケンス) では違いがあります。

例えば:

const char * const text = "Some Text\n";  

変数textは、文字列リテラルへのポインターです。ポインターの内容は、文字列リテラルが存在する場所です。多くの場合、アドレスと呼ばれます。

式は、ポインター&textの位置またはアドレスを表します。したがって、ポインターがアドレス 0x4000 にある場合、式は 0x4000 を返します。ポインターの内容ではありません。 &text

変数のアドレスと内容または C スタイルの文字列を出力する ための StackOverflow の例があります。

ポインタのアドレスを含むが必要ですwxStringか、それともポインタが指す文字列リテラルが必要ですか?

于 2015-02-22T20:20:23.240 に答える
0

やっと!!

私の質問への答えはここにありました:

http://docs.wxwidgets.org/trunk/classwx_text_ctrl.html

これは、テキスト コントロールのドキュメントです。次のようにして、出力ストリームをテキスト コントロールにリダイレクトする必要がありました。

wxStreamToTextRedirector redirect(myTextControl);

そして今、私は cout オブジェクトを普通に使っています。

cout<<puntero;

出力は、コンソール画面ではなくテキスト コントロールに表示されます。アドレスを含む wxString を作成できませんでしたが、これまでのところ、少なくともそれを表示できます。ここからは、テキスト コントロールの内容とそのメンバー関数から文字列を作成できることがわかっています。より良い回答があれば、喜んで受け入れます。私がいる本の章がストリームに出入りしていて、私の問題の解決策が本に提示されていないのは面白いです。

于 2015-02-23T16:50:27.423 に答える
0

あなたの質問がwxWidgetsと何の関係があるのか​​ わかりませんが、これは私にとってはうまくいきます:

const char * dog = "dog";
std::cout << &dog;

私は C++ の専門家ではありませんが、「変数 dog の出力アドレス」のように見えます。

それを文字列として使用したい場合は、C++文字列ストリームまたは単に幸せな古いCを使用できますsprintf

char * addrString = (char *)malloc(sizeof(void *) * 2 + 3); //  *2 bytes for hex rep, +3 for "0x" and null
sprintf(addrString, "%p",dog);
于 2015-02-22T19:07:59.037 に答える
0

C++ でやりたいことを行う一般的な方法は、std::stringstream(する必要があります#include <sstream>) を使用することです。関数の本体は次のようになります。

string chaine2("Value of the pointer: ");
void* puntero = &chaine2;
stringstream tmpss;
tmpss << chaine2 << puntero;
consoleText->AppendText(tmpss.str());

wxStringそのストリームに出力されたすべてを含むを取得したいだけの場合は、次のようにします。

wxString mystr = tmpss.str();
于 2015-02-23T16:54:55.900 に答える