Alex_Golubev 0 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Привет. Скажите пожалуйста. Если написать: const uchar Fill_lye_ENG[] PROGMEM = "step1"; окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 51 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Привет. Скажите пожалуйста. Если написать: const uchar Fill_lye_ENG[] PROGMEM = "step1"; окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки? В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0. Только не 6 байт, а 6 элементов типа char. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 51 2 октября, 2017 Опубликовано 2 октября, 2017 · Жалоба Только не 6 байт, а 6 элементов типа char. В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 2 октября, 2017 Опубликовано 2 октября, 2017 · Жалоба В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже. А в контексте Intel Pentium Pro ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 2 октября, 2017 Опубликовано 2 октября, 2017 · Жалоба А в контексте Intel Pentium Pro ? Это в первую очередь определяется не архитектурой, а компилятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 2 октября, 2017 Опубликовано 2 октября, 2017 · Жалоба Это в первую очередь определяется не архитектурой, а компилятором. Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 3 октября, 2017 Опубликовано 3 октября, 2017 · Жалоба Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ? Никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 51 3 октября, 2017 Опубликовано 3 октября, 2017 · Жалоба Это в первую очередь определяется не архитектурой, а компилятором. Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 октября, 2017 Опубликовано 3 октября, 2017 · Жалоба Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита) Под любой элемент структуры? Нет, не выделится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 4 октября, 2017 Опубликовано 4 октября, 2017 · Жалоба окончиться ли строка нулем '\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 241 4 октября, 2017 Опубликовано 4 октября, 2017 · Жалоба Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита) Архитектура не выделяет байты. Байты выделяет компилятор. Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 6 октября, 2017 Опубликовано 6 октября, 2017 · Жалоба Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда. Зависит от заданного уровня оптимизации кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 7 октября, 2017 Опубликовано 7 октября, 2017 · Жалоба Зависит от заданного уровня оптимизации кода. Никогда не встречал такого. Приведите пример. К тому же - лишено всякого смысла для оптимизации, поэтому - не верю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 7 октября, 2017 Опубликовано 7 октября, 2017 · Жалоба К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.Насколько помню, ARM7TDMI не имеет специальных арифметических команд работы с байтами, потому все байтовые операции выполняются в 32 битах и в конце на результат принудительно накладывается маска. Поэтому тип uint_fast8_t имеет разрядность 32 бита, что позволяет избежать этих накладываний маски. Таким образом, для оптимизации смысл есть, но возможность работать с "честными" байтами остается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться