首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tinkercad编写Arduino c++代码时出现无用错误

Tinkercad编写Arduino c++代码时出现无用错误
EN

Stack Overflow用户
提问于 2019-09-11 09:58:36
回答 1查看 1.3K关注 0票数 2

抱歉,如果我的一些来源看起来真的很糟糕。这是我第一次尝试编写Arduino代码和c++。我通常呆在c#的舒适区。

当我试图在Tinkercad电路上运行我的源代码时,我得到了以下错误。Tinkercad发出错误的方式对于学习来说是可怕的。任何能够指出我的错误的人都会非常有帮助。

错误

代码语言:javascript
复制
 - 2:23: error: use of enum 'LedActionTypes' without previous
   declaration
 - 4:23: error: use of enum 'SignalTypes' without previous declaration
 - 4:64: error: use of enum 'SignalDirections' without previous declaration
 - 5:23: error: use of enum 'SignalTypes' without previous declaration
 - 5:64: error: use of enum 'SignalDirections' without previous declaration
 - 5:103: error: use of enum 'DigitalSignalValues' without previous declaration
 - 8:16: error: variable or field 'AddAction' declared void
 - 8:16: error: 'LedAction' was not declared in this scope

我的源代码

代码语言:javascript
复制
/* Enums */
enum SignalTypes
{
    General = 0,
    Analog = 1,
    Digital = 2,
};

enum SignalDirections
{
    Inbound = 0x0,
    Outbound = 0x1,
};

enum DigitalSignalValues
{
    Low = 0x0,
    High = 0x1,
};

enum LedActionTypes
{
    None = 0,
    ChangeBrightness = 1,
};

/* LED Action object */
class LedAction {
    // Functions
    void Constructor(enum LedActionTypes action, int intensity, int delay)
    {
        // Check for valid intensity value
        if (intensity < 0)
            intensity = 0;
        if (intensity > 255)
            intensity = 255;
        Intensity = intensity;

        Finished = false;
        Action = action;

        CompleteOn = millis() + delay;
    }

public:
    // Properties
    boolean Finished;
    enum LedActionTypes Action = None;
    int Intensity = 0;
    unsigned long CompleteOn = 0;


    // Constructor
    LedAction()
    {
        Constructor(Action, Intensity, 0);
    }
    LedAction(enum LedActionTypes action)
    {
        Constructor(action, Intensity, 0);
    }
    LedAction(enum LedActionTypes action, int intensity, int delay)
    {
        Constructor(action, intensity, delay);
    }


    // Methods
    void Loop() {
        if (Finished) { return; }

        unsigned long currentTimeStamp = millis();

        if (CompleteOn >= currentTimeStamp)
        {
            //Process the action
            Finished = true;
        }
    }
};


/* LED object */
class Led {
    // Functions
    void Constructor(enum SignalTypes signalType, byte pbPin, enum SignalDirections signalDirection, int intensity)
    {
        // Check for valid intensity value
        if (intensity < 0)
            intensity = 0;
        if (intensity > 255)
            intensity = 255;
        Intensity = intensity;

        Constructor(SignalType, PBPin, SignalDirection, DigitalSignalValue);
    }
    void Constructor(enum SignalTypes signalType, byte pbPin, enum SignalDirections signalDirection, enum DigitalSignalValues signalValue)
    {
        SignalType = signalType;
        PBPin = pbPin;
        SignalDirection = signalDirection;
        DigitalSignalValue = signalValue;
    }

public:
    // Properties
    byte PBPin;
    int Intensity;
    enum DigitalSignalValues DigitalSignalValue;
    enum SignalTypes SignalType = Analog;
    enum SignalDirections SignalDirection = Outbound;
    LedAction Actions[20]{ LedAction(None) };


    // Constructor
    Led()
    {
        Constructor(SignalType, 0, SignalDirection, 0);
    }
    Led(byte pbPin, enum SignalDirections signalDirection, int intensity)
    {
        Constructor(SignalType, pbPin, signalDirection, intensity);
    }
    Led(byte pbPin, enum SignalDirections signalDirection, enum DigitalSignalValues signalValue)
    {
        Constructor(SignalType, pbPin, signalDirection, signalValue);
    }
    Led(enum SignalTypes signalType, byte pbPin, enum SignalDirections signalDirection, int intensity)
    {
        Constructor(signalType, pbPin, signalDirection, intensity);
    }
    Led(enum SignalTypes signalType, byte pbPin, enum SignalDirections signalDirection, enum DigitalSignalValues signalValue)
    {
        Constructor(signalType, pbPin, signalDirection, signalValue);
    }


    // Methods
    void Setup()
    {
        switch (SignalType)
        {
        case Analog:
            analogWrite(PBPin, Intensity);
            break;
        case Digital:
            digitalWrite(PBPin, Intensity);
            pinMode(PBPin, SignalDirection);
            break;
        }
    }

