370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. Раньше писал под пк, теперь есть проект, который нужно сопровождать на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2020, 21:56
Ответы с готовыми решениями:

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

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

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

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

30
Эксперт .NET
10533 / 6461 / 1502
Регистрация: 25.05.2015
Сообщений: 19,589
Записей в блоге: 14
09.06.2020, 20:35 21
Author24 — интернет-сервис помощи студентам
Метод я выше показал. Верните как было и проверьте.
Такие нюансы надо досконально выяснять. А не "инициализацию поменял, всё заработало, и пофиг".

Добавлено через 7 минут
Потому что когда устройство разойдётся тысячами штук по стране и за её пределами, да вылезет баг, на который вы вот сейчас махнули рукой, будет слегка неудобно.
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
09.06.2020, 21:03  [ТС] 22
Rius , так я же не спорю. Обязательно проверю, просто написал, как пока "заткнул" дырку, может кто и объяснил бы почему заработало. Спасибо за информацию.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
09.06.2020, 21:21 23
Цитата Сообщение от locm Посмотреть сообщение
Я думаю что дело в другом.
и тут же сам сказал
Цитата Сообщение от locm Посмотреть сообщение
и записывая больше чем размер массива, пробелами затирает данные в другом массиве.
Цитата Сообщение от locm Посмотреть сообщение
Он похоже использует sprintf
какая разница кто за массив выходит
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,570
Записей в блоге: 6
09.06.2020, 21:55 24
Цитата Сообщение от ValeryS Посмотреть сообщение
и тут же сам сказал
Ну у вас цикл был.

Цитата Сообщение от ValeryS Посмотреть сообщение
какая разница кто за массив выходит
Разница в том что это менее очевидно.
В случае цикла компиль не позволит изменить константый массив (см первое сообщение).
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
09.06.2020, 22:25 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
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,570
Записей в блоге: 6
10.06.2020, 12:38 26
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так
Все нормально.
Искажение массивов

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

Но даже если бы он туда не попал, все равно данные не затерлись бы (проверено). Buff попадет в секцию .bss, а value_1 в секцию .data и расположение рядом маловероятно.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
10.06.2020, 12:55 27
Цитата Сообщение от locm Посмотреть сообщение
Массив попал во флеш как о должен в таких случаях.
это смотря какой компилятор
я давно не работаю с AVR, но помню что для одного достаточно const, а другому подавай PROGMEM
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,570
Записей в блоге: 6
10.06.2020, 12:57 28
Цитата Сообщение от ValeryS Посмотреть сообщение
это смотря какой компилятор
Это GCC для ARM.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
10.06.2020, 13:13 29
Цитата Сообщение от locm Посмотреть сообщение
для ARM.
не знаю, у меня в голове почему то отложилось что TC работает с AVR
подождем автора, пускай скажет что за камень

Добавлено через 2 минуты
вот он оказывается уже отвечал
Цитата Сообщение от minore Посмотреть сообщение
риалабовский MC12D8O .
Вообще не знаю такого зверя
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 895
11.06.2020, 11:22  [ТС] 30
locm , вы были правы. К ошибке действительно приводило переполнение буфера вывода. Вопрос по сути исчерпался. Обидно, что компиляторы не проверяют такие вещи, и не подсказывают, что кладешь больше, чем можешь себе позволить.
0
Эксперт .NET
10533 / 6461 / 1502
Регистрация: 25.05.2015
Сообщений: 19,589
Записей в блоге: 14
11.06.2020, 11:31 31
Это проблема не компилятора. Она возникает во время выполнения.
На переполнении буфера несчётное число багов и дыр построено..
0
11.06.2020, 11:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2020, 11:31
Помогаю со студенческими работами здесь

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

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

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

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

Искажение текстур
При изменении позиции камеры по Y через транслейт, идет жесткое искажение текстур как можно править...

Искажение звука
Помогите пожалуйста разобраться. Неожиданно появились проблемы со звуком. Фильмы, музыка - все с...

Искажение изображения
Во время просмотра фильмов, когда идет смена кадров, верхнняя часть экрана(10 см где-то) ...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru