Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
1

Непонятное поведение указателя

24.08.2020, 13:30. Показов 367. Ответов 3

Author24 — интернет-сервис помощи студентам
Добрый день! Столкнулся со следующей проблемой. Есть функция, которая оконным методом вычисляет дисперсию данных. На вход она получает указатель на массив исходных данных и его размер. В первую очередь функция расширяет массив слева и справа, а дальше методом окна вычисляет дисперсию помещает в новый массив, который должен вернуться наверх. Код ниже.

В функции происходит динамическое выделение памяти под расширенный массив (extended_buffer) и выходной массив (std_buffer).
Функция возвращает рандомные данные ровно до тех пор, пока не раскомментируешь, казалось бы, бесполезный цикл. При выполнении этого бесполезного цикла - все ок. Причём, если присвоение не в цикле, то снова какая-то билеберда. Проблема, скорее всего, именно с extended_buffer, но не могу понять, что именно не так. Пробовал менять компиляторы - ни к чему не привело.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static uint32_t * std_calculate(int16_t * data_buffer, uint16_t size)
{
  uint16_t buffer_size = size + STD_WINDOW_APERTURE - 1;
  uint8_t extender_size = (STD_WINDOW_APERTURE - 1) >> 1;
 
 
  int16_t * extended_buffer = (int16_t*)malloc(buffer_size * sizeof(int16_t));
  uint32_t * std_buffer = (uint32_t *)malloc(size * sizeof(uint32_t));
 
  for(uint16_t i = 0, j = 0; i < size; j++)
  {
    if(j < extender_size)
    {
      extended_buffer[j] = data_buffer[0];
      extended_buffer[buffer_size - j - 1] = data_buffer[size -1];
    }
    else
    {
      extended_buffer[j] = data_buffer[i];
      i++;
    }
  }
 
 
  //for(uint16_t iterator = 0; iterator < 1; iterator++)
    //extended_buffer[iterator] = extended_buffer[iterator];
 
  uint32_t sum1, sum2 = 0;
 
  for(uint16_t j = 0; j < size; j++)
  {
    if (!j)
    {
      for(uint16_t i = 0; i < STD_WINDOW_APERTURE; i++)
      {
        sum1 += extended_buffer[i] * extended_buffer[i];
        sum2 += extended_buffer[i];
      }
    }
    else
    {
      sum1 = sum1 - extended_buffer[j - 1] * extended_buffer[j - 1] +
      extended_buffer[j + STD_WINDOW_APERTURE - 1] * extended_buffer[j + STD_WINDOW_APERTURE - 1];
 
      sum2 = sum2 - extended_buffer[j - 1] + extended_buffer[j + STD_WINDOW_APERTURE - 1];
    }
    std_buffer[j] = (uint32_t)(sum1 - (sum2 * sum2)/STD_WINDOW_APERTURE)/STD_WINDOW_APERTURE;
    // std_buffer[j] = 0;
  }
  free(extended_buffer);
  return std_buffer;
}
Добавлено через 1 час 41 минуту
В общем разобрался в чём было дело. При декларации переменных sum1 и sum2 0 присваивался только sum2, а sum1 имело рандомное значение. Но все-таки было бы интересно узнать, почему при написании цикла сверху, 0 присваивался сразу двум переменным.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2020, 13:30
Ответы с готовыми решениями:

Непонятное поведение printf()
Доброго времени суток всем. Недавно начал изучать си и возникло непонимание происходящего в...

Непонятное поведение функции atol
добрый день, конвертирую строку str4 к long int использую функцию atol и смотрю в дебаге получаю...

Странное поведение указателя на массив внутри функции
Можете мне объяснить, почему некорректно выполняется функция, а точнее строка 52? ...

Непонятное поведение при отладке
Доброго времени суток. Есть задание к лабораторной. 1. Отсортировать в заданном каталоге...

3
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
24.08.2020, 13:36 2
УМВР, не знаю что у вас не так, но закоментированный цикл вообще не при чем, а вот при четных значениях апертуры Ваша функция явно косячит в расчетах
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
24.08.2020, 14:59  [ТС] 3
Да, все верно. Функция сделана только для нечетных значений апертуры.
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
24.08.2020, 17:16 4
Цитата Сообщение от Metallizer10 Посмотреть сообщение
Но все-таки было бы интересно узнать, почему при написании цикла сверху, 0 присваивался сразу двум переменным.
на то оно и неопределённое поведение при отсутствии инициализации )

по меньшей мере на стеке добавлялась ещё одна переменная uint16_t iterator = 0
1
24.08.2020, 17:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2020, 17:16
Помогаю со студенческими работами здесь

Неадекватное поведение указателя на тип char
вот эта программа работает нармально. #include &lt;stdio.h&gt; #include &lt;string.h&gt; char*...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о....

LPTSTR (непонятное использование указателя)
Насколько я понял LPTSTR это wchar_t* или char* в зависимости от того установлен ли UNICODE.. если...

Непонятное поведение ОС
Здрасте! Купил новый комп, а он загружается через раз (чаще через несколько раз), выключается...

Непонятное поведение
Всем привет! В книге &quot;Прата - Язык программирования C++. Лекции и управжения 2011&quot; нашёл вот такой...

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


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

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