Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Текстовая строка без нулевого байта
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
sonycman
Компилятор RealView из комплекта Keil MDK3.70.

Хочется получить текстовую строку в юникоде без нулевого байта.
Строки вида L"Text" включают в себя нулевой байт.
Как от него избавиться?

ЗЫ: и вообще, интересно, как в Си получить строку без нуля на конце?
Конструкция вида 'Text' не прокатывает - компилер ругается на слишком много символов...
SM
static char tst[4] = "ABCD"; // и будет Вам 4 байта
sonycman
Цитата(SM @ Jun 21 2009, 15:56) *
static char tst[4] = "ABCD"; // и будет Вам 4 байта

Попробовал:
Код
static char    a[4] = "ABCD";
main.cpp(112): error:  #144: a value of type "const char [5]" cannot be used to initialize an entity of type "char [4]"
HARMHARM
const char a[4] = { 'A','B','C','D'};
sonycman
Цитата(HARMHARM @ Jun 21 2009, 16:05) *
const char a[4] = { 'A','B','C','D'};

Это я знаю, но это крайний случай, слишком неудобно.
Во первых, надо вручную подсчитывать число знаков, во вторых, юзать неудобоваримую запись текста...
Гораздо приятнее работать с видом "Some text", а всю рутинную работу должен делать компилятор.

Странно, что в Си нет встроенного удобного механизма для исключения лишнего нулевого байта, ведь не всегда же он нужен!
SM
Видимо из-за того, что C++, а не C. Я такое в MSVC без проблем использую, но именно в ".c" файлах. В gcc тоже. А вот с вашим конкретным компилером к сожалению не знаком, но по идее должно работать, если речь все же о Си, а не о плюсах.
sensor_ua
Цитата
main.cpp...

так C или C++?
Не поверил, что не фунциклирует
static char a[4] = "ABCD";
и проверил в IAR 4.11B для MSP430 - всё путём
sonycman
Ну, у вас IAR, а у меня RV и С++...
Интересно, почему в плюсах порезали такую фичу?
SM
Цитата(sonycman @ Jun 21 2009, 16:33) *
и С++...

А по что тогда дезинформацию вносите?

Вы же спрашивали - "ЗЫ: и вообще, интересно, как в Си получить строку без нуля на конце?"

если в C++ то свой класс такой строки написать.
prottoss
Цитата(sonycman @ Jun 21 2009, 20:17) *
Во первых, надо вручную подсчитывать число знаков...
sizeof() в помощь
SM
Цитата(sonycman @ Jun 21 2009, 16:17) *
Во первых, надо вручную подсчитывать число знаков, во вторых, юзать неудобоваримую запись текста...

не надо, можно написать
char a[] = {...};
а с во вторых - согласен.
sonycman
В общем, юзаю пока конструкцию L"String text", а затем в программе приходится вычитать 2 байта из длины строки.
Но лишние нули в памяти, конечно же, присутствуют...
SM
Цитата(sonycman @ Jun 21 2009, 17:16) *
В общем, юзаю пока конструкцию L"String text", а затем в программе приходится вычитать 2 байта из длины строки...

Это зачем? Длина строки - strlen - возвращает длину без нулевого символа. Точнее, в Вашем случае, wcslen - таким образом

static wchar_t string[] = L"qwdqwedqwed"; и ничего нигде вручную считать не надо. wcslen даст сразу нужную длину. А вот 2 байта - да.
sonycman
Цитата(SM @ Jun 21 2009, 17:17) *
Это зачем?

А у меня эти строки лежат внутри строкового USB дескриптора, и длина всего дескриптора включает в себя, кроме строки, ещё несколько полей.
Поэтому из общей длины дескриптора приходится вычитать 2, чтобы не передавать лишние нули - неизвестно, как их воспримет хост...

Зато, с другой стороны, изменить содержимое строк очень просто smile.gif

Спасибо за помощь!
sensor_ua
Цитата
А у меня эти строки лежат внутри строкового USB дескриптора

