Rücksprung von Tab

Hallo, mittlerweile habe ich es einigermassen gerafft, mit einem Programm, das in mehrere Tabs aufgeteilt ist, zu arbeiten. Aber ein Problem bekomme ich nicht gelöst, auch nach intensiver Suche bei Dr. Google. Darum geht es:

  • ich habe ein Programm Main.ino
  • in diesem befindet sich ein void ShowFinal()
  • von Main.ino springe ich in einen Tab Unter.ccp
  • wenn eine bestimmte Bedingung erfüllt ist, möchte ich von Unter.cpp die void ShowFinal() anspringen, die sich in Main.ino befindet.

Ich denke, ich habe fast alles probiert. Immer erhalte ich die Fehlermeldung, dass void ShowFinal() unbekannt ist.

Kann mir jemand helfen?

Vielen Dank im Voraus & liebe Grüße von th10gt

th10gt:
Hallo, mittlerweile habe ich es einigermassen gerafft, mit einem Programm, das in mehrere Tabs aufgeteilt ist, zu arbeiten. Aber ein Problem bekomme ich nicht gelöst, auch nach intensiver Suche bei Dr. Google. Darum geht es:

  • ich habe ein Programm Main.ino
  • in diesem befindet sich ein void ShowFinal()
  • von Main.ino springe ich in einen Tab Unter.ccp
  • wenn eine bestimmte Bedingung erfüllt ist, möchte ich von Unter.cpp die void ShowFinal() anspringen, die sich in Main.ino befindet.

Ich denke, ich habe fast alles probiert. Immer erhalte ich die Fehlermeldung, dass void ShowFinal() unbekannt ist.

Kann mir jemand helfen?

Benenne Deine Unter.cpp um in Unter.h und includiere diese Datei oben in Deinem .ino Sketch

#include "Unter.h"

Dann kannst Du die in Unter.h deklarierten Funktionen in Deiner .ino Datei verwenden.

Hallo,
das funktioniert noch nicht wirklich:

  • Unterprogramm in Unter.h umbenannt (einfach mit dem Editor)
  • im Main.ino den include in #include Unter.h umbenannt

Beim Kompilieren von Unter.h wird angemeckert das void ShowFinal() nicht deklariert wurde...

th10gt:
Beim Kompilieren von Unter.h wird angemeckert das void ShowFinal() nicht deklariert wurde…

Zeige den Quelltext aller Dateien!

Ich gehe davon aus: Der Compiler hat Recht und Du versuchst möglicherweise, ShowFinal() im ino Sketch aufzurufen, während ShowFinal() weder im Sketch selbst noch in Unter.h deklariert ist.

Und ein include-Statement der Form

 #include Unter.h

ist sowieso syntaktisch falsch, weil der Dateiname bei einem #include entweder in spitze Klammern oder Anführungszeichen eingeschlossen gehört (je nachdem wo sich die include-Datei befindet).
Also ggf.

 #include "Unter.h"

Nein, ich rufe ShowFinal(), das sich in Main.ino befindet, im Sketch Unter.h auf. In Main.ino ist Unter.h included...

th10gt:
Nein, ich rufe ShowFinal(), das sich in Main.ino befindet, im Sketch Unter.h auf. In Main.ino ist Unter.h included...

Wenn ShowFinal() in der .ino Datei deklariert ist, kannst Du diese Funktion auch nur in der .ino Datei verwenden, sonst machst Du es falsch.

Sowohl Variablen als auch Funktionen haben Gültigkeitsbereiche, und der Gültigkeitsbereich für im Sketch deklarierte Funktionen ist der Sketch und nicht irgendwelche inkludierten Dateien.

Gibt es irgendeinen weg, von Unter.h wieder in Main.ino zurück zu springen???

th10gt:
Gibt es irgendeinen weg, von Unter.h wieder in Main.ino zurück zu springen???

Höre bitte auf, solche völlig unsinnigen QuatschFragen wie diese zu stellen und beschreibe stattdessen lieber möglichst detailliert, was Du eigentlich machen möchtest!

Mal angenommen, Du deklarierst in Deiner Unter.h eine Funktion der Art

void
TuWas()
{
}

Und rufst in Deinem Sketch diese Funktion auf:

TuWas();

dann wird an der Stelle im Sketch TuWas() aus Unter.h aufgerufen und direkt danach mit der nächsten Codezeile aus der Sketchdatei fortgesetzt. Also in Deiner Diktion “springt” die Programmausführung von der Sketchdatei in die Inkludedatei, arbeitet dort die aufgerufene Funktion ab und springt danach wieder zurück zur Sketchdatei, um dort mit der nächsten Codezeile fortzusetzen.

