Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
1

Как преобразовать const unsigned char в System::String^?

17.05.2015, 18:45. Показов 2838. Ответов 17
Метки нет (Все метки)

Всем привет.

Есть задание на Visual Studio c++ написать небольшую программку с Windows Forms. Руководствуясь собственной логикой пытаюсь пользоваться sqlite - к ней вопросов нет. Беда с преобразованием строк из топика.
C++
1
2
3
4
5
6
7
8
-- cut --
    const unsigned char *answer;
 
while (sqlite3_step(res) == SQLITE_ROW) {
    answer = sqlite3_column_text(res, 0);
    log << record_num << ": " << answer << endl;
    record_num++;
}
log - это файл в который пишу отладочную информацию. В нем вижу строку считанную из sqlite, но мне нужно эту же строку добавить в combobox:
C++
1
comboBox1->Items->Add(answer);
Получаю следующую ошибку компилера:
Ошибка 1 error C2664: "int System::Windows::Forms::ComboBox::ObjectCollection::Add(Syst em::Object ^)": невозможно преобразовать аргумент 1 из "const unsigned char *" в "System::Object ^"

Голову сломал и гугл уже замучился мне предлагать варианты, которые не работают. Подскажите, пожалуйста, как можно победить эту беду. Любой костыль годится.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2015, 18:45
Ответы с готовыми решениями:

Как преобразовать System::String в char?
Нужны рабочие варианты для visual studio C++. В инете куча примеров которые не работают в VS2015.

Правильный перевод из System::String^ в unsigned char и наоборот
Приветствую! Мне нужно навесить GUI на одно приложение. Вся проблема в том, что функциям...

Преобразование System::String^ в const char *
Добрый день. Обыскал весь инет. Но так и не нашел нормально решения ...

Конвертирование из const char*(System::String) в LPCWSTR
C++/CLI WinForms VS2008 У меня в Edit1 путь к файлу, который нужно передать в...

