Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
271 / 130 / 44
Регистрация: 05.02.2015
Сообщений: 827
1

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

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

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

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

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

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

30
Эксперт .NET
6867 / 4469 / 1074
Регистрация: 25.05.2015
Сообщений: 13,676
Записей в блоге: 14
09.06.2020, 20:35 21
Метод я выше показал. Верните как было и проверьте.
Такие нюансы надо досконально выяснять. А не "инициализацию поменял, всё заработало, и пофиг".

Добавлено через 7 минут
Потому что когда устройство разойдётся тысячами штук по стране и за её пределами, да вылезет баг, на который вы вот сейчас махнули рукой, будет слегка неудобно.
1
271 / 130 / 44
Регистрация: 05.02.2015
Сообщений: 827
09.06.2020, 21:03  [ТС] 22
Rius , так я же не спорю. Обязательно проверю, просто написал, как пока "заткнул" дырку, может кто и объяснил бы почему заработало. Спасибо за информацию.
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
09.06.2020, 21:21 23
Цитата Сообщение от locm Посмотреть сообщение
Я думаю что дело в другом.
и тут же сам сказал
Цитата Сообщение от locm Посмотреть сообщение
и записывая больше чем размер массива, пробелами затирает данные в другом массиве.
Цитата Сообщение от locm Посмотреть сообщение
Он похоже использует sprintf
какая разница кто за массив выходит
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,144
Записей в блоге: 6
09.06.2020, 21:55 24
Цитата Сообщение от ValeryS Посмотреть сообщение
и тут же сам сказал
Ну у вас цикл был.

Цитата Сообщение от ValeryS Посмотреть сообщение
какая разница кто за массив выходит
Разница в том что это менее очевидно.
В случае цикла компиль не позволит изменить константый массив (см первое сообщение).
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
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
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,144
Записей в блоге: 6
10.06.2020, 12:38 26
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так
Все нормально.
Искажение массивов

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

Но даже если бы он туда не попал, все равно данные не затерлись бы (проверено). Buff попадет в секцию .bss, а value_1 в секцию .data и расположение рядом маловероятно.
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
10.06.2020, 12:55 27
Цитата Сообщение от locm Посмотреть сообщение
Массив попал во флеш как о должен в таких случаях.
это смотря какой компилятор
я давно не работаю с AVR, но помню что для одного достаточно const, а другому подавай PROGMEM
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,144
Записей в блоге: 6
10.06.2020, 12:57 28
Цитата Сообщение от ValeryS Посмотреть сообщение
это смотря какой компилятор
Это GCC для ARM.
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
10.06.2020, 13:13 29
Цитата Сообщение от locm Посмотреть сообщение
для ARM.
не знаю, у меня в голове почему то отложилось что TC работает с AVR
подождем автора, пускай скажет что за камень

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Искажение изображения
Всем привет! Как сделать искажение изображения, подобное тому, как на приложенной картинке?

Искажение изображения
Имеется изображение белого светлых оттенков которое добавлено на задний план формы....

Искажение цветов
В чем причина такого искажения? +Еще на голубом появляются искажения розового оттенка Как можно...

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

Искажение картинки
Всем привет, я оттуда https://www.cyberforum.ru/win-api/thread1225579.html начинаю работать с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.