构造函数和对象声明的具体事项

时间:2013-02-20 13:39:06

标签: c++ c eclipse optimization arduino

在我的main.cpp文件中,我调用了类的构造函数。在构造函数中,我从一些静态函数设置此类的变量。所有问题都是关于从NTP服务器设置时间。

作为getter的静态函数使用while循环来检查标志。如果未设置时间,则该标志为false;如果NTP服务器至少响应一次,则该标志为true。如果该标志为false,则while循环必须尝试永久地获取时间(因为没有理由在没有时间的情况下继续),如果为真,则返回时间。

构造函数通过调用getters来设置变量。

当我在main中声明该类的对象时,程序不会运行,因为我在串行打印上什么都没有。如果我取消声明它的工作原理。此外,它不会像在while内部那样,因为我在其中放置了一个连续打印,但它也没有出现。我给出下面的代码:

构造函数:

#import "DayTime.h"
#include "NTP.h"

DayTime::DayTime(){
    hour = NTP::getLCThour();
    minutes = NTP::getMin();
    seconds = NTP::getSec();
}

main.cpp文件:

#include <Arduino.h>
#include <SPI.h>
#include "NTP.h"
#include "DayTime.h"
#include "DayNumber.h"

DayTime DT;
DayNumber DN;

int main(void)
{
    init();
    setup();
    for (;;)
        loop();
    return 0;
}

void setup() {
    Serial.begin(9600);
    NTP::startEthernetAndUdp();
}

void loop() {
    NTP::getTime();
    //    Serial.println(DT.hour);
    //    Serial.println(DT.getTimeToDec());
    delay(3000);

如果我评论名为DT的DayTime对象的声明,那么getTime函数就可以工作。

NTP.cpp部分:

1)第一个吸气剂:

int NTP::getLCThour(){
    while(timeNTPSet==false){
        Serial.print("kolaw");
        getTime();
    }
    return lcthour;
}

2)标题上的标志声明:

static bool timeNTPSet;

这是一个公共变量。

3)它在.cpp文件开头的定义:

bool NTP::timeNTPSet= false;

这是在include。之后的.cpp文件中设置的。

在函数的最后部分将标志设置为true:

NTP NTP::getTime(){

    if (testNtpServer()){
        timeNTPSet = true;
        // We've received a packet, read the data from it
        Udp.read((unsigned char*)packetBuffer, NTP_PACKET_SIZE);

testNTPServer函数只测试3-4个不同的NTP服务器,以便从至少一个时间获得时间。此外,如果我像之前所说的那样评论DayTime对象的声明,它也能正常工作。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您将DayTime变量声明为全局变量。这意味着在调用main函数之前,它的构造函数被称为。因为串口,以及我猜测的网络都没有设置,所以它不起作用。

您可以在DayTime类中创建一个初始化,它可以执行构造函数的操作,并在设置串行端口和网络后调用它。