Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901

Искажение массивов

04.06.2020, 21:56. Показов 1449. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Раньше писал под пк, теперь есть проект, который нужно сопровождать на c под микроконтроллер, и в общих чертах столкнулся с проблемой искажением данных:
C
1
2
const char value_1[]={4,4,7,4,7,4,6,1,1,8}; 
const char value_2[]={0,0,2,1,0,0,2,0,0,6};
Как видите объявлены константами, нигде в коде их значение не меняю, да и не могу собственно: константы в C не меняются.
Когда я вывожу на экран первый массив, выводится все корректно.
Второй массив почему-то искажается: в первой половине массива появляется какое-то значение 32, которое я не указывал. Вообще, массив портится именно значением 32. Что это за магическое число?
Пробовал переставлять массивы местами, ситуация меняется: тот, который объявлен первым выводится без проблем, тот который вторым - искажается. Почему это может быть. Есть у кого идеи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2020, 21:56
Ответы с готовыми решениями:

Искажение дискретных сигналов
Как влияет скорость передачи информации на степень искажений дискретных сигналов при наличии амплитудно - и фазо-частотных искажений?

Искажение формы сигнала
Есть схема. В ней используется полудуплексная передача с помощью программного UART (9600 б/с). За основу была взята схема на полевом...

Искажение данных из-за пульсо мера
Всем доброго времени суток! Я использую датчик пульса и GSM модуль SIM808. два этих модуля Пульс https://pulsesensor.com/ и GSM модуль...

30
Эксперт .NET
 Аватар для Rius
13163 / 7723 / 1679
Регистрация: 25.05.2015
Сообщений: 23,525
Записей в блоге: 14
09.06.2020, 20:35
Студворк — интернет-сервис помощи студентам
Метод я выше показал. Верните как было и проверьте.
Такие нюансы надо досконально выяснять. А не "инициализацию поменял, всё заработало, и пофиг".

Добавлено через 7 минут
Потому что когда устройство разойдётся тысячами штук по стране и за её пределами, да вылезет баг, на который вы вот сейчас махнули рукой, будет слегка неудобно.
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
09.06.2020, 21:03  [ТС]
Rius , так я же не спорю. Обязательно проверю, просто написал, как пока "заткнул" дырку, может кто и объяснил бы почему заработало. Спасибо за информацию.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
09.06.2020, 21:21
Цитата Сообщение от locm Посмотреть сообщение
Я думаю что дело в другом.
и тут же сам сказал
Цитата Сообщение от locm Посмотреть сообщение
и записывая больше чем размер массива, пробелами затирает данные в другом массиве.
Цитата Сообщение от locm Посмотреть сообщение
Он похоже использует sprintf
какая разница кто за массив выходит
0
Эксперт по электронике
6824 / 3249 / 337
Регистрация: 28.10.2011
Сообщений: 12,696
Записей в блоге: 7
09.06.2020, 21:55
Цитата Сообщение от ValeryS Посмотреть сообщение
и тут же сам сказал
Ну у вас цикл был.

Цитата Сообщение от ValeryS Посмотреть сообщение
какая разница кто за массив выходит
Разница в том что это менее очевидно.
В случае цикла компиль не позволит изменить константый массив (см первое сообщение).
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
09.06.2020, 22:25
Цитата Сообщение от locm Посмотреть сообщение
Ну у вас цикл был.
разумеется как бы я показал принцип выхода за пределы массива
ни один нормальный человек не будет этого делать
Цитата Сообщение от ValeryS Посмотреть сообщение
for(int i=0;i<sizeof(value_1)+20;i++)
а вот посмотреть как эта бяка портит, при помощи твоего любимого отладчика,я думаю стоит
воочию можно узреть организацию памяти
Цитата Сообщение от locm Посмотреть сообщение
Разница в том что это менее очевидно.
взлом при помощи переполнения буфера известен уже не один десяток лет
Цитата Сообщение от locm Посмотреть сообщение
В случае цикла компиль не позволит изменить константый массив
а вот так
C
1
2
3
4
char buf[2];
const char value_1[]={4,4,7,4,7,4,6,1,1,8}; 
for(int i=0;i<20;i++)
  buf[i]=i;
0
Эксперт по электронике
6824 / 3249 / 337
Регистрация: 28.10.2011
Сообщений: 12,696
Записей в блоге: 7
10.06.2020, 12:38
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так
Все нормально.

Массив попал во флеш как о должен в таких случаях.

Но даже если бы он туда не попал, все равно данные не затерлись бы (проверено). Buff попадет в секцию .bss, а value_1 в секцию .data и расположение рядом маловероятно.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
10.06.2020, 12:55
Цитата Сообщение от locm Посмотреть сообщение
Массив попал во флеш как о должен в таких случаях.
это смотря какой компилятор
я давно не работаю с AVR, но помню что для одного достаточно const, а другому подавай PROGMEM
0
Эксперт по электронике
6824 / 3249 / 337
Регистрация: 28.10.2011
Сообщений: 12,696
Записей в блоге: 7
10.06.2020, 12:57
Цитата Сообщение от ValeryS Посмотреть сообщение
это смотря какой компилятор
Это GCC для ARM.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
10.06.2020, 13:13
Цитата Сообщение от locm Посмотреть сообщение
для ARM.
не знаю, у меня в голове почему то отложилось что TC работает с AVR
подождем автора, пускай скажет что за камень

Добавлено через 2 минуты
вот он оказывается уже отвечал
Цитата Сообщение от minore Посмотреть сообщение
риалабовский MC12D8O .
Вообще не знаю такого зверя
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
11.06.2020, 11:22  [ТС]
locm , вы были правы. К ошибке действительно приводило переполнение буфера вывода. Вопрос по сути исчерпался. Обидно, что компиляторы не проверяют такие вещи, и не подсказывают, что кладешь больше, чем можешь себе позволить.
0
Эксперт .NET
 Аватар для Rius
13163 / 7723 / 1679
Регистрация: 25.05.2015
Сообщений: 23,525
Записей в блоге: 14
11.06.2020, 11:31
Это проблема не компилятора. Она возникает во время выполнения.
На переполнении буфера несчётное число багов и дыр построено..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.06.2020, 11:31
Помогаю со студенческими работами здесь

Искажение аудиосигнала при ресемплинге Ланцоша
Есть представление дискретного аудио-сигнала в виде амплитудных отсчетов с частотой дискретизации 16000 Гц. Необходим его ресемплинг на...

Что вызывает искажение нижних и верхних пиков сигнала?
Что вызывает искажение нижних и верхних пиков сигнала?

Даны пять массивов А(4,4),В(4,4),С(4,4),D(4,4)F(4,4).Найти произведение массивов. определение произведения двух массивов оформить в виде процедур
Даны пять массивов А(4,4),В(4,4),С(4,4),D(4,4)F(4,4).Найти произведение массивов. определение произведения двух массивов оформить в виде...

искажение окон
Доброго времени суток! Помогите, пожалуйста, решить проблему искажения изображений. Так понимаю, что искажаются окна связанные с явой.

Искажение изображения
Нашел хороший пример создания изображения, можно ли итог как-то исказить до всем известной капчи(немного размазать, думаю понятно что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru