|
работа со строками avr gcc |
|
|
|
Oct 1 2017, 14:28
|
Местный
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877
|
Привет. Скажите пожалуйста. Если написать: Код const uchar Fill_lye_ENG[] PROGMEM = "step1"; окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?
|
|
|
|
|
Oct 1 2017, 15:23
|
Гуру
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143
|
Цитата(Alex_Golubev @ Oct 1 2017, 17:28) Привет. Скажите пожалуйста. Если написать: Код const uchar Fill_lye_ENG[] PROGMEM = "step1"; окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки? В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.
|
|
|
|
|
Oct 2 2017, 16:31
|
Знающий
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088
|
Цитата(mantech @ Oct 2 2017, 18:44) В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже. А в контексте Intel Pentium Pro ?
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Oct 2 2017, 20:48
|
Знающий
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088
|
Цитата(jcxz @ Oct 2 2017, 20:34) Это в первую очередь определяется не архитектурой, а компилятором. Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Oct 4 2017, 10:10
|
Профессионал
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528
|
Цитата(Alex_Golubev @ Oct 1 2017, 21:28) окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки? В Вашем случае завершающий нуль будет. Строка в кавычках (называется строковый литерал) всегда имеет завершающий нуль, и когда этот литерал используется для инициализации массива нуль тоже будет присутствовать в массиве во всех случаях, кроме одного. В одном частном случае можно наступить на грабли. Пример из стандарта С, раздел 6.7.9 Initialization: Код EXAMPLE 8 The declaration char s[] = "abc", t[3] = "abc"; defines ‘‘plain’’ char array objects s and t whose elements are initialized with character string literals. This declaration is identical to char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' }; Массив t получается без завершающего нуля. К счастью такое допустимо только в С, а С++ такое уже не позволяет.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Oct 6 2017, 12:13
|
Знающий
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088
|
Цитата(jcxz @ Oct 4 2017, 19:22) Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда. Зависит от заданного уровня оптимизации кода.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Oct 7 2017, 14:18
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
QUOTE (jcxz @ Oct 7 2017, 10:52) К тому же - лишено всякого смысла для оптимизации, поэтому - не верю. Насколько помню, ARM7TDMI не имеет специальных арифметических команд работы с байтами, потому все байтовые операции выполняются в 32 битах и в конце на результат принудительно накладывается маска. Поэтому тип uint_fast8_t имеет разрядность 32 бита, что позволяет избежать этих накладываний маски. Таким образом, для оптимизации смысл есть, но возможность работать с "честными" байтами остается.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|