Sorry, wenn das QuatschFragen sind. Ich hatte auf Hilfe gehofft…

Es ist genau andersherum und ich dachte, ich hätte das deutlich geschrieben.

  • Main.inso springt in Unter.h
  • Von Unter.h möchte ich irgendwie in das Hauptprogramm Main.ino zurückspringen und dort eine void ausführen…

Für wen das anders als für mich kein Problem ist, sondern Quatsch, der möge einfach nicht antworten. Wenn es jemanden gibt, der mir (ggf. mit einem ganz anderen Vorschlag) helfen kann, dem danke ich schon jetzt…

Wie jurs es beschrieb: Der "Rücksprung" geschieht automatisch. Wenn das bei dir nicht der Fall sein sollte, hast du wohl irgendwo einen selbstgebauten strukturellen Bug.

th10gt:
Es ist genau andersherum und ich dachte, ich hätte das deutlich geschrieben.

  • Main.inso springt in Unter.h
  • Von Unter.h möchte ich irgendwie in das Hauptprogramm Main.ino zurückspringen und dort eine void ausführen...

Wenn Du aus der INO Datei eine Funktion aus der inkludierten .h Datei aufrufst, dann setzt die Programmausführung automatisch(!) mit der nächsten Programmzeile in der INO Datei fort, sobald die in der .h aufgerufene Funktion beendet ist!

Aus der inkludierten .h Datei heraus kannst Du keine Funktionen der .ino Datei aufrufen, da die .ino Datei nicht zum "Scope" (Sichtbarkeitsbereich) der .h Datei gehört, sondern nur umgekehrt: Die Funktionen der inkludierten .h Datei sind für die .ino Datei sichtbar (gehören durch die Inkludierung der Datei zum Scope), nicht umgekehrt.

Wenn Du aus dem falschen Scope/Sichtbarkeitsbereich heraus "zurück" Funktionen aufrufen möchtest, so ist das nur über sogenannte "Callback-Funktionen" möglich, wobei Du ggf. die Funktionsadresse der im falschen Scope deklarierten Callback-Funktion an die aufgerufene Funktion im sichtbaren Scope übergeben mußt, so dass diese dann zurück "nach Hause telefonieren" (kleine reminiszenz an E.T.) kann.

Nenn Unter.cpp besser Unter.ino, dann werden die Prototypen auch richtig erzeugt.
Oder füge in deiner Unter.cpp, wie es sich für .cpp Dateien gehört, ein:

#include <Arduino.h>
void ShowFinal(); // in Main.ino definiert

und in main.ino fehlt natürlich die Deklaration

void unter(); // in Unter.cpp definiert.

Unter.cpp in Unter.h umzubenennen und #include “Unter.h” in Main.ino einzufügen ist eigentlich nicht die Lösung. Kannst natürlich zusätzlich zu unter.cpp eine Datei Unter.h machen, in der dann die Deklaration ist, und diese statt der Zeile oben durch

#include "Unter.h"

bekannt machen.


Was in welcher Verschachtelung und Reihenfolge kompiliert wird, und welche Funktion zur Laufzeit was aufruft, sind zwei verschiedene Sachen…

Ok, besten Dank!

Jetzt ist es mir 1. klar und 2. sehe ich einen Ausweg. Das werde ich mal probieren...

Kann es sein, dass du diese Thema mit den "Tabs" zu umständlich angehst?

Wie erstellst du die Tabs in deinem Sketch ?

Machst du es aus der IDE heraus? dann werden doch automatisch x.ino-Dateien erstellt.
Beispiel "Strg-Umschalten+N" erstellt einen neuen Tab, den du mit einem Namen versehen musst.

In solch erstellten Tabs sollte es doch so funktionieren, wie du es möchtest.

Ich glaube Du solltest mal schnellstens vergessen, daß es in verschiedenen Programmiersprachen ein GOTO gibt.

C hat eine andere Programmlogik mit aufgerufenen Funktionen aus denen man am Ende, mit return() oder break() herauskommt. Da muß man nicht wie wild mit goto herumspringen.

Wenn Du mal bedingt durch ein Ergebnis in einer Funktion eine andere aufrufen willst dann mach das mit einem if.

Zeig deinen Sketch damit wir Dir konkret was erklähren bzw verbessern können.

Alles andere SIND QuatschFragen weil wir hier nur abstrakt um den heißen Brei herumreden.

Grüße Uwe