Aufruf von Funktionen im void setup - Reihenfolge ?

Ich habe folgendes Problem:

im void setup rufe ich zwei Funktionen auf (hier fiktive Funktionen).

void LeseDatenVonSD ()
void SchickeDatenzumTFT()

Der Aufbau des Scetch ist:

  1. Definition Variablen, Bibliotheken einbinden
  2. void setup
  3. void loop
  4. void "diverse Funktionen" (LesenDatenVonSD() ... SchickeDatenZumTFT() ... Sortiere)

Von diesen Funktionen werden wieder Funktionen aufgerufen Sortiere ... ()

Wenn ich nun compilieren will, sagt er mir 'Sortieren ..()' was not declared in this scope. Ist es aber ! Kopiere ich die Funktion an erster Stelle nach dem void loop, scheint er sie zu finden, meckert aber das eine andere Funktion nicht gefunden wird. Kopiere ich diese an erster Stelle, merckert er, dass die Funktion 'LeseDatenVonSD ..." nicht gefunden wird. Egal welche Reihenfolge ich wähle, er meckert immer, dass eine Funktion nicht "declared" ist.

Wie bekomme ich das in den Griff?

Es gibt keine voids! Void ist eine Art Datentyp. Steht für "leer" oder "nichts" weil man nichts zurück gibt.

Normalerweise braucht man in C/C++ Funktionsprototypen damit die Funktionen wenigstens deklariert sind bevor man sie verwendet. Definieren kann man sie woanders. Die Arduino IDE hat da etwas Luxus und erzeugt i.d.R. die Prototypen automatisch. Dadurch kann man Funktionen verwenden bevor man sie definiert. Bei manchen Konstrukten mit etwas exotischeren Parametern klappt das allerdings nicht. Das scheint bei dir nicht der Fall zu sein. Du kannst aber trotzdem versuchen die Prototypen per Hand zu erstellen. Das löst solche Probleme meistens.

Ansonsten zeige den ganzen Sketch. Wichtig sind die Funktionen und deren Aufrufe. Was in den Funktionen selbst steht kannst du entfernen

Eigentlich müssen Funktionen deklariert werden, wenn sie verwendet werden bevor sie definiert sind.
Das macht die IDE für dich, wenn sie aus mehreren .ino Dateien eine .cpp macht vor dem übersetzen (und versagt dabei under Umständen).

Abhilfe: A) Deklariere die Funktionen selbst.

1 ) includes
2) Funktionsdeklarationen:
void Sortiere(int* array, int size); // oder wie immer du deine Funktion definierst
void LesenDatenVonSD();
...
3) globale Variable
4) void setup() { LeseDatenVonSD(); } // Funktionsaufruf
5) void loop() {...}
6) Definition der oben deklarierten Funktionen
void LeseDatenVonSD() { /* funktionsrumpf / }
void Sortiere( int
array, int size ) { /* hier wird array umsortiert */ }
...


Abhilfe B)
Richtige Reihenfolge: jede Funktion wird definiert bevor sie woanders verwendet wird

Abhilfe C)
Hilf der Arduino - Software, es richtig zu machen. Meist klappt es ja. Zeig mal ...

odiug:
… ‘Sortieren …()’ was not declared in this scope. …
Wie bekomme ich das in den Griff?

Wenn ich Dich richtig verstehe, meckert der Compiler, weil er eine Funktion benutzen will, die dem Compiler zu diesem Zeitpunkt noch nicht bekannt ist.
Abhilfe 1: Deklariere die Funktion vor setup(). Die Definition kann dann anderswo stehen, der Compiler weiß aber schonmal, dass es die Funktion gibt.
Abhilfe 2: Benutze für eigene Funktionen jeweils einen Tab. Soweit ich weiß, wird Code, der in Tabs steht, vor loop() übersetzt. Das ist die Methode, die ich bevorzuge (vor allem, weil die Funktionen dann in separaten Dateien stehen, die ich bei Bedarf ohne weitere Bearbeitung ausdrucken kann)

Gruß

Gregor

PS: Guck mal hier, Stichwort „Vorwärts-Deklaration“

Abhilfe 3: Funktions-Prototyp per Hand erstellen und oben hin schreiben. Dann kann die Definition der Funktion ruhig unten stehen

Super !!! Mit Funktions-Prototyp klappt es. Vielen Dank !