全球变量问题

时间:2014-01-25 16:20:50

标签: c++ function variables arduino global

我希望在一个函数*pin_ledID中声明和初始化一些变量rgbInitiate(),以便被任何其他函数识别;例如rgbMixer()。正如您所看到的,我已经尝试返回值并将它们声明为外部变量,但没有任何效果。任何帮助/建议将不胜感激。谢谢。 =)

int rgbInitiate(int ledID, int redpin, int greenpin, int bluepin) {
    extern int redpin_ledID;
    extern int greenpin_ledID;
    extern int bluepin_ledID;
    redpin_ledID = redpin;
    greenpin_ledID = greenpin;
    bluepin_ledID = bluepin;
    pinMode(redpin_ledID, OUTPUT);
    pinMode(greenpin_ledID, OUTPUT);
    pinMode(bluepin_ledID, OUTPUT);
    return redpin_ledID;
    return greenpin_ledID;
    return bluepin_ledID;
}

void rgbMixer(int ledID, int redvalue, int greenvalue, int bluevalue) {
    analogWrite(redpin_ledID, redvalue);
    analogWrite(greenpin_ledID, greenvalue);
    analogWrite(bluepin_ledID, bluevalue);
}

1 个答案:

答案 0 :(得分:0)

以及...

当我第一次读到你的答案时,我认为wtf他是否想要全局变量? 但后来我读了你的代码(并重新格式化了,因此很明显这段代码是无意义的)......然后我就是 OMFG!

我不能再强调@laune的评论了:

  

如果不了解这些基础知识,就无法开始编程。

所以你所写的内容对C或C ++毫无意义。我给你的第一个建议是阅读that book(你可以很容易地找到电子书),也许是一本关于你语言的C ++的好书。

  • 全局变量很糟糕,应该尽可能避免

通常只有常规singletons的规则通常只用于Arduino代码中,因为设计选择将main()函数入口点拆分为两个函数setup()loop()

  • 您使用extern关键字的方式只是简单的无意义

我不知道从哪种情况开始,除了给你链接到文档阅读主题:

因此,在一个执行线程中有多个返回没有意义,所有以下内容永远不会执行,并被视为死​​代码。

但是除了这个教学课程之外,你想要做的事情很简单,你可以通过使用预处理器宏来实现这一点(这是你用例的常用方法):

#define LED_RED_PIN 12
#define LED_GREEN_PIN 11
#define LED_BLUE_PIN 10

void setup_leds() {
    pinMode(LED_RED_PIN, OUTPUT);
    pinMode(LED_GREEN_PIN, OUTPUT);
    pinMode(LED_BLUE_PIN, OUTPUT)
}

void rgb_mixer(uint8_t r, uint8_t g, uint8_t b) {
    analogWrite(LED_RED_PIN, redvalue);
    analogWrite(LED_GREEN_PIN, greenvalue);
    analogWrite(LED_BLUE_PIN, bluevalue);
}

void setup() {
    setup_leds();
}

void loop() {
    rgb_mixer(128, 128, 128);
}

你可能想要明智地定义三个领导者,并且有办法做到这一点。您可以创建一个包含三个LED数据的类,您可以编写一个宏,在一个优雅的行中设置三个LED ......

但是我不会给你任何暗示,因为在尝试变聪明之前,你需要学习实验失败< / strong>即可。一旦你完成了这个过程,你将学习编程和C语言的基础知识,面向对象的编程是什么,以及什么是C ++等...... 你将获得聪明的权利,你会自己找出那些简洁的方法!

在此之前,请好好阅读并祝你好运!

好的,根据你所写的内容,我认为你想要的是以下内容:

class RGBMixer {
    uint8_t _red, _green, _blue;
    public:
        RGBMixer();
        void begin(uint8_t r_pin, uint8_t g_pin, uint8_t b_pin) {
            _red = r;
            _green = g;
            _blue = b;
            pinMode(r, OUTPUT);
            pinMode(g, OUTPUT);
            pinMode(b, OUTPUT);
        }        
        void mix(uint8_t r, uint8_t g, uint8_t b) {
            analogWrite(_red, r);
            analogWrite(_green, g);
            analogWrite(_blue, b);
        }      
} rgb_mixer;

void setup() {
    rgb_mixer.begin(10, 11, 12);
}

void loop() {
    rgb_mixer.mix(128, 128, 128);
}