|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
||||||
Const char* и нулевые биты24.02.2015, 23:00. Показов 4426. Ответов 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 *' Нулевые биты указанного числа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|