|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||||||
Const char* и нулевые биты24.02.2015, 23:00. Показов 4341. Ответов 32
Метки нет (Все метки)
Столкнулась с такой проблемой: есть переменная типа string, например
string str = "A"; Мне требуется расширить ее до 16 бит, для этого делаю str.resize(str.size() + 8); Получаем размер 16 Мне нужно скопировать ее в переменную const char*: const char *cstr = str.c_str(); При выводе размера, получаю 8 вместо 16, то есть нулевые биты никак не учитываются. Более того, если после нулевых бит, я добавлю еще что-нибудь, например допишу единичку, то она так же не учитывается Добавлено через 6 минут Понагляднее пример:
0
|
||||||
| 24.02.2015, 23:00 | |
|
Ответы с готовыми решениями:
32
... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" |
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 25.02.2015, 15:13 | ||
Все ясно. Тут нет вообще никаких проблем. Передавай результат data.c_str() обратно, если там действительно 64 байта и testbench тоже ждет 64 байта, то все будет хорошо. const char * - это же не копия данных из string, это указатель на начало последовательности, которую хранит std::string. Т.е. все нужные байты там есть, не смотря на то, что strlen выдает тебе размер меньше. Просто strlen не расчитан на работу с бинарными данными, не нужно его использовать в этой ситуации и все.
0
|
||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||
| 25.02.2015, 16:39 [ТС] | ||
|
после расширения должно быть так (string) 4180000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000008000000 00000000 А у const char* получается 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 00004180 То есть он букву А и единичный бит получил, дальше решил, что строка кончилась и вывел нули до конца 512 битной переменной...(в моем тестбенче она типа bit[511:0])
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 25.02.2015, 16:49 | |||||||
0
|
|||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||
| 25.02.2015, 16:53 [ТС] | ||
|
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||||||||||
| 25.02.2015, 19:09 | |||||||||||||||||||
Можно предположить, что это не из-за алгоритма как такового (или const char * в частности), а из-за ошибки возвращения указателя на уничтоженные данные. Вот твоя функция:
Что касается функции, для своего теста я переделал ее так (убрал лишнее выделение динамической памяти и вышеописанную ошибку):
0
|
|||||||||||||||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||||||||||||
| 25.02.2015, 22:12 [ТС] | ||||||||||||
|
Большое спасибо, что столько времени уделяется)
Смотрите, что получается. Я переделала, как вы сказали. И добавила вывод размера, чтобы проверять полностью копирует он или опять до нулей. Добавочная функция (у вас она testbench названа):
Добавлено через 22 минуты Возможно, вы скажете, что по размеру не стоит проверять, но вывод из тестового окружения моего показывает тоже, что передалось только 4180. Если интересно, вызов тестбенча (systemverilog программа) выглядит так:
# Padder : ext_mes hex= 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 00004180
1
|
||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||
| 25.02.2015, 22:23 | |||||||||
|
Добавлено через 4 минуты Да и функцию эту так нельзя описывать. Тут повторяется та же ошибка. mes - локальная переменная. Она уничтожится после выхода из области видимости функции и буфер, который вернула c_str "повиснет".
Добавлено через 5 минут
0
|
|||||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||
| 25.02.2015, 22:28 [ТС] | ||
|
Это соответствие типов: (см чуть ниже таблицу mapping data types) http://www.testbench.in/DP_07_DATA_TYPES.html В sv стринг это тот же стринг, что и в си, но передавать си-программа стринг не может, только те типы, что на картинке, а в sv они преобразуются уже в другие
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 25.02.2015, 22:46 | |||
Сообщение было отмечено Sandra357 как решение
РешениеДобавлено через 3 минуты Добавлено через 5 минут Sandra357, почитал немного твои ссылки. Похоже bit тоже не подойдет. А вот Unpacked array похоже то, что нужно.
0
|
|||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||
| 25.02.2015, 22:48 [ТС] | ||
|
А что, если возвращать указатель на массив int из 64 элементов? Сейчас посмотрю, что получается
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 25.02.2015, 22:53 | ||
|
Sandra357, вот что-то на эту тему. Найти бы теперь как там размер проверить, чтобы меньше 64 нельзя было передать
![]() А, вот. Ключевое слово для поиска "svOpenArrayHandle". Находит ссылки на форум systemverilog, но по здешним правилам их нельзя постить. Надеюсь сама сможешь разобраться ![]() Добавлено через 1 минуту
1
|
||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
| 25.02.2015, 22:56 [ТС] | |
|
DrOffset, спасибо большое за наводку! Целый день на меня потратили)) Буду разбираться)
1
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 25.02.2015, 22:58 | ||
0
|
||
| 25.02.2015, 22:58 | |
|
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' Ошибка "значение типа "const char [81]" нельзя использовать для инициализации сущности типа "const unsigned char [61]" Cannot convert 'const wchar_t *' to 'const char *' Нулевые биты указанного числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|