Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники 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)