0 / 0 / 0
Регистрация: 13.04.2022
Сообщений: 24
|
||||||
1 | ||||||
Искажается массив структур!25.05.2022, 17:48. Показов 1203. Ответов 7
Метки нет (Все метки)
Добрый день. Столкнулся с проблемой искажения массива структур mas_key_for_compare[]. Пишу в Atmel Studio. atmega 328.
В начале программы массив mas_key_for_compare[] заполняется из памяти EEprom. Далее с ним сравнивается считанный ключ. После нескольких сравнений массив иногда обнуляется, иногда искажается???
0
|
25.05.2022, 17:48 | |
Ответы с готовыми решениями:
7
Почему искажается массив? Составить массив структур состоящий из имени и цены,по введенному имени изменить цену,вывести обновленный массив структур Структуры.Обработка массивов структур.Создать массив структур из 10-ти элементов Блочная сортировка структур (Отсортировать массив структур по фамилии) Массив структур, сохранение начала каждой из структур |
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,337
|
|
25.05.2022, 19:45 | 2 |
Сообщение было отмечено F_Serg_Kn как решение
Решение
value_key_in_EEprom - должна быть константой времени компиляции. Сейчас это переменная
Добавлено через 1 минуту и для чего этот массив сделан volatile ? Кто-то его будет менять снаружи ?
1
|
0 / 0 / 0
Регистрация: 13.04.2022
Сообщений: 24
|
|
25.05.2022, 20:29 [ТС] | 3 |
Вы, правы, value_key_in_EEprom переменная количества ключей, считанных из памяти.Следовательно, число ключей равно разрядности массива. Данная переменная,как и массив ключей считывается из eeprom в начале main. Тем самым хотел сэкономить на массиве. Сейчас попробую сделать фикированный массив на 100 ключей. А каким образом данная трабла может влиять на искажение массива структур? Ведь, как я понимаю, любой массив передается по начальному адресу?
Добавлено через 1 минуту Тем самым пытался исправить баг, снаружи никто менять его не будет.Не помогло. Добавлено через 14 минут Исправил на volatile I_Button_key_type mas_key_for_compare[100]; и заработало, пока не вылетала. Только почему, так и не понял? Получается в МК нельзя использовать массивы переменной длины?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
|
|
25.05.2022, 20:40 | 4 |
вот здесь использоватся должна не бинарная ИЛИ(|) а логическая (||), дальше пока не смотрел
Покажи кусок кода где происходит сравнение и желательно прокомментируй, пока по симптомам похоже на выход за границы массива
1
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,337
|
|
25.05.2022, 21:02 | 5 |
Сообщение было отмечено F_Serg_Kn как решение
Решение
F_Serg_Kn, автоматические массивы не умеют быть переменного размера, их размер фиксированный и известен на этапе компиляции. То, что компилятор позволил указать в качестве размера переменную - это нестандартное расширение компилятора (VLA). И даже если компилятор это позволил, то размер такого массива всё равно будет равен значению той переменной на момент определения массива. То есть, размер всё равно будет неизменный. Если проследить глазами, то видно, что этот размер == 0. Точнее будет видно под отладчиком
В итоге, определялся массив нулевой длины, затем использовался в хвост и в гриву, разрушая стек вокруг. Добавлено через 1 минуту в ПК тоже
1
|
0 / 0 / 0
Регистрация: 13.04.2022
Сообщений: 24
|
|||||||||||
25.05.2022, 21:21 [ТС] | 6 | ||||||||||
Я так полагаю, одинарное или будет сравниваться доконца условия, а двойное ---выход по первому? Кстати, на проблемы мне уже указали в другой ветке. Нужно было использовать фиксированный массив ключей, вместо переменного.
Было:
0
|
0 / 0 / 0
Регистрация: 13.04.2022
Сообщений: 24
|
|
25.05.2022, 21:40 [ТС] | 7 |
Алексей1153, Да, спасибо Вам за ответ. Сам бы век не додумал бы. Походу у меня весь код такой! Везде рассказывают как создать массив,класс, структуру, запустить таймер, шим, ацп на мелких отдельных примерах.А как использовать это все в комплексе в структуре программы не найдешь. А смотреть "настоящий код,профессиональный", там все для меня на "китайском" языке, каждую строчку можно весь вечер изучать. Еще раз спасибо Вам за обьяснение!!!
0
|
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
|
|
28.05.2022, 06:28 | 8 |
Нет.
Такая возможность (массивы переменной длины, Variable-length arrays) появилась в С99. При сборке какой стандарт указывали? Добавлено через 2 минуты По С++ ответ здесь. Добавлено через 7 минут
1
|
28.05.2022, 06:28 | |
28.05.2022, 06:28 | |
Помогаю со студенческими работами здесь
8
Динамический массив структур в другом массиве структур Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю? Массив структур в массиве структур Массив структур содержащих массив структур Объект содержащий массив объектов, которые содержат массив структур Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |