2017-03-24 69 views
0

我在嘗試編譯時遇到了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; 
    } 

回答

0

您需要使用您的實例來提供內容:agendamentos.compare

編輯 - 如agendametos.sort(agendamentos.compare)

+0

不確定你真正的意思,但做這樣的事情:agendamentos.sort(實例 - >比較)沒有工作 – Rezik

0

出路在於將所有作爲參數傳遞的方法轉換爲靜態。因此議程.sort(議程::比較)解決了這個問題。