我在嘗試編譯時遇到了Scope錯誤。就像我知道的那樣,似乎事情並沒有在他們應該的地方宣佈,對吧?但是我的執行過程中沒有看到任何錯誤,請幫助。由於代碼很大,我會綜合它。作用域Arduino草圖時的錯誤
/* 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.cpp文件中鍵入#include,你可以看到:
/**
* 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.sort(實例 - >比較)沒有工作 – Rezik