реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> работа со строками avr gcc
Alex_Golubev
сообщение Oct 1 2017, 14:28
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877



Привет.
Скажите пожалуйста. Если написать:
Код
const uchar Fill_lye_ENG[] PROGMEM = "step1";

окончиться ли строка нулем '\0' ? Просто не понятно если строка записанная во флешь не окончиться нулем '\0' то как понять где конец строки?
Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 1 2017, 15:23
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 1 2017, 15:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(mantech @ Oct 1 2017, 22:23) *
В Си строки заканчиваются 0, не важно, какой компилятор, будет выделено 6 байт, последний =0.

Только не 6 байт, а 6 элементов типа char.
Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 2 2017, 15:44
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Oct 1 2017, 18:52) *
Только не 6 байт, а 6 элементов типа char.

В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.
Go to the top of the page
 
+Quote Post
gerber
сообщение Oct 2 2017, 16:31
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(mantech @ Oct 2 2017, 18:44) *
В общем случае - да, но в контексте 8бит МК - байт и char - одно и тоже.

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 2 2017, 17:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(gerber @ Oct 2 2017, 23:31) *
А в контексте Intel Pentium Pro ?

Это в первую очередь определяется не архитектурой, а компилятором.
Go to the top of the page
 
+Quote Post
gerber
сообщение Oct 2 2017, 20:48
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(jcxz @ Oct 2 2017, 20:34) *
Это в первую очередь определяется не архитектурой, а компилятором.

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 3 2017, 08:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(gerber @ Oct 3 2017, 03:48) *
Ого! И как же в таких компиляторах описать структуру с выравниванием в 1 байт ? Ну скажем, Ethernet-пакета ?

Никак.
Go to the top of the page
 
+Quote Post
mantech
сообщение Oct 3 2017, 19:29
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Oct 2 2017, 20:34) *
Это в первую очередь определяется не архитектурой, а компилятором.

Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 3 2017, 20:19
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Oct 3 2017, 22:29) *
Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)

Под любой элемент структуры? Нет, не выделится.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 4 2017, 10:10
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 4 2017, 16:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(mantech @ Oct 4 2017, 02:29) *
Не факт, например, в архитектуре АРМ7 или 9 под любой элемент выделится 4 байта(32бита)

Архитектура не выделяет байты. Байты выделяет компилятор.
Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.
Go to the top of the page
 
+Quote Post
gerber
сообщение Oct 6 2017, 12:13
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(jcxz @ Oct 4 2017, 19:22) *
Или Вы хотите сказать, что любой компилятор для этих архитектур всегда выделяет по 4 байта для любой переменной?? Конечно это неправда.

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


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 7 2017, 07:52
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(gerber @ Oct 6 2017, 19:13) *
Зависит от заданного уровня оптимизации кода.

Никогда не встречал такого. Приведите пример.
К тому же - лишено всякого смысла для оптимизации, поэтому - не верю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 7 2017, 14:18
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th April 2024 - 08:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016