    void Loop()
    {
        int n;

        // Loop through all actions and find unfinished ones then fire them off
        for ( n=0 ; n<20 ; ++n )
        {
            if (!Actions[n].Finished)
            {
                Actions[n].Loop();
                if (Actions[n].Finished)
                {
                    //Action was just flagged ready to process
                    switch (Actions[n].Action)
                    {
                    case ChangeBrightness:
                        digitalWrite(PBPin, Actions[n].Intensity);
                        break;
                    }

                }
            }
        }
    }

    void AddAction(LedAction action)
    {
        int n;

        // Loop through all actions and find an unfinished one then reuse it
        for (n = 0; n < 20; ++n)
        {
            if (!Actions[n].Finished)
            {
                action.Finished = false;
                Actions[n] = action;
                break;
            }
        }
    }

    void ClearAllActions()
    {
        int n;

        // Loop through all actions and mark all as finished
        for (n = 0; n < 20; ++n)
        {
            if (!Actions[n].Finished)
            {
                Actions[n].Finished = true;
            }
        }
    }
};

一个关于Tinkercad电路的代码示例可以在...https://www.tinkercad.com/things/gmGeFVKOA3e-adrunio-test/editel

在页面上,单击“模拟”播放按钮(左下角),然后点击顶部的“开始模拟”按钮。您应该会看到与我看到的相同的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-13 21:29:02

好的,我想我找到答案了……

在与Tinkercad和伟大的支持团队进行了几次交谈后,我被告知他们使用旧版本的Arduino来编译他们的代码。好吧,我正在编写的所有代码和IDE都是基于所有最新版本的。我想这就是我的问题开始发生的地方。

目前,当尝试在Tinkercad使用的当前版本中编译以下代码时,我得到相应的错误,如下所示...

代码语言:javascript
复制
enum TestEnum
{
    OptOne = 1,
    OptTwo = 2
};

class TestClass {
private:
    void InitilizeClass(enum TestEnum te)
    { }

public:
    TestClass(enum TestEnum te)
    { }
};

void setup()
{ }

void loop()
{ }

正如您所看到的,我正试图在我的类中创建一个名为InitializeClass()的函数,该函数以枚举为参数。编译器不喜欢这一点,并且错误突出显示以及返回的错误是可怕的,因为某些原因没有告诉我任何东西!

但是,如果我将类更改为仅在构造函数本身中使用枚举,则似乎可以很好地编译,没有错误。

代码语言:javascript
复制
enum TestEnum
{
    OptOne = 1,
    OptTwo = 2
};

class TestClass {
private:
    void InitilizeClass()
    { }

public:
    TestClass(enum TestEnum te)
    { }
};

void setup()
{ }

void loop()
{ }

问题所在

我想创建一个具有尽可能少重复代码的类,这通常是我尝试和编写代码的方式。如果我必须输入相同的代码两次...开始考虑让它成为一个函数。这样一来,a)有更少的代码,b)如果你需要改变逻辑,你可以在一个地方而不是多个地方改变它。所以我开始通常让我的课程看起来像这样…

代码语言:javascript
复制
enum TestEnum
{
    OptOne = 1,
    OptTwo = 2
};

class TestClass {
private:
    void InitilizeClass(enum TestEnum te, int n, int t)
    {
        if (n < 0)
            n = 0;
        if (n > 255)
            n = 255;
        TE = te;
        N = n;
        T = t;
    }

public:
    enum TestEnum TE = OptOne;
    int N = 0;
    int T = 0;

    TestClass(enum TestEnum te)
    { InitilizeClass(te, 0, 0); }
    TestClass(enum TestEnum te, int n)
    { InitilizeClass(te, n, 0); }
    TestClass(enum TestEnum te, int n, int t)
    { InitilizeClass(te, n, t); }
};

void setup()
{ }

void loop()
{ }

这在VS (c++)以及最新的Arduino IDE中都能很好地工作。但是,由于Tinkercad使用的是旧的Arduino编译器,所以它适合我在私有类函数中使用枚举。(更新:刚刚发现在任何类函数中都会发生这种情况!而不仅仅是私人的。)

解决方案

所以这段时间,我在编码我的Arduino项目时,一直在以c#的心态思考,而我应该更像c++一样思考。好吧,在我的辩护中,我毕竟是一个彻头彻尾的c#人。我更喜欢它的c++。几乎在所有方面都是如此。显然也有例外。我最近发现,虽然c#不允许这样做,但c++允许您重载类构造函数!这改变了我用c++编写类的方式。现在,私有类函数没有理由初始化该类。所以我只需要下面这样的东西...

代码语言:javascript
复制
enum TestEnum
{
    OptOne = 1,
    OptTwo = 2
};

class TestClass {
public:
    enum TestEnum TE = OptOne;
    int N = 0;
    int T = 0;

    TestClass(enum TestEnum te)
    { TestClass(te, 0, 0); }
    TestClass(enum TestEnum te, int n)
    { TestClass(te, n, 0); }
    TestClass(enum TestEnum te, int n, int t)
    { TestClass(te, n, t); }
};

void setup()
{ }

void loop()
{ }

我的朋友们在旧的Arduino编译器中编译得很好。这也为我为其他代码节省了一些空间(这些ATTiny芯片并不大,所以更小的程序总是最好的!)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57881046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档