17
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
20.05.2015, 21:23 2
System::String имеет конструктор, принимающий char*
C++
1
comboBox1->Items->Add(gcnew String(answer));
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
20.05.2015, 22:24  [ТС] 3
Цитата Сообщение от tezaurismosis Посмотреть сообщение
comboBox1->Items->Add(gcnew String(answer));
Спасибо за ответ, но получаю при сборке следующую ошибку:
error C2664: 'System::String::String(wchar_t,int)' : cannot convert argument 1 from 'const unsigned char *' to 'const wchar_t *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Как могу догадаться, я мешаю C++ и классический C. Соответственно, и типы переменных из C приходится подтягивать под С++'ные и это не приветствуется даже компилятором. Т.е. чтобы использовать sqlite в коде C++ мне надо пользовать специальный коннектор(драйвер?) заточенный под C++?
0
2422 / 1824 / 402
Регистрация: 15.12.2013
Сообщений: 7,997
20.05.2015, 22:31 4
sandsnake, попробуйте трюк с auto. Иногда такое прокатывает.
0
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
21.05.2015, 12:07 5
sandsnake, попробуйте так
C++
1
comboBox1->Items->Add(gcnew String(reinterpret_cast<wchar_t*>(answer)));
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.05.2015, 15:10 6
Цитата Сообщение от sandsnake Посмотреть сообщение
const unsigned char *answer
У вас указатель на константу, вы не сможете поменять её значение.
1
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
21.05.2015, 17:25 7
MrCold, даже приведение типов не сработает?
0
870 / 768 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.05.2015, 17:40 8
А смысл приведения ? Константу ломать ? const_cast тогда .
И вообще
Если снимать const с переменной, которая изначально была const, то дальнейшее её использование приведёт к undefined behaviour.
http://alenacpp.blogspot.ru/2005/08/c.html
1
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
21.05.2015, 17:47 9
Проще будет const убрать из определения answer.
C++
1
unsigned char *answer;
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
21.05.2015, 21:33  [ТС] 10
Не-а, ни один вариант не сработал. И даже злой вариант с reinterpret_cast.
Переключился на access - коль уж занесло в винду, то виндовыми инструментами и надо пользоваться.
Спасибо!
0
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
21.05.2015, 21:41 11
Цитата Сообщение от sandsnake Посмотреть сообщение
Переключился на access
Для SQLite есть управляемые библиотеки System.Data.SQLite
0
0 / 0 / 0
Регистрация: 13.05.2015
Сообщений: 8
21.05.2015, 22:05  [ТС] 12
Да, есть. Но, как ни странно, она только для "взрослых" Visual Stuido, у меня же Express. Тут этого коннектора просто нет. Потому я и попробовал обойтись без него - внаглую подгрузил хэдер и слинковал dll-ку. Что из этого получилось вы уже видите.
На самом деле у меня задание довольно простое и может быть решено на любой BD, просто sqlite для меня родная уже с десяток лет под линухом, и надеялся с ней закончить работу быстрее.
Сейчас в самом деле переключился на access. С ним тоже есть странности, но это уже, вероятно, тема для другого топика.
0
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
22.05.2015, 10:04 13
Цитата Сообщение от sandsnake Посмотреть сообщение
попробовал обойтись без него - внаглую подгрузил хэдер и слинковал dll-ку. Что из этого получилось вы уже видите.
Этот заголовочный файл относится к неуправляемому коннектору, тот нужно было по другому подключать
C++
1
#using "System.Data.SQLite.dll"
это можно делать в любой версии VS. Но раз вопрос решён... это уже не важно.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
30.03.2016, 23:20 14
Всем привет! Очень помог вариант от tezaurismosis! За что ему огромнейшее спасибо! Почти неделю продолбался, искал как в String преобразовать PBYTE.
Ситуация была такая:
есть переменная PBYTE buffer; после некоторых манипуляций в неё попадали значения, выводить которые мне надо было в TreeView (метод вывода там такой же, как и у автора, через Add(Systeb::String^);
Вот и подошел ваш способ: DevTree->Nodes[0]->Nodes->Add(gcnew String(reinterpret_cast<wchar_t*>(buffer))); //DevTree - это было имя моего TreeView
Еще раз большое спасибо tezaurismosis!!! :-) ;-)
0
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
09.04.2016, 12:18 15
Cha1000000, да пожалуйста
Но ваш код не совсем верен. PBYTE определён следующим образом
C
1
2
typedef unsigned char BYTE;
typedef BYTE *PBYTE;
Т.е. это указатель на обычный char, а не на широкий (wchar_t).
C++
1
2
DevTree->Nodes[0]->Nodes->Add(
    gcnew String(reinterpret_cast<const char*>(buffer)));
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
09.04.2016, 15:53 16
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Т.е. это указатель на обычный char ...
Да вот похоже, что между обычным char и unsigned char таки есть разница.... С параметром wchar_t для reinterpret_cast у меня все надписи из переменной buffer в дереве отображались человеко-читабельно, а попробовал поменять на ваш вариант (reinterpret_cast<const char*>(buffer)) и там кракозябры вывелись... так, что оставил первый вариант с wchar_t
0
Администратор
Эксперт .NET
9192 / 4476 / 749
Регистрация: 17.04.2012
Сообщений: 9,276
Записей в блоге: 14
09.04.2016, 16:10 17
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Да вот похоже, что между обычным char и unsigned char таки есть разница....
В плане представления символов разницы скорее нет. Причина ещё может быть в разнице в работе конструктора типа System::String - для char вызывается один конструктор, а для wchar_t - другой.

Главное что у вас работает, остальное не важно.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
09.04.2016, 16:44 18
Тоже верно ;-)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2016, 16:44

Преобразовать System::String^ в char*
Есть строка: String^ str1; Как её можно преобразовать в const char*, например, для itoa()? ...

const unsigned char *
есть переменная const unsigned char * data, нужно скопировать len символов начиная с start позиции...

Как преобразовать System::String в System::String^
Как преобразовать System::String в System::String^? Явный пример: return (String(temp)); temp -...

Преобразование из "System::String ^" в "const char *"
Как преобразовать из &quot;System::String ^&quot; в &quot;const char *&quot; ?

Преобразование System::String^ в const char*
Здравствуйте! У меня такая проблема, я вызываю окно выбора файла, из которого буду выводить массив...

Преобразовать const unsigned char* в std::string (или _bstr_t )
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru