Перейти к содержанию
    

работа со строками avr gcc

Привет.

Скажите пожалуйста. Если написать:

const uchar Fill_lye_ENG[] PROGMEM = "step1";

окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет.

Скажите пожалуйста. Если написать:

const uchar Fill_lye_ENG[] PROGMEM = "step1";

окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?

 

В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.

Только не 6 байт, а 6 элементов типа char.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только не 6 байт, а 6 элементов типа char.

В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.

А в контексте Intel Pentium Pro ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в контексте Intel Pentium Pro ?

Это в первую очередь определяется не архитектурой, а компилятором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это в первую очередь определяется не архитектурой, а компилятором.

Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?

Никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это в первую очередь определяется не архитектурой, а компилятором.

Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)

Под любой элемент структуры? Нет, не выделится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

окончиться ли строка нулем '\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 получается без завершающего нуля.

К счастью такое допустимо только в С, а С++ такое уже не позволяет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)

Архитектура не выделяет байты. Байты выделяет компилятор.

Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.

Зависит от заданного уровня оптимизации кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зависит от заданного уровня оптимизации кода.

Никогда не встречал такого. Приведите пример.

К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.
Насколько помню, ARM7TDMI не имеет специальных арифметических команд работы с байтами, потому все байтовые операции выполняются в 32 битах и в конце на результат принудительно накладывается маска. Поэтому тип uint_fast8_t имеет разрядность 32 бита, что позволяет избежать этих накладываний маски. Таким образом, для оптимизации смысл есть, но возможность работать с "честными" байтами остается.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...