Если это единый текстовый "блок", то может быть удобной передача его как одной строки.
Тогда можно записать это одной строкой, но "не совсем обычным способом"(С) (дальше было "- в кредит и за советские рубли"):
Код
const char descriptor[]=
"Строка 1"
"Строка 2"
"Прибамбас"
"Фишечка";
sonycman
Цитата(sensor_ua @ Jun 21 2009, 17:40) *
Если это единый текстовый "блок", то может быть удобной передача его как одной строки.
Тогда можно записать это одной строкой, но "не совсем обычным способом"(С) (дальше было "- в кредит и за советские рубли"):
Код
const char descriptor[]=
"Строка 1"
"Строка 2"
"Прибамбас"
"Фишечка";

Прикольно smile.gif

Нет, там не только текст, ещё байт длины и байт типа дескриптора.
Вообще не очень удобно в Си (и в Си++) со структурами, в которых данные могут иметь различную длину, не известную на момент декларирования структуры, но известную после присваивания ей значения.
Язык требует указания точного значения прямо во время декларирования...
sensor_ua
Цитата
Вообще не очень удобно в Си (и в Си++) со структурами, в которых данные могут иметь различную длину, не известную на момент декларирования структуры, но известную после присваивания ей значения.
Язык требует указания точного значения прямо во время декларирования...

Насчёт плюсов не скажу, но не был бы так категоричен. В Си действительно с этим сложновато. В C99 появились массивы переменной длины. Такой массив размещается в конце структуры. И с sizeof введены изменения насчёт рантайма.
Посмотрите, авось чего получится
ЗЫ. Если байт длины описывает длину дескриптора, то, ИМХО, это поле лишнее.
SM
Понятно smile.gif Я, вообще, ассемблером заделал блок дескрипторов... Чтоба не возиться с указанными вопросами и полностью автоматизировать вычисление длин на этапе компиляции....
sonycman
Цитата(SM @ Jun 21 2009, 19:46) *
Понятно smile.gif Я, вообще, ассемблером заделал блок дескрипторов... Чтоба не возиться с указанными вопросами и полностью автоматизировать вычисление длин на этапе компиляции....

У меня тоже автоматом всё. Но с ассемблером, как только на Си перешёл, дел стараюсь не иметь laughing.gif
С ним обычно, наоборот, мороки на порядок больше...
sergeeff
Не проще ли написать функцию, которая в качестве параметра получают обычную С-строку и сама затем преобразует в unicode строку и заполняет все необходимые поля usb дескриптора. Я так понимаю, вам это часто приходится проделывать?
sonycman
Цитата(sergeeff @ Jun 21 2009, 22:42) *
Не проще ли написать функцию, которая в качестве параметра получают обычную С-строку и сама затем преобразует в unicode строку и заполняет все необходимые поля usb дескриптора. Я так понимаю, вам это часто приходится проделывать?

Да нет, не часто. Но нужно будет время от времени.
Тоже думал про отдельную функцию, но решил, что всё же она лишняя.

ЗЫ: слава богу ещё, что USB дескрипторы сформатированы в little endian, а то недавно осваивал карты памяти - там сплошной big endian.
Вот где полная задница - компиляторы не имеют механизма смены "индейца", как результат - полная неработоспособность структур с битовыми полями - всё пришлось делать ручками... smile3046.gif
meister
Цитата(sergeeff @ Jun 21 2009, 22:42) *
написать функцию


Это уже рантайм. Как идея, конечно, зависит от количества дескриптором и того, как часто их нужно править... написать свой препроцессор.
SM
Цитата(meister @ Jun 22 2009, 11:11) *
написать свой препроцессор.

Ну уж прям и препроцессор... Это все можно сгенирить обычными bash/awk/perl/e.t.c. (что кому привычнее) из простого списка строк и включить в make (или pre-build step)... Если уж в эту сторону думать.
ReAl
А ещё COG - и не только для этого.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.