KurtG Seniormester
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
bvirk Forsker
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
KurtG Seniormester
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?
bvirk Forsker
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
bvirk Forsker
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!
KurtG Seniormester
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.
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

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





Premium
Siger farvel til Proshop - her er topchef Ivan Jæger Christiansens nye job: "Det kan godt være, det er verdens mest åndssvage beslutning, men det føles virkelig godt"
Interview: Efter fire år som topchef i det fremadstormende Proshop har Ivan Jæger Christiansen meldt sin afgang. Nu tager han hul på drømmen som medejer i et nyt selskab. Se hans nye job.
Computerworld
Biden sender skjult besked til kode-folket: "Hvis du læser dette, har vi brug for din hjælp”
En stående invitation er blevet opdaget i kildekoden på Det Hvide Hus' hjemmeside. Men den er kun til de eksperter, der selv kan finde den.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
White paper
Fri medarbejdermobilitet - med digital bodyguard
Om at gå fra adgangsstyring på personniveau til adgangsstyring på desktopniveau. I takt med at flere og flere medarbejdere arbejder remote og logger på jeres systemer og netværk uden for virksomhedens sikkerhedsværn, risikerer de at efterlade døren til forretningen på klem. Dermed bliver endpoints som pc’ere, Mac’s og servere et oplagt mål for hackere, som vil ind i virksomhedens infrastruktur. I blandt sker det også, at medarbejdere udnytter deres privilegerede adgangsrettigheder til skadelige formål. Det er derfor mere aktuelt end nogensinde at rette opmærksomheden mod jeres endpoints og de rettigheder, der ligger her.