Версия для печати темы
Форум разработчиков электроники ELECTRONIX.ru _ MCS51, AVR, PIC, STM8, 8bit _ работа со строками avr gcc
Автор: Alex_Golubev Oct 1 2017, 14:28
Привет.
Скажите пожалуйста. Если написать:
Код
const uchar Fill_lye_ENG[] PROGMEM = "step1";
окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?
Автор: mantech Oct 1 2017, 15:23
Цитата(Alex_Golubev @ Oct 1 2017, 17:28)
Привет.
Скажите пожалуйста. Если написать:
Код
const uchar Fill_lye_ENG[] PROGMEM = "step1";
окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?
В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.
Автор: jcxz Oct 1 2017, 15:52
Цитата(mantech @ Oct 1 2017, 22:23)
В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.
Только не 6 байт, а 6 элементов типа char.
Автор: mantech Oct 2 2017, 15:44
Цитата(jcxz @ Oct 1 2017, 18:52)
Только не 6 байт, а 6 элементов типа char.
В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.
Автор: gerber Oct 2 2017, 16:31
Цитата(mantech @ Oct 2 2017, 18:44)
В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.
А в контексте Intel Pentium Pro ?
Автор: jcxz Oct 2 2017, 17:34
Цитата(gerber @ Oct 2 2017, 23:31)
А в контексте Intel Pentium Pro ?
Это в первую очередь определяется не архитектурой, а компилятором.
Автор: gerber Oct 2 2017, 20:48
Цитата(jcxz @ Oct 2 2017, 20:34)
Это в первую очередь определяется не архитектурой, а компилятором.
Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?
Автор: jcxz Oct 3 2017, 08:14
Цитата(gerber @ Oct 3 2017, 03:48)
Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?
Никак.
Автор: mantech Oct 3 2017, 19:29
Цитата(jcxz @ Oct 2 2017, 20:34)
Это в первую очередь определяется не архитектурой, а компилятором.
Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)
Автор: aaarrr Oct 3 2017, 20:19
Цитата(mantech @ Oct 3 2017, 22:29)
Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)
Под любой элемент структуры? Нет, не выделится.
Автор: SSerge Oct 4 2017, 10:10
Цитата(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 получается без завершающего нуля.
К счастью такое допустимо только в С, а С++ такое уже не позволяет.
Автор: jcxz Oct 4 2017, 16:22
Цитата(mantech @ Oct 4 2017, 02:29)
Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)
Архитектура не выделяет байты. Байты выделяет компилятор.
Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.
Автор: gerber Oct 6 2017, 12:13
Цитата(jcxz @ Oct 4 2017, 19:22)
Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.
Зависит от заданного уровня оптимизации кода.
Автор: jcxz Oct 7 2017, 07:52
Цитата(gerber @ Oct 6 2017, 19:13)
Зависит от заданного уровня оптимизации кода.
Никогда не встречал такого. Приведите пример.
К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.
Автор: Сергей Борщ Oct 7 2017, 14:18
QUOTE (jcxz @ Oct 7 2017, 10:52)
К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.
Насколько помню, ARM7TDMI не имеет специальных арифметических команд работы с байтами, потому все байтовые операции выполняются в 32 битах и в конце на результат принудительно накладывается маска. Поэтому тип uint_fast8_t имеет разрядность 32 бита, что позволяет избежать этих накладываний маски. Таким образом, для оптимизации смысл есть, но возможность работать с "честными" байтами остается.
Автор: jcxz Oct 7 2017, 18:20
Цитата(Сергей Борщ @ Oct 7 2017, 17:18)
Насколько помню, ARM7TDMI не имеет специальных арифметических команд работы с байтами, потому все байтовые операции выполняются в 32 битах и в конце на результат принудительно накладывается маска.
Не важно какие арифметические команды имеет этот CPU. Так как это ядро
не имеет арифметических (или логических) команд с операндами в памяти.
Любой операнд должен быть предварительно загружен в регистр, а результат операции - выгружен в ОЗУ соответствующими командами LDR/STR.
Команды LDR/STR имеют варианты для 8-,16- и 32-битных данных. И выполняются за одинаковое время.
Никаких масок на 8-битный результат накладывать не надо - можно сразу выполнить STRB.
Автор: aaarrr Oct 7 2017, 18:27
Цитата(jcxz @ Oct 7 2017, 21:20)
Никаких масок на 8-битный результат накладывать не надо - можно сразу выполнить STRB.
Это если надо его записать в память. А если продолжить работу в регистрах, то придется.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)