-2

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

我有这本书,它提供了一个基于控制台的示例来解释 C++ 中的输入/输出流系统。在这里,我们可以打印一些指针的地址,而不用太复杂

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

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

如果我让程序继续,它会在我的 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。我对可能出现的问题有一个要点,但是,我找不到在文本控件(不是控制台屏幕)中打印指针地址的原始问题的解决方案

4

4 回答 4

0

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

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

我不是 C++ 专家.. 但对我来说这看起来像“变量狗的输出地址”

如果你想把它作为一个字符串,你可以使用 C++ 字符串流或者只是快乐的旧 Csprintf

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 样式(以 nul 结尾的字符序列)。

例如:

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

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

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

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

那么,你想要一个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

在 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 回答