我在尝试编译时遇到了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;
}
答案 0 :(得分:0)
您需要使用您的实例提供上下文:agendamentos.compare
编辑 - 例如agendametos.sort(agendamentos.compare)
答案 1 :(得分:0)
出路是将所有作为参数传递的方法转换为静态方法。因此,agendamentos.sort(Agendamentos :: compare)解决了这个问题。