【问题标题】:Getting the address of a pointer and convert it in a wxString获取指针的地址并将其转换为 wxString
【发布时间】:2015-04-24 00:55:00
【问题描述】:

我正在尝试将指针的地址转换为 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。我对可能出现的问题有一个要点,但是我找不到解决在文本控件(不是控制台屏幕)中打印指针地址的原始问题的解决方案

【问题讨论】:

  • 你能放一个代码 sn-p 给你“断言失败”。这样观众会更容易理解问题到底是什么。
  • 您要打印变量的地址还是C-Style字符串的内容?
  • 不清楚你在问什么。您是否希望 wxTextCtrl 包含存储variable 的内存位置地址的人类可读表示?

标签: c++ wxwidgets wxstring


【解决方案1】:

在 C++ 中执行所需操作的常用方法是使用 std::stringstream(您需要使用 #include &lt;sstream&gt;)。然后,您的函数主体将如下所示:

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

如果您只想获得包含输出到该流的所有内容的 wxString,您只需执行以下操作:

wxString mystr = tmpss.str();

【讨论】:

  • 谢谢博格丹!这将对我有很大帮助。我害怕的是过度依赖标准库“外部”的方法。很高兴知道事情通常是如何完成的,有时当已经有更简单的解决方案可用时,我们会在复杂的周转过程中处理事情。
  • @RainMaker 干杯!尽可能使用标准库是可行的方法。对于此示例,请记住还有 std::istringstreamstd::ostringstream。就像其他类型的流一样,使用相应类型的流来执行您需要的操作(输入或输出)通常是一个好主意。在这里,出于纯粹的懒惰,我使用了支持两者的那个。
【解决方案2】:

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

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

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

如果你想把它作为一个字符串,你可以使用 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);

【讨论】:

  • Helle Grady,这将在基于控制台的程序中工作,但在这里我在 CodeBlocks 中使用 wxSmith(就像我之前所说的那样)制作一个 GUI 来尝试在文本控件中输出指针的地址.到目前为止,我可以使用 wxAny 类和方法 .As() 打印一些不可读的字符。
【解决方案3】:

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

例如:

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

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

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

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

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

【讨论】:

  • 您好 Thomas,我想要一个包含指针地址的 wxString。不是指针指向的值。似乎我的问题太复杂了,我会更新它,添加让我出错的代码。
【解决方案4】:

终于!!

我的问题的答案在这里:

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

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

wxStreamToTextRedirector redirect(myTextControl);

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

cout<<puntero;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2017-07-09
    • 2015-03-10
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多