Я делаю крошечную игру и хочу хранить рекорды. Я сделал Highscore-класс в верхней части файла эскиза, например так:
class Highscore {
public:
String name;
int score;
String toString() {
return this->name + " - " + (String)score;
}
Highscore(String name, int score) {
this->name = name;
this->score = score;
}
};
setup() { // etc
Сейчас же. В нижней части эскиза у меня есть функция, которую я хочу взять Highscore-объект в качестве параметра, но компилятор не позволит мне. Пример:
void writeHighscore(Highscore hs) {
File f = SD.open("high.txt", FILE_WRITE);
// Do stuff
Ошибка компиляции выглядит следующим образом:
sketch.ino: 19: 21: ошибка: переменная или поле 'writeHighscore' объявлено void
sketch.ino: 19: 21: ошибка: 'Рекорды' не были объявлены в этой области
sketch.ino: в функции 'void setup ()':
sketch.ino: 64: 20: ошибка: writeHighscore не было объявлено в этой области
После изменения типа параметра на String, int или что-либо еще все ошибки исчезают. Я могу создавать Highscore-объекты ВНУТРИ writeHighscore()
функции, но как я могу передать ей объекты?
Редактировать 1 - Создание объекта
Highscore hs = Highscore("John", 975);
Serial.println(hs.toString()); // Prints "John - 975" as expected
writeHighscore(hs); // Error
&hs
подход до написания поста и прохождения указателяwriteHighscore(&hs)
->void writeHighscore(Highscore *hs)
но безрезультатно.Ответы:
Вы все делаете правильно, но вам нужно переместить класс за пределы вашего файла .ino, чтобы это работало.
Я не уверен, почему Arduino IDE заставляет вас делать это(см. правку), но это то, с чем я сталкивался раньше.Я только что проверил это, и перемещение объявления класса за пределы ino и в файл заголовка в папке проекта делает его компиляцией правильно. Просто не забудьте включить заголовок, который вы делаете в ino и
#include "Arduino.h"
в заголовок, чтобы снова получить доступ к «String».Технически, только предварительное объявление класса должно быть в другом файле.
Редактировать:
Я относительно уверен, что происходит, потому что IDE генерирует предварительные объявления для всех ваших функций, но не для класса, которые помещаются перед определением вашего класса. Это означает, что нарушение функции regex, которую IDE использует с помощью фиктивной функции throw (), решает вашу проблему. например:
должно работать просто отлично (у меня это сработало)
источник
Это классический пример того, как IDE «помогает», генерируя прототипы функций, и не очень хорошо это делает. Пример кода для воспроизведения:
Это дает ошибку:
Если вы посмотрите на вывод препроцессора IDE (вы можете сделать это, включив подробную компиляцию и выяснив имя файла, который он на самом деле компилирует), вы увидите это:
Важной частью является то, что это положить:
до того, где класс объявлен.
Вы можете исправить ошибку, просто сгенерировав собственный прототип функции следующим образом:
Теперь он компилируется без ошибок. Он обнаруживает ваш собственный прототип функции и, следовательно, не генерирует свой собственный. Первые несколько строк сгенерированного файла теперь:
Этот тревожный прототип исчез.
источник