13.11.2017, 21:40
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от SashaBu
|
Почему-то никто не замечает, что вот это:
static char value[] = "";
хоть static, хоть без, резервирует в ОЗУ только один байт, т.е. создаёт массив из одного 0, или - в зависимости от реализации - из пары байтов 0x0d, 0x0a. Потом автор туда записывает неопределённое количество байтов - и вылезает за границы массива с непредсказуемыми последствиями: могут попортиться какие угодно переменные, которые размещены вслед за этим массивом. Надо же задавать размер массива!
|
А если я заранее не знаю размер того что туда сольётся? А оставлять пустые хвосты не хочется, что тогда?
|
|
|
|
13.11.2017, 21:49
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
А если я заранее не знаю размер того что ТУДА сольётся?
|
Куда "туда"? Правильно Вам сказали, что Вы пытаетесь что-то вливать в пустую строку размером в 1 байт. Компилятор не экстрасекс и тоже не знает, но хорошо видит, что Вы просите.
Для большей понятности: "char value[]=" означает, что размер массива определяется содержимым после знака "=", т.е., пустой строкой длиной в один байт.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
13.11.2017, 21:50
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Тогда пиши свою функцию для работы с динамическими строками.
SashaBu прав. Динамические массивы в контроллерах лучше не использовать (ну или для них писать отдельную процедуру). Фиг его знает сколько компиллер решит выделить для нее места. Да и у тебя нет проверки на конец области. Так что вполне возможно что ты портишь данные, которые находятся за массивом.
По поводу глобальных переменных и указателей.
Если тебе надо обрабатывать одну и ту же переменную из разных модулей - то лучше объявить ее глобальной. Но с другой стороны, с ней нужно быть осторожным - так сказать, учитывать атомарный доступ. Для указателей другой пример - надо найти позицию символа в строке. Ведь не будешь писать для каждой строки поиск. Проще написать одну функцию. в которую будешь передавать через указатель адрес строки и искомый символ.
|
|
|
|
14.11.2017, 00:50
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
А если я заранее не знаю размер того что туда сольётся? А оставлять пустые хвосты не хочется, что тогда?
|
А Вы верите, что стоит только что-то сильно пожелать (например, что Си каким-то образом будет сам увеличивать размер массива в рантайме или угадывать максимальный во время компиляции), то так оно и станет?
AlexWonder, уточню, на всякий случай, что в Си запись вида
PHP код:
|
static char value[] = "";
|
не обозначает динамический массив, это просто инициализация безразмерного массива. В микроконтроллерах это использовать можно и это удобно просто потому, что не нужно самому вычислять размер уже написанной строки и писать его в квадратные скобочки, пусть этой рутиной занимается компилятор. А вот ждать чудес действительно не стоит.
http://www.c-cpp.ru/books/inicializa...ernyh-massivov
|
|
|
|
14.11.2017, 01:02
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от H4LF
|
это просто инициализация безразмерного массива.
|
Вот здесь слово "безразмерный" вносит сумятицу в умы.
Гораздо корректней - "без указания размера". Потому как массив не безразмерен после компиляции, его размер определяется размером помещенных туда данных ДО компиляции.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
14.11.2017, 03:30
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
akegor, его, видимо, безразмерным назвали потому, что размер в скобочках не указывается (там пусто), а вычисляется на этапе компиляции. Можно назвать это как-то по другому, например: "инициализация массива с автоматическим определением размера на этапе компиляции", но это как-то слишком длинно для названия. "массив без указания размера" - тоже как-то не совсем однозначно. Сумятицу много чего вносит, поэтому надо читать и понимать - что, как и почему.
PS: да и название "безразмерный массив" как-то редко встречается, видимо не очень и нужно отдельное название для этого.
Последний раз редактировалось H4LF; 14.11.2017 в 03:32.
|
|
|
|
14.11.2017, 11:24
|
|
Частый гость
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
В общем, как эту запись (
PHP код:
|
static char value[] = "";
|
) не называйте, а выполнять задуманное автором она не будет. У нее фиксированный размер и с этим придется смириться.
Выхода вижу 2: В куче играться с выделением места под новую строку или же делать фиксированный массив с максимальной длиной и учитывать сколько туда символов положили (если же там только текст, конец можно определять по коду 0х00).
|
|
|
|
14.11.2017, 15:39
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от AlexWonder
|
конец можно определять по коду 0х00
|
Только если строку сформировала функция строковой направленности. Скажем, модем, выдавая текстовую строку, нулем ее не заканчивает.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
14.11.2017, 19:50
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Функция вывода на lcd и глобальные переменные
Вобщем я сделал фиксированный. Пусть 1-2 элемента не заполнятся, зато память не затрётся. Спасибо!
|
|
|
|
14.11.2017, 20:35
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
Вобщем...
|
А результат-то где? Рецептик помог?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:46.
|
|