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

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

04.06.2020, 21:56. Показов 1491. Ответов 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
13294 / 7753 / 1683
Регистрация: 25.05.2015
Сообщений: 23,613
Записей в блоге: 14
09.06.2020, 20:35
Студворк — интернет-сервис помощи студентам
Метод я выше показал. Верните как было и проверьте.
Такие нюансы надо досконально выяснять. А не "инициализацию поменял, всё заработало, и пофиг".

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

Цитата Сообщение от ValeryS Посмотреть сообщение
какая разница кто за массив выходит
Разница в том что это менее очевидно.
В случае цикла компиль не позволит изменить константый массив (см первое сообщение).
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
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
Эксперт по электронике
6876 / 3299 / 340
Регистрация: 28.10.2011
Сообщений: 12,941
Записей в блоге: 7
10.06.2020, 12:38
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот так
Все нормально.

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

Но даже если бы он туда не попал, все равно данные не затерлись бы (проверено). Buff попадет в секцию .bss, а value_1 в секцию .data и расположение рядом маловероятно.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
10.06.2020, 12:55
Цитата Сообщение от locm Посмотреть сообщение
Массив попал во флеш как о должен в таких случаях.
это смотря какой компилятор
я давно не работаю с AVR, но помню что для одного достаточно const, а другому подавай PROGMEM
0
Эксперт по электронике
6876 / 3299 / 340
Регистрация: 28.10.2011
Сообщений: 12,941
Записей в блоге: 7
10.06.2020, 12:57
Цитата Сообщение от ValeryS Посмотреть сообщение
это смотря какой компилятор
Это GCC для ARM.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
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
13294 / 7753 / 1683
Регистрация: 25.05.2015
Сообщений: 23,613
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru