获取指针的地址并将其转换为 wxString

Getting the address of a pointer and convert it in a wxString

我正在尝试将指针的地址转换为 wxWidgets 库的 wxString。

我有这本书,它提供了一个基于控制台的示例来解释 C++ 中的 input/output 流系统。在这里,我们可以使用

打印一些指针的地址,而不会有太多复杂性
const char *const variable = "again";
cout << static_cast<void*>(variable);

到目前为止我可以理解这个例子,但是(现在更复杂了)我想从这些例子中制作一些 GUI 来训练自己并探索 wxWidgets classes 以及本书。我已经使用 wxAny class 的 As() 方法成功地进行了一些转换,甚至在没有警告或错误的情况下编译了它。但是在执行时,我在尝试转换类型时得到 "Assert failure"。

如果我让程序继续运行,它会在我的 wxTextCtrl 中打印如下内容:

ﻌњ̎X(

有什么想法吗?? (顺便说一句,我在 windows 7 系统中将 CodeBlocks 与 Mingw32 和 wxWidgets 3.0 一起使用) 这是给我断言失败的代码:

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。我大概知道问题出在哪里但是,我找不到解决在文本控件(不是控制台屏幕)中打印指针地址的原始问题的方法

我不知道你的问题与 wxWidgets 有什么关系,但这对我有用:

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

我不是 C++ 专家..但对我来说这看起来像 "output address of variable 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);

指针的地址和指针的内容之间存在差异,尤其是对于 C 风格(以 nul 结尾的字符序列)。

例如:

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

变量 text 是指向字符串文字的 指针 。指针的内容是字符串文字所在的位置;通常称为 地址

表达式 &text 表示 指针 的位置或地址。因此,如果指针位于地址 0x4000,则表达式 &text 将 return 0x4000;不是指针的内容。

Whosebug 上有用于打印变量的 地址 和内容或 C 样式字符串的示例。

那么,你想要一个 wxString 包含指针的地址还是指针指向的字符串文字?

终于!!

我的问题的答案在这里:

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

这是文本控件的文档。我只需要将输出流重定向到文本控件:

wxStreamToTextRedirector redirect(myTextControl);

现在我正常使用cout对象了,

cout<<puntero;

并且输出将显示在文本控件中而不是控制台屏幕中。我无法创建包含地址的 wxString 但到目前为止这至少可以显示它。我知道从现在开始我可以从文本控件的内容和它的成员函数创建一个字符串。如果你们中的任何人有更好的答案,我会很乐意接受。有趣的是,我所在的那一章是 in/out 流,而我的问题的解决方案却没有在书中给出。

在 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();