Funktion "was not declared in this scope"

Hallo,

also irgendwie produziert die IDE mittlerweile erstaunlich viele Fehler.
Aus dem "mal eben prototyping" ist jetzt eher "Fehler der IDE ausmerzen" geworden.
Faktisch verbringe ich tatsächlich mehr also die hälfte der Zeit statt mit dem eigentlichen Programmieren, damit, die Fehler der IDE zu umgehen.
Viele "richtige Sketches" wurden von mir gelöscht und neu programmiert, um dann hinterher zu merken, dass nichts falsch programmiert wurde, sondern die IDE nen knacks hat.

Nun zum Problem:

Ich habe einen Sketch zum senden und empfangen von Daten, der etwa so augebaut ist:

void setup() {
  wunderfunktion();

}

void loop() {
  chill();

}

void wunderfunktion()
{

}

void chill()
{

}

Das Ganze hab ich ausgiebig getest und es funktioniert auch. (also Kompilieren, hochladen und auch der Realtest einwandfrei.)
Jetzt will ich den Sketch so wie er ist nehmen und nochmal was erzänzen, weil ich die Empfangsseite noch ordentlich machen muss.

Wenn ich den Sende-Sketch kopiere und dann einfach nur kompiliere (ohne jedliche Veränderung!), dann bekomme ich den Fehler
.... In function 'void setup()':
.....error: 'wunderfunktion' was not declared in this scope

Soll das ein Witz sein?

Ich weiß, dass ich jetzt theoretisch alle Funktionen vor das setup ziehen könnte, aber das will ich nicht.

Auch das Deklarieren von Dummy-Funktioen (aka Prototypes) will ich nicht machen, weil ich nicht einsehe mir 10fache Arbeit zu machen, weil die IDE mal so und mal so arbeitet.

Weiß jemand, was hier das Problem ist und wie ich die IDE dazu bekomme den kopierten Sketch ohne Fehler - wie das Original - zu kompilieren?

1 Like

Also bei mir compiliert dein Beispiel-sketch natürlich auf Anhieb (noch mit Version 1.6.7)
Aber 1.6.12 sollte eigentlich auch gehen, wenn es wirklich so simpel ist.

Manchmal hilft auch bei Unerklärlichem, den betreffenden temp Ordner zu löschen.
(und/oder die IDE neu zu starten)

Auch das Deklarieren von Dummy-Funktioen (aka Prototypes) will ich nicht machen, weil ich nicht einsehe mir 10fache Arbeit zu machen, weil die IDE mal so und mal so arbeitet.

Du weißt aber schon, dass die Prototypen in der C/C++ Welt Pflicht sind !?!?!?

Und ja, es gibt Situationen, wo die automatische Prototypen generierung versagt!
Dann muss man per Hand.

10fache Arbeit

Eine Zeile pro Funktion kopieren, ist die 10Fache Zeit?
:sunglasses: Ich glaube, du fantasierst etwas.... :sunglasses:

combie:
Du weißt aber schon, dass die Prototypen in der C/C++ Welt Pflicht sind !?!?!?

Da hast du natürlich recht, aber ich finde es auch ärgerlich.

Sketche, die problemlos liefen, lassen sich nun plötzlich nicht mehr kompilieren, weil die Funktionen nicht (mehr) bekannt sind. Funktionsprototypen waren in der Arduino-Welt eben keine Pflicht.

Ich habe mir immer noch eine 1.05 IDE parallel installiert. Mit der laufen auch die alten Sketches.
Aber ärgern tut es mich trotzdem.

Ja gut.....
Kann ich verstehen...

Fällt mir nicht wirklich auf, weil ich eigentlich immer den Kram in *.h und *.cpp auslagere. Und dann trifft mich der Prototypen Zwang sowieso. Und aus der Vergangenheit kenne ich es auch nicht anders.

combie:
Du weißt aber schon, dass die Prototypen in der C/C++ Welt Pflicht sind !?!?!?

Eine Zeile pro Funktion kopieren, ist die 10Fache Zeit?
:sunglasses: Ich glaube, du fantasierst etwas.... :sunglasses:

Wir programmieren hier aber nunmal nicht in reinem C/C++ sondern in einer für die ArduinoIDE abgewandelten Form davon.
Daher auch die ArduinoIDE und nicht Visual Studio und Co.
Und da sind die Protoypen nunmal (eigentlich) keine Pflicht.

