在填充 Arduino 草图时出现范围错误

Scope Error while sompiling Arduino sketch

本文关键字:范围 错误 填充 Arduino      更新时间:2023-10-16

我在尝试编译时遇到范围错误。据我所知,这似乎事情并没有在他们应该宣布的地方宣布,对吧?但是我认为我的实施没有错误,请帮助。由于代码很大,我将合成它。

            /* 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);

错误位于最后一行错误上方:在此范围内未声明"比较"。所以基本上我正在尝试将比较方法(它属于 Agendamentos.h(作为参数传递给属于 LinkedList.h 的排序方法,我通过在 Agendamentos 中键入 #include 来链接这两个库.cpp如您所见:

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

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

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

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