Этот код дает неправильный результат. Почему?

void setup()
{ 
  int calc(9,2);
  Serial.begin(9600);
}

void loop()
{}

int calc(int val1, int val2)
{
  Serial.print(val1 + val2);
}

Это не синтаксическая ошибка, я получаю вывод как 1, я должен получить 11.

, 👍-1

Обсуждение

что такое int calc(9,2);? вы печатаете перед Serial.begin(), @Juraj

Есть два серьезных предупреждения, говорящих о том, что компилятор явно не понимает ваших намерений. ( И я нет :) ), @DataFiddler


2 ответа


2

Имя функции должно сообщать, что она делает.

Нечто, называемое calc(), в основном не должно печатать (за исключением целей отладки))

void setup() { 
  Serial.begin(9600);
  printSum(9,2);
}
void loop() {}

void printSum(int val1, int val2) {
  Serial.print(val1 + val2);
}

Еще один хороший подход — определить функцию, возвращающую результат.

int calc(int a, int b) {
   return a+b;
}
void setup() {
   Serial.begin(9600);
   Serial.println(calc(9,2));
}
void loop() {}
,

1

Если вашей целью является вызов функции с помощью int calc(9,2);, вы можете изменить его на calc(9,2);, это способ вызова функций, декларатор типов не требуется, если вы не создаете указанную функцию (или в объявлении, которое не имеет ничего общего с настройкой) Если вы хотите объявить свои функции, это нужно сделать в самом верху вашего кода, вне функции настройки, а с моей стороны arduino 1.8.9, это не обязательно.

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

Что касается того, почему у вас напечатана 1, если это весь ваш код, я действительно не знаю, у меня нет вывода, когда я пробую ваш код на своем конце

тл;др;

void setup() {
  Serial.begin(9600);
  calc(9,2);
}
,