|
Текстовая строка без нулевого байта, как избавиться от terminating null? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 23)
|
Jun 21 2009, 12:17
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(HARMHARM @ Jun 21 2009, 16:05)  const char a[4] = { 'A','B','C','D'}; Это я знаю, но это крайний случай, слишком неудобно. Во первых, надо вручную подсчитывать число знаков, во вторых, юзать неудобоваримую запись текста... Гораздо приятнее работать с видом "Some text", а всю рутинную работу должен делать компилятор. Странно, что в Си нет встроенного удобного механизма для исключения лишнего нулевого байта, ведь не всегда же он нужен!
|
|
|
|
|
Jun 21 2009, 12:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата main.cpp... так C или C++? Не поверил, что не фунциклирует static char a[4] = "ABCD"; и проверил в IAR 4.11B для MSP430 - всё путём
--------------------
aka Vit
|
|
|
|
|
Jun 21 2009, 12:35
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(sonycman @ Jun 21 2009, 16:33)  и С++... А по что тогда дезинформацию вносите? Вы же спрашивали - "ЗЫ: и вообще, интересно, как в Си получить строку без нуля на конце?" если в C++ то свой класс такой строки написать.
|
|
|
|
|
Jun 21 2009, 13:30
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(SM @ Jun 21 2009, 17:17)  Это зачем? А у меня эти строки лежат внутри строкового USB дескриптора, и длина всего дескриптора включает в себя, кроме строки, ещё несколько полей. Поэтому из общей длины дескриптора приходится вычитать 2, чтобы не передавать лишние нули - неизвестно, как их воспримет хост... Зато, с другой стороны, изменить содержимое строк очень просто  Спасибо за помощь!
|
|
|
|
|
Jun 21 2009, 13:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата А у меня эти строки лежат внутри строкового USB дескриптора Если это единый текстовый "блок", то может быть удобной передача его как одной строки. Тогда можно записать это одной строкой, но "не совсем обычным способом"(С) (дальше было "- в кредит и за советские рубли"): Код const char descriptor[]= "Строка 1" "Строка 2" "Прибамбас" "Фишечка";
--------------------
aka Vit
|
|
|
|
|
Jun 21 2009, 14:35
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(sensor_ua @ Jun 21 2009, 17:40)  Если это единый текстовый "блок", то может быть удобной передача его как одной строки. Тогда можно записать это одной строкой, но "не совсем обычным способом"(С) (дальше было "- в кредит и за советские рубли"): Код const char descriptor[]= "Строка 1" "Строка 2" "Прибамбас" "Фишечка"; Прикольно  Нет, там не только текст, ещё байт длины и байт типа дескриптора. Вообще не очень удобно в Си (и в Си++) со структурами, в которых данные могут иметь различную длину, не известную на момент декларирования структуры, но известную после присваивания ей значения. Язык требует указания точного значения прямо во время декларирования...
|
|
|
|
|
Jun 21 2009, 15:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Вообще не очень удобно в Си (и в Си++) со структурами, в которых данные могут иметь различную длину, не известную на момент декларирования структуры, но известную после присваивания ей значения. Язык требует указания точного значения прямо во время декларирования... Насчёт плюсов не скажу, но не был бы так категоричен. В Си действительно с этим сложновато. В C99 появились массивы переменной длины. Такой массив размещается в конце структуры. И с sizeof введены изменения насчёт рантайма. Посмотрите, авось чего получится ЗЫ. Если байт длины описывает длину дескриптора, то, ИМХО, это поле лишнее.
--------------------
aka Vit
|
|
|
|
|
Jun 21 2009, 19:37
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(sergeeff @ Jun 21 2009, 22:42)  Не проще ли написать функцию, которая в качестве параметра получают обычную С-строку и сама затем преобразует в unicode строку и заполняет все необходимые поля usb дескриптора. Я так понимаю, вам это часто приходится проделывать? Да нет, не часто. Но нужно будет время от времени. Тоже думал про отдельную функцию, но решил, что всё же она лишняя. ЗЫ: слава богу ещё, что USB дескрипторы сформатированы в little endian, а то недавно осваивал карты памяти - там сплошной big endian. Вот где полная задница - компиляторы не имеют механизма смены "индейца", как результат - полная неработоспособность структур с битовыми полями - всё пришлось делать ручками...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|