Я пытаюсь преобразовать адрес указателя в wxString библиотеки wxWidgets.
У меня есть эта книга, которая представляет консольный пример для объяснения системы потоков ввода / вывода в C ++. Здесь мы можем напечатать адрес некоторых указателей без особых сложностей, используя
const char *const variable = "again";
cout << static_cast<void*>(variable);
Пока я могу понять пример, но (теперь сложность) я хочу сделать из этих примеров графический интерфейс, чтобы обучить себя и изучить классы wxWidgets вместе с книгой. Я успешно сделал некоторые преобразования с помощью метода As () класса wxAny и даже скомпилировал его без предупреждений или ошибок. Но во время выполнения я получаю «Ошибка утверждения» при попытке преобразовать типы.
Если я продолжу программу, она напечатает в моем wxTextCtrl такие вещи, как:
ع њX (
Есть идеи??
(кстати, я использую CodeBlocks с Mingw32 и wxWidgets 3.0 в системе Windows 7)
это код, который дает мне ошибку подтверждения:
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. У меня есть суть того, в чем может быть проблема, но я не могу найти решение исходной проблемы печати адреса указателя в текстовом элементе управления (НЕ на экране консоли)
Распространенный способ сделать то, что вы хотите в 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();
Я не знаю, как ваш вопрос связан с wxWidgets, но это работает для меня:
const char * dog = "dog";
std::cout << &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 (последовательность символов с нулевым символом в конце).
Например:
const char * const text = "Some Text\n";
Переменная text
это указатель в строковый литерал. Содержимое указателя — это место, где находится строковый литерал; часто называют адрес.
Выражение, &text
, представляет местоположение или адрес указатель. Так что, если указатель находится по адресу 0x4000, выражение &text
вернул бы 0x4000; не содержание указателя.
В StackOverflow есть примеры для печати адрес переменной и ее содержимое или строка в стиле C
Итак, вы хотите wxString
содержащий адрес указателя или строкового литерала, на который указывает указатель?
Наконец!!
Ответ на мой вопрос был здесь:
http://docs.wxwidgets.org/trunk/classwx_text_ctrl.html
Это документация текстового контроля. Мне просто пришлось перенаправить поток вывода в текстовый элемент управления с помощью:
wxStreamToTextRedirector redirect(myTextControl);
И теперь я обычно использую объект cout,
cout<<puntero;
и вывод будет представлен в текстовом элементе управления вместо экрана консоли. Я не мог создать wxString, содержащую адрес, но пока это может, по крайней мере, показать его. Я знаю, что с этого момента я могу создать строку из содержимого текстового элемента управления и его функций-членов. Если у кого-то из вас есть лучший ответ, я с радостью приму его. Забавно, что глава книги, в которой я нахожусь, находится в потоковом режиме и решение моей проблемы не представлено в книге.