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

时间:2015-02-22 18:03:29

标签: c++ wxwidgets wxstring

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

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

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

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

如果我让程序继续,它会在我的wxTextCtrl中输出如下内容:

  

عњX(

任何想法? (顺便说一下,我在Windows 7系统中使用CodeWlocks和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。我有一个问题可能的要点但是,我无法找到解决在文本控件中打印指针地址的原始问题(而不是控制台屏幕)

4 个答案:

答案 0 :(得分:0)

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

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

我不是C ++专家..但对我来说,看起来像#34;变量狗的输出地址&#34;

如果您希望将其作为字符串,则可以使用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);

答案 1 :(得分:0)

指针的地址与指针的内容之间存在差异,尤其是C风格(nul终止的字符序列)。

例如:

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

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

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

StackOverflow上有一些示例用于打印变量的地址以及内容或C样式字符串。

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

答案 2 :(得分:0)

最后!!

我的问题的答案在这里:

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

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

wxStreamToTextRedirector redirect(myTextControl);

现在我正常使用cout对象,

cout<<puntero;

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

答案 3 :(得分: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();