范围错误,同时淹没Arduino草图

时间:2017-03-24 18:38:30

标签: c++ scope arduino

我在尝试编译时遇到了Scope错误。就像我所知道的那样,事情似乎没有在他们应该的地方宣布,对吗?但我认为我的实施没有错误,请帮忙。由于代码很大,我会合成它。

            /* Biblioteca padrão do Arduino */
        #include <Arduino.h>
        #include <Agendamentos.h>
        #include <LinkedList.h>

        File arquivo;
        File startcfg;
        RTC_DS1307 rtc;
        Mensageiro mensageiro;
        char registrador_nivel;

        int indiceFert, indiceEvento, indiceAgendamento;

        LinkedList<Agendamentos*> agendamentos = LinkedList<Agendamentos*>();
        Start *start = new Start();
        Agendamentos *chamaFuncao = new Agendamentos();

        const byte HASH_SETOR_SIZE = 15;
        HashType<int,int> hashRawArray[HASH_SETOR_SIZE];
        HashMap<int,int> hashMap = HashMap<int,int>( hashRawArray , HASH_SETOR_SIZE );

        //--------- Decladando HashMap de Silos
        const byte HASH_SILO_SIZE = 2;
        HashType<char*,int> hashSiloArray[HASH_SILO_SIZE];
        HashMap<char*,int> hashMapSilo = HashMap<char*,int>( hashSiloArray ,HASH_SILO_SIZE );


        void setup() {

        hashMap.debug();
        hashMapSilo.debug();

        if (!rtc.begin()) {
          Registrador::error("Nao foi possivel encontrar modulo RTC");
          while (1);
        }

        if (! rtc.isrunning()) {
          Registrador::info("Inicializando m�dulo RTC!");
          rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        }

        char pontoParada;
        Serial.begin(9600);
        pinMode(PINO_SD_CS, OUTPUT);
        if (!SD.begin(PINO_SD_CS)) {
            Serial.println("O cartao falhou ao iniciar ou nao esta presente"); // Trocar "Serial.printl" por "Registrador:error" ap�s os testes.
            return;
        }

        Serial.println("Cartao iniciado !");
        Serial.print("Comecando o Sketch em: ");
        for (int i = 3; i > 0; i--) {
            Serial.print(i);
            Serial.print(' ');
            delay(500);
        }

        Serial.println();
        Serial.println("Iniciando leitura do arquivo da programacao");

        arquivo = SD.open("Ferti.cal");

        if (arquivo.available()) {
            Serial.println("FERTI.CAL:");
            Util::leCaracter(',', arquivo);
            Util::leCaracter(',', arquivo);
            Util::leCaracter(':', arquivo);
        }

        indiceAgendamento = 0;

        while(arquivo.available()){
            Agendamentos *agendamento = new Agendamentos();
            chamaFuncao->openReadArquivo(agendamento);
            agendamentos.add(agendamento);
            Serial.print("agendamentos.size() =");
            Serial.println(agendamentos.size());
            indiceAgendamento++;
            arquivo.read();
            arquivo.read();
            pontoParada = arquivo.read();

        }

        startcfg = SD.open("Start.cfg");

        if (startcfg.available()) {

            Serial.println("START.CFG:");
            Util::leCaracter(',', startcfg);
            Util::leCaracter(':', startcfg);
            start->openReadStart(startcfg);
        }

        Serial.println("Terminou de ler a programacao");
        Serial.println();
        Serial.println("Carregou conteudo para listas encadeadas ...");

        //Imprimindo a data e hora
        DateTime now = rtc.now();
        Serial.print("Ordenando...DIA:");
        Serial.print(now.dayOfTheWeek());
        Serial.print(" ");
        Serial.print(now.hour());
        Serial.print(':');
        Serial.print(now.minute());
        Serial.print(':');
        Serial.print(now.second());
        Serial.println();
        agendamentos.sort(compare);

错误位于最后一行错误:此范围内未声明'compare'。所以基本上我试图通过比较方法(它属于Agendamentos.h)作为属于LinkedList.h的sort方法的参数,我通过在Agendamentos.cpp文件中输入#include来链接两个库,如你所见: / p>

    /**
     * Agendamentos.cpp - Implementa os métodos utilizados na obtenção de data e hora da aplicação.

     **/

    #include <Agendamentos.h>
    #include <Eventos.h>
    #include <Fertilizantes.h>
    #include <Util.h>

    /* Bibliotecas de leitura e escrita para módulo SD */
    #include <SD.h>
    #include <SPI.h>

    /* Biblioteca de Lista Encadeada */
    #include <LinkedList.h>

    /* Bibliotecas de data/hora para módulo DS1307 RTC */
    #include <Wire.h>
    #include <RTClib.h>
    #include <Time.h>
    #include <TimeLib.h>
    #include <TimeAlarms.h>

    /*
     * Method Name  : Agendamentos
     *
     * Synopsis     : Agendamentos::Agendamentos() *
     * Description  : Construtor padrão da classe
     *
     */
    Agendamentos::Agendamentos(){
        _eventos = LinkedList<Eventos*>();

    } 

     /*
     * Method Name  : segundosAcontecer
     *
     * Synopsis     : void Agendamentos::segundosAcontecer(Agendamentos *agendamento) *
     * Arguments    : 
     *
     * Description  : Esta função retorna o delta segundos da hora atual em relação a hora de um agendamento recuperado no JSON.
     * 
     */ 

    long Agendamentos::segundosAcontecer (Agendamentos*agendamento) {

        DateTime now = rtc.now();

        long intervalo = (agendamento->getDia()*86400)+(agendamento->getHora()*3600)+(agendamento->getMinuto()*60)+(agendamento->getSegundo()) -
        (now.dayOfTheWeek()*86400)-(now.hour()*3600)-(now.minute()*60)-(now.second());

        if(intervalo < 0){
            return intervalo + 604800;
        }

        return intervalo;
    }

     /*
     * Method Name  : compare
     *
     * Synopsis     : static void Agendamentos::compare(Agendamentos*&a, Agendamentos*&b) *
     * Arguments    : 
     *
     * Description  : Esta função irá comparar agendamentos através do delta S obtido pelo método "segundosAcontecer" e retornará
     * valores do tipo int para em seguidas serem ordenados pelo método sort da biblioteca "LinkedList.h"
     */ 
     int Agendamentos::compare(Agendamentos*&a, Agendamentos*&b) {

        long c,d;
        c = segundosAcontecer(a);
        d = segundosAcontecer(b);

        // l�gica strcmp
        if(c<d) return -1;
        else if(c==d) return 0;
        else return 1;
    }

2 个答案:

答案 0 :(得分:0)

您需要使用您的实例提供上下文:agendamentos.compare

编辑 - 例如agendametos.sort(agendamentos.compare)

答案 1 :(得分:0)

出路是将所有作为参数传递的方法转换为静态方法。因此,agendamentos.sort(Agendamentos :: compare)解决了这个问题。