Und zur Zeit: Es geht hier ums Prinzip.
Wenn ich einige hundert Zeilen Code habe und er zum Zeitpunkt X funktioniert, dann sollte eine Kopie davon auch funktionieren.
Andernfalls ist es fraglich, ob der originale Code zum Zeitpunk Y (sogar in der gleichen IDE-Version) immernoch funktioniert.
Außerdem ist es einfach lästig 20mal den Compiler durchlaufen zu lassen um alle Fehler die er neuerdings zeigt zu beheben, die aber in dem gleichen Sketch bei der selben IDE Version ohne Probleme funktionieren.

Ich hatte da schon einige Codes, die in früheren Versionen der IDE wunderbar funktionierten und nach nem Update dann erstmal Zusatzarbeit notwendig war.

Ich google jetzt erstmal wo der temp Ordner der IDE ist um ihn dann zu löschen... man hat ja schließlich nichts besseres zu tun....

EDIT:
CCleander laufen lassen, PC neugestartet und alle Dateien aus C:\Users\xxx\AppData\Local\Temp mit dem Name buildxxx und consolexxxx gelöscht.

Wir programmieren hier aber nunmal nicht in reinem C/C++ sondern in einer für die ArduinoIDE abgewandelten Form davon.

Das ist natürlich normales C/C++. Der Unterschied im C++ Bereich liegt eher darin dass es keine STL gibt.

Im Hintergrund werden Prototypen sehr wohl verwendet. Die IDE übernimmt nur deren Erzeugung in den meisten Fällen. Und auch wenn das inzwischen verbessert wurde gibt es immer noch Situationen in denen das nicht klappt. Je nach Version versagt das schon bei so simplen Dingen wie enums und structs als Parameter (inzwischen geht das glaube ich).

Dass Programme in neuen Compiler oder Library Versionen nicht mehr funktionieren kann dir übrigens überall passieren.

Wenn das hier reines C/C++ ist, dann bleibt offen, warum einige Funktionen, die es in C/C++ gibt in der ArduinoIDE nicht funktionieren. Es ist nunmal eine abgespeckte Variante und kein komplettes C/C++.

Ob Prototypen verwendet werden steht nicht zur Diskussion. Da sind wir uns eh alle einig.
Die IDE sollte das aber machen - und wenn es im SketchX funktioniert, sollte es bei einer Kopie nunmal auch.
Und das ein und das selbe Programm, welches 1:1 kopiert wurde (ohne Namensänderun ö.ä.) einfach nicht mehr funktionieren, kann nicht überall passieren - und das sollte es hier auch nicht.

Auch nach Neustart etc. funktioniert das originale Programm/Sketch noch, aber die (und eine beliebig neu erstellte) Kopie davon nicht.

Geil, dass die IDE bei einem Teil des Sketches meckert, welcher schon hundertfach von anderen Leuten so benutzt wurde.

Dieser kommt von hier und als Fehler kommt

[...] In function 'void loop()':

DIY_headtracker_send:189: error: 'SaveSettings' was not declared in this scope

DIY_headtracker_send:190: error: 'SaveMagData' was not declared in this scope

DIY_headtracker_send:191: error: 'SaveAccelData' was not declared in this scope

DIY_headtracker_send:194: error: 'GetSettings' was not declared in this scope

DIY_headtracker_send:408: error: 'SaveSettings' was not declared in this scope

DIY_headtracker_send:421: error: 'DebugOutput' was not declared in this scope

DIY_headtracker_send:557: error: 'SaveSettings' was not declared in this scope

DIY_headtracker_send:569: error: 'SaveSettings' was not declared in this scope

DIY_headtracker_send:612: error: 'SaveMagData' was not declared in this scope

DIY_headtracker_send:643: error: 'SaveAccelData' was not declared in this scope

Ich mach jetzt die Mehrarbeit, weil das hier eher in eine Grunsatzdiskussion ausatet, als das jemand weiß, warum die IDE ne Kopie nicht kompilieren kann...

So!

Und des Rätzels Lösung ist:
Wenn ein beliebiger Überordner ein Umlaut im Namen hat, dann kommt dieser sch... Fehler.

Nix dazu im Internet gefunden und selbst rausgefunden...

Vielen Dank für den Zeitraub auch.
Wo kann ich den Entwicklern dieser IDE von diesem fabelhaften Fehler berichten?

Das liegt vermutlich nicht an der IDE, sondern am gcc und der GNU Toolchain. Also bei AVR beschweren, oder bei Microsoft über mangelnde Linux-Kompatibilität von Windows :wink:

Leon333:
...
Aus dem "mal eben prototyping" ist jetzt eher "Fehler der IDE ausmerzen" geworden.
Faktisch verbringe ich tatsächlich mehr also die hälfte der Zeit statt mit dem eigentlichen Programmieren, damit, die Fehler der IDE zu umgehen.
...

