Программа для умножения чисел на самом деле не будет их умножать

Я пытаюсь написать программу, которая принимает несколько пар для умножения, а затем выводит результат каждого умножения. Вместо этого программа просто выводит количество умножений и числа, но никогда не выполняет умножения и не добавляет символы новой строки (несмотря на то, что я явно использую println). В приведенном ниже примере я указываю 2 пары чисел для умножения, а затем ввожу 3,4,7,8 (вводя символ NL после каждого числа, но пробелы и запятые вызывают ту же проблему).

Результат

Я думал, что мой подход сработает, но я считаю, что есть что-то, что я делаю с последовательным вводом, что приводит к тому, что код не работает (хотя может быть какая-то другая проблема). Мне также интересно, может быть, это потому, что я запускаю это в Tinkercad, а не в реальной среде Arduino IDE. Будем признательны за любую помощь.

void loop()
 {
  int numOfMults = 0;                             // количество пар для умножения
  float *numArray;                                // указатель на начало блока памяти массива
  numArray = (float *)malloc(sizeof(float)*50);   // динамически выделяем массив, который может содержать до 50 чисел с плавающей запятой

  numOfMults = Serial.parseInt(); // получаем количество умножений от пользователя

  Serial.println(numOfMults);

  // взять указанное количество чисел (в 2 раза больше числа умножений) в формате: 1,2,3...
  // затем преобразуем его в массив чисел с плавающей запятой, где каждые 2 индекса
  // это пара чисел для умножения
  for (int i = 0; i < (2*numOfMults) ;i++)
    {
      numArray[i] = Serial.parseFloat();
    } 
      multNums(numOfMults,numArray);  // вызов функции для получения произведения всех чисел

      delay(5000);                    // ждем 5 секунд перед повторным запуском цикла
 }
 
void multNums(int numofNums,float nums[])
{
  float *productArray;                                 // указатель на начало блока памяти массива товаров
  productArray = (float *)malloc(sizeof(float)*25);    // динамически выделяем массив, который может содержать до 25 чисел с плавающей запятой (для продуктов)

  // перемножаем все пары чисел в массиве, сохраняем произведение в другом
  for(int i=0;i<(2*numofNums);i+2)
  {
      productArray[i/2] = nums[i]*nums[i+1];         // умножить текущую пару чисел, сохранить в массиве продуктов по одному индексу за раз
  }
  // печатаем продукты
  for(int i=0; i < sizeof(productArray) ;i++)
  {
    Serial.println(productArray[i]);
  }
}

, 👍1

Обсуждение

for(int i=0; i < sizeof(productArray) ;i++) вы ожидаете, что sizeof() указатель с плавающей запятой будет эквивалентен количеству элементов в массиве, на который ссылаются?, @6v6gt

@ 6v6gt, это был хороший улов, но даже после того, как он явно изменил количество продуктов, мой вывод все еще неверен. Я также распечатываю значения, которые я читаю, в массив с плавающей запятой, и все они появляются там до того, как я вызываю функцию умножения чисел., @JG98


2 ответа


Лучший ответ:

1

Хорошо, я понял.

В цикле for мне пришлось использовать i +=2, а не i+2.

Какая глупая ошибка..

,

1

В этом коде довольно много проблем:

  • В C++ предполагается динамическое размещение с new, а не чем malloc().

  • Если вы выделили динамическую память в цикле и забыли ее освободить (с free()/delete), у вас довольно быстро закончится память.

  • На самом деле вам даже не нужно выполнять какое-либо динамическое размещение: автоматическое размещение — самый безопасный способ обработки этих массивов.

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

  • multNums получает в качестве параметра количество умножений, а не длина массива.

  • i+2 не изменяет значение i. Вы имели в виду i+=2.

  • sizeof(productArray) дает не длину массива, а его размер в байтах. Кроме того, ваш последний цикл должен повторяться только через инициализированную часть массива.

Если вы устраните эти проблемы, программа должна работать должным образом.

,

исправление всех этих вещей заставило программу работать, самой большой проблемой было использование i+2 вместо +=. И я вернусь и сделаю динамическое выделение памяти лучше или просто избавлюсь от него. На самом деле я думал, что arduino — это C (а не C++), поэтому я использовал malloc. Новый намного лучше., @JG98