Avatar billede KurtG Forsker
03. december 2020 - 20:01 Der er 4 kommentarer og
1 løsning

Compilerfejl med Arduinos IDE

Compilerfejl når Setup flyttes til en ny tab i IDE.

I lidt større programmer anvender jeg muligheden for at gøre rogrammet mere overskueligt ved at bruge "Tab".
F.eks. anbringer jeg definationer, variable og globale i 'hovedtab' med programnavnet,
Derefter en tab (b_IRQ) med interrupt og dertil hørende rutiner.
Så følger normalt c_Setup, d_Loop, e_Sub og derefter andre grupper.

Nu har jeg forsøgt at bruge eksemplet 'listfilee.ino fra SD-lib. Her har jeg følgende tabs:

//----------------------------------------------------------
'listfiles';
#include <SD.h>
File root;
/*
void setup()
{
  Serial.begin(250000);
  pinMode(10, OUTPUT);
  SD.begin(10);
  root = SD.open("/");
  printDirectory(root, 0);
  root.close();
}
*/
-----------------
'c_Setup' med:

void setup()
{
  Serial.begin(250000);
  pinMode(10, OUTPUT);
  SD.begin(10);
  root = SD.open("/");
  printDirectory(root, 0);
  root.close();
}

-----------------
'd_Loop' med:
void loop()
{
  // nothing happens after setup finishes.
}

-----------------
og 'e_Sub' med:
void printDirectory(File dir, int numTabs)
{
  while(true)
  {
    File entry = dir.openNextFile();
    if (! entry)
    {
      if (numTabs == 0)
      Serial.println("** Done **");
      return;
    }
    for (uint8_t i=0; i<numTabs; i++)
    {
      Serial.print('\t');
    }
    Serial.print(entry.name());
    if (entry.isDirectory())
    {
      Serial.println("/");
      printDirectory(entry, numTabs+1);
    }
    else
    {
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
    entry.close();
  }
}

//----------------------------------------------------------

Når som vist Setup er kommenteret ud i 'listfiles', kommer compileren med fejlmeldingerne:
Arduino: 1.8.13 (Windows 10), Board: "Arduino Due (Programming Port)"
k_Sub:2:21: error: variable or field 'printDirectory' declared void
void printDirectory(File dir, int numTabs)

k_Sub:2:21: error: 'File' was not declared in this scope
k_Sub:2:31: error: expected primary-expression before 'int'
void printDirectory(File dir, int numTabs)

C:\Arduino\Projects\Test\Test_ListFiles_KG\A_Setup.ino: In function 'void setup()':
A_Setup:8:25: error: 'printDirectory' was not declared in this scope
  printDirectory(root, 0);

exit status 1
variable or field 'printDirectory' declared void


Udkommenteres derimod Setup i stedet i 'c_Setup', er der ingen problemer!
Fejlen sker både med Uno, Mega og Due!

Er de nogen forklaring og løsning?

MVh Kurt
Avatar billede bvirk Guru
03. december 2020 - 21:10 #1
I hver eneste af dine filer der optræder som tabs i editoren, skal de funktioner der anvendes være deklareret - som her - bemærk afsluttende semicolon:

void printDirectory(File dir, int numTabs);

En deklarering er angivelse af funktiones signatur - argumenter og return type.

I større c/c++ projekter hvor hver fil indeholder mange funktioner laver man en dertil hørende header fil med deklareringer af alle dens funktioner - og denne headerfil inkluderes da først i hver eneste c/c++ fil der behøver disse. Headerfilens deklareringer beskyttes af en header guard, som er en kompile mekanisme der forhindrer gendeklarering.

f.eks til filen foo.c hører foo.h

#ifndef FOO_H
#define FOO_H

// your declarations here

#endif

https://stackoverflow.com/questions/4767068/header-guards-in-c-and-c
Avatar billede KurtG Forsker
03. december 2020 - 23:22 #2
Det forstår jeg ikke rigtigt.
Jeg skal nok have det pindet lidt bedre ud!

Jeg har flere projekter med 5-7 tabs og mange subrutiner, som compilerer uden problemer.
Danner preprocessoren nogle af de nødvendige ting?
Avatar billede bvirk Guru
04. december 2020 - 06:55 #3
'k_Sub:2:21: error: 'File' was not declared in this scope'

k_sub skal øverst have:
#include <SD.h>


'k_Sub:2:21: error: variable or field 'printDirectory' declared void'

k_sub skal øverst have
void printDirectory(File dir, int numTabs);


Hver af tabsene i editoren er selvstændige kompileringsenheder - med andre ord de kender ikke til hinanden under kompilering. Når alt er kompilet bliver det 'linket' -  med andre ord, samlet til en  arduino eksekverbar
Avatar billede bvirk Guru
04. december 2020 - 07:05 #4
Jeg tror det forholder sig sådan - selvstændig kompilering af tabs. Du kan se det ved at slå fuld debug info til og prøve at tyde alt det der skrives - tilsidt må der komme en link kommando der måske kan hede noget andet end link i arduino verden - men den samler resultat af dine navngivne tabs med anden extension - .obj ved jeg skyde på.
Held mef det!
Avatar billede KurtG Forsker
04. december 2020 - 23:25 #5
Tak for hjælpen, det løste problemet.

Men jeg undrer mig alligevel, for det er faktisk yderst sjældent, at det er nødvendig med deklareringen.
Kan det ikke tænkes, at Arduino selv (de fleste gange) danner deklareringerne, eller burde det jo skulle bruges ved all tab!

Men det virker nu og jeg vil huske det næste gang, der kommer fejl af den lags.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester