如何将对象作为参数传递给函数?


8

我正在做一个小游戏,想存储高分。我在草图文件的顶部创建了一个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:错误:未在此范围内声明'
Highscore'sketch.ino:在函数'void setup()'中:
sketch.ino:64:20:错误:未在此范围内声明'writeHighscore'

将参数类型更改为String,int或其他任何类型后,所有错误都会消失。我可以在writeHighscore()函数内部创建Highscore-objects ,但是如何将对象传递给它呢?

编辑1-对象创建

Highscore hs = Highscore("John", 975);
Serial.println(hs.toString()); // Prints "John - 975" as expected
writeHighscore(hs); // Error

您可以将代码发布到创建Highscore对象的位置吗?
2014年

包含对象创建代码。
krystah 2014年

2
我认为问题是缺少一些括号。因为没有完整的代码,所以我可以猜测和看到:1) setup()应该是无效的setup()。但是它应该生成C ++警告/错误。2)传递类参数会在调用过程时强制对象复制。如果缺少复制构造函数,gcc也应生成警告。使用:无效writeHighscore(Highscore&hs)无效writeHighscore(Highscore * hs) 在您的帖子中复制可编辑的片段。
TMa 2014年

就像原始问题中所述,通过将Highscore参数更改为String或int,错误消失了,没有丢失的括号。在&hs写帖子之前,我还尝试了该方法,还通过了指针writeHighscore(&hs)-> void writeHighscore(Highscore *hs)但无济于事。
krystah 2014年

请发布完整的源代码,否则编译错误中的行号将毫无意义。
jfpoilpret 2014年

Answers:


6

您所做的一切都正确,但是您需要将类移到.ino文件之外,才能正常工作。 我不确定为什么arduino IDE使您这样做 (请参阅编辑),但这是我之前遇到过的事情。

我刚刚进行了测试,然后将类声明移至ino之外并移至项目文件夹中的头文件中,以使其正确编译。只需记住在ino中包含您制作#include "Arduino.h"的标头,并在标头中包含标头即可再次访问“字符串”。

从技术上讲,仅该类的前向声明需要位于其他文件中。

编辑:

我相对确定发生的事情是IDE正在为所有函数而不是类生成正向声明,而正则声明放置在类定义之前。这意味着用虚拟的“ throw()”破坏IDE使用的正则表达式功能可以解决您的问题。例如:

void writeHighscore(Highscore hs) throw() { ...

应该工作正常(对我有用)


2

这是IDE的经典示例,它通过生成函数原型而不是做得很好来“帮助”您。复制示例代码:

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;
  }
};

void setup () { }
void loop () { }

void writeHighscore(Highscore hs) 
{
// do stuff
}

这给出了错误:

sketch_jul06b:4: error: variable or field writeHighscore declared void
sketch_jul06b:4: error: Highscore was not declared in this scope

如果查看IDE预处理器的输出(可以通过打开详细编译并找出实际上正在编译的文件的名称来完成此操作),则会看到以下内容:

#line 1 "sketch_jul06b.ino"
#include "Arduino.h"
void setup ();
void loop ();
void writeHighscore(Highscore hs);
#line 1
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;
  }
};

void setup () { }
void loop () { }

void writeHighscore(Highscore hs) 
{
// do stuff
}

重要的部分是:

void writeHighscore(Highscore hs);

声明类之前


您可以通过简单地生成自己的函数原型来修复错误,如下所示:

void writeHighscore(Highscore hs);  // function prototype
void writeHighscore(Highscore hs) 
{
// do stuff
}

现在,它可以正确编译。它检测到您自己的函数原型,因此不会生成自己的函数原型。现在,生成的文件的前几行是:

#line 1 "sketch_jul06b.ino"
#include "Arduino.h"
void setup ();
void loop ();
#line 1

那个麻烦的原型已经消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.