Ja, Fehlersuche kann ärgerliche Strafarbeit sein. Andererseits lernt man irre viel dabei. Nicht ohne Grund wird von Informatikstudenten immer wieder ein Seminar zum Thema Flüche gewünscht.

Gruß

Gregor

Fehlende Prototypen können kaum der IDE angelastet werden. Wenn etwas zufällig compiliert, weil die IDE ein paar Fehler im Code selbständig korrigiert, dann ist das keine ordentliche Programmierung, sondern Schlamperei. Da gilt der alte Grundsatz:

Kaum macht man es richtig, schon klappts :wink:

dann ist das keine ordentliche Programmierung, sondern Schlamperei.

Dem stimme ich zu.

hi,

nein, es ist keine schlamperei des programmierers, sondern das, was gelehrt wird. hier in der referenz und in allen arduino büchern.
wenn solche fehler dann passieren, ist es schuld des arduino-"systems", auch wenn's am gcc liegt.

mich stört's nicht wirklich, aber man braucht das nicht schönzureden.

gruß stefan

Danke für die Auflösung des Rätsels, Leon.

Mein Senf dazu:

Das ist wohl auch darin begründet, dass die IDE ihr Hintergrund-Hokuspokus in Java macht.
Und dass UTF-8 und Unicode ein Unterschied ist.

Und dass kein italienischer Hobby-Programmierer auf die Idee käme, deutsche Ümlaute in Verzeichnisnamen zu verwenden. (Falsch! S. unten)
Kann auch sein, dass das gleiche unter Linux oder bei anderen Java Umgebungseinstellungen geht, oder andere blöde Effekte verursacht.

In der Regel ist die einfachste Lösung, auf solche Sachen zu verzichten.

  • Umlaute in Funktions- oder Variablennamen geht übrigens gar nicht.

  • Das sketch-Verzeichnis selber wird auch sauber abgefangen:

Der Sketch-Name musste geändert werden. Sketch-Namen können nur aus
ASCII-Zeichen und Zahlen bestehen (aber nicht mit einer Zahl beginnen).
Sie sollten auch weniger als 64 Zeichen lang sein.

  • Wie Texte aussehen, die der Arduino über Serial ausgibt, wenn der SerialMonitor auf einer wesentlich anderen Machine läuft als der Programmierumgebung, könnte evtl. auch mal spannend werden. Noch keine Ahnung, in welchem Zeichensatz die Arduino-IDE arbeitet...

Ich habe es mir angewöhnt auf Umlaute unds Ähnliches zu verzichten, wenn ich nicht explizit den Zeichensatz festlegen kann (wie es bei html und Datenbankverbindungen geht).
Schon bei Mail wird es unsauber, weil man nicht immer weiß, was der Empfänger benutzt.
Ich habe einen Umlaut im Namen und da schon gruselige Mails bekommen (auch von Firmen).

Gruß Tommy

hi,

und so wird auch klar, warum ich Eisebaer heiße, obwohl ich das "ae" scheußlich finde.

beispiel: es gibt einen bezahldienst, der Dir "gewisse möglichkeiten" auf einem linux-sat-receiver wie einer dreambox bietet. bei der anmeldung den user mit "ä" angemeldet, weil es ja funktioniert hat.
bezahlt.
alles gut.
dieser dienst bietet auch ein forum, bei dem Du Dich mit dem gleichen user anmelden mußt. die datenbank des forums akzeptiert aber KEINE umlaute. und den dienst-user umbenennen ging nicht (geht ja hier im forum auch nicht). neuen user anlegen auch nicht, weil ich mein guthaben ja schon drauf hatte. es war dann schwierig für den zum glück verständnisvollen betreiber.

die idee, einen ordner mit anderen zeichen als "a-z", "0-9" und "_" zu benennen, verursacht mir einen knoten im magen. hat schon ewig gedauert, bis ich lange datei- und ordnernamen verwendet habe...

gruß stefan

Es reicht offenbar auch, wenn Kommentare hinter Funktionsparametern stehen, also z.B.:

int func(
  int p1,  // comment
  int p2,  // comment
  ) {
...

führt zum Fehler. Der Rückgabetyp muss auch direkt vor dem Funktionsnamen stehen, sonst gibt es ebenfalls den Fehler

<project_file>:: error: '' was not declared in this scope

Eisebaaaaeeeer ist doch hübsch...
Grüße ins sonnige Wien.

Grüße Uwe