Программа для умножения чисел на самом деле не будет их умножать
Я пытаюсь написать программу, которая принимает несколько пар для умножения, а затем выводит результат каждого умножения. Вместо этого программа просто выводит количество умножений и числа, но никогда не выполняет умножения и не добавляет символы новой строки (несмотря на то, что я явно использую 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]);
}
}
@JG98, 👍1
Обсуждение2 ответа
Лучший ответ:
Хорошо, я понял.
В цикле for мне пришлось использовать i +=2, а не i+2.
Какая глупая ошибка..
В этом коде довольно много проблем:
В C++ предполагается динамическое размещение с
new
, а не чемmalloc()
.Если вы выделили динамическую память в цикле и забыли ее освободить (с
free()
/delete
), у вас довольно быстро закончится память.На самом деле вам даже не нужно выполнять какое-либо динамическое размещение: автоматическое размещение — самый безопасный способ обработки этих массивов.
Поскольку вы знаете точный размер, который вам нужен, выделите его, а не размер по умолчанию.
multNums
получает в качестве параметра количество умножений, а не длина массива.i+2
не изменяет значениеi
. Вы имели в видуi+=2
.sizeof(productArray)
дает не длину массива, а его размер в байтах. Кроме того, ваш последний цикл должен повторяться только через инициализированную часть массива.
Если вы устраните эти проблемы, программа должна работать должным образом.
исправление всех этих вещей заставило программу работать, самой большой проблемой было использование i+2 вместо +=. И я вернусь и сделаю динамическое выделение памяти лучше или просто избавлюсь от него. На самом деле я думал, что arduino — это C (а не C++), поэтому я использовал malloc. Новый намного лучше., @JG98
- Как остановить цикл в последовательном мониторе?
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Отправка массива размером >255 байт на arduino
- Операторы If/Else на Arduino не выполняются
- Как преобразовать строку шестнадцатеричных чисел с разделителями в массив int
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
for(int i=0; i < sizeof(productArray) ;i++)
вы ожидаете, что sizeof() указатель с плавающей запятой будет эквивалентен количеству элементов в массиве, на который ссылаются?, @6v6gt@ 6v6gt, это был хороший улов, но даже после того, как он явно изменил количество продуктов, мой вывод все еще неверен. Я также распечатываю значения, которые я читаю, в массив с плавающей запятой, и все они появляются там до того, как я вызываю функцию умножения чисел., @JG98