在填充 Arduino 草图时出现范围错误
Scope Error while sompiling Arduino sketch
我在尝试编译时遇到范围错误。据我所知,这似乎事情并没有在他们应该宣布的地方宣布,对吧?但是我认为我的实施没有错误,请帮助。由于代码很大,我将合成它。
/* 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(解决了这个问题。
相关文章:
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- Visual C:命名空间范围错误或晦涩功能?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 此范围错误中未声明如何修复
- 尝试声明函数的局部变量,但得到范围错误
- c ++ to_string未在此范围错误 [Windows + Devcpp 环境] 中声明
- 将文件读取到向量的向量,超出范围错误
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 测试完美哈希函数时超出范围错误
- 为什么此代码会给出 Vector 超出范围错误
- 在填充 Arduino 草图时出现范围错误
- 如何修复C++中矢量的"下标超出范围"错误?
- CPP-模板范围错误
- 在此范围错误中未声明函数错误
- C 表达式:向量下标出范围错误线:1733
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 带有类的嵌套结构.范围错误