Variablendeklaration auslagern

Hi,

für mein aktuelles Programm brauche ich einen Sack voll Konstanten.
Ich finde es etwas unübersichtlich, die alle am Anfang des Sketches reinzuschreiben.

Jetzt habe ich in dem Sketch einen zweiten Tab mit den Variablendefinitionen eingefügt.
Hmm... das kann er nun wieder nicht kompilieren. Wohl weil er die Tabs der Reihe nach abarbeitet und da die Definitionen zu spät liest.

Ok. Dann hab ich mir gedacht, ich füg den zweiten Tab einfach am Anfang des Sketches mit include ein:

# include <Definitionen.ino>

Das versteht er zwar (hoffe ich, da kein Fehler beim Kompilieren). Aber die Variablen kennt er immer noch nicht.

Gibts da ne andere Möglichkeit, oder muss ich damit leben, meinen Hauptsketch so zu überladen?

Keine ino Datei! Das ist Arduino Kram. Was du willst ist ein ganz normaler C++ Header. Also Definitionen.h

Hi Serenifly,

muss ich mich da noch an irgendwelche Konventionen halten?

Ich habe die entsprechenden Teile aus dem Sketch direkt in die Definitionen.h kopiert. Aber es kommt immer noch "...was not declared in this scope". Wenn ich die Variable am Anfang des Sketches definiere, dann ist alle i.O.
Die Definionen.h ist im selben Verzeichnis wie der Sketch.

Da war ich etwas vorschnell. Ich habe das gerade mal probiert. Also mit Konstanten und Makros funktioniert es auf jeden Fall. Ich mache das die ganze Zeit schon mit const, #define und enums

Aber Variablen verhalten sich anders als Konstanten. Ein Header teilt nur mit, dass die Variable existiert (die Deklaration), aber sie wird in einer .cpp Datei definiert.

Der OOP Weg wäre eine Klasse mit static Variablen. Da hat man dann aber auch einen Bezeichner für den Zugriff vor der Variable. z.B. Global.var

Allerdings könnte das durch die Arduino Magie trotzdem mit einer .ino Datei funktionieren. Du musst nur das #include weglassen. Die IDE kopiert alle ino Dateien in eine .cpp Datei und kompiliert diese dann. Und zwar soweit ich das verstehe in alphabetischer Reihenfolge. Man müsste also wohl nur dafür sorgen, dass die ino Datei mit den globalen Variablen vor allen anderen steht.

Also, ich habe in der Def.h nur "#defines "
Da war ich vorhin etwas schlampig und hab öfters von Variablen gesprochen.

Wie soll ich das #include weglassen?
Nur <Definition.h> oder <Definition.ino> bringt den Compiler gleich zum "Heulen" --> error: expected unqualified-id before '<' token

Das mit der Alphabetischen Reihenfolge stimmt schon, allerdings nur für die "Neben-Inos" Die "Haupt-Ino" steht immer links im Tabfenster und wird wohl auch immer als erste betrachtet.

Edit:
Irgendwie hab ich das Gefühl, dass er den include-Befehl gar nicht ernst nimmt. Wenn ich eine "Fantasie-Datei" angebe, dann bringt er auch keinen Fehler.
Seltsam.....

Nochmal Edit:
Hab mal die ausführliche Ausgabe beim Compilen zugeschaltet. Kommt ne Warnung: "No such file or dierectory"
Die Definitions.h in den lib-ordner kopiert. Auch nicht besser.
Einen Unterordner mit lib/Definitions erstellt, die Datei da rein...et voila .... die Sch... geht.

Aber das war nicht mein Ziel. Das ganze Programm zerissen. Wollte es eigentlich übersichtlich gestalten. Der Schuss ging nach hinten los.

@Serenifly:

Also mit Konstanten und Makros funktioniert es auf jeden Fall. Ich mache das die ganze Zeit schon mit const, #define und enums

Wo legst du die Datei dann ab.

Ich meinte die gesamte Zeile. Also auch das <> dahinter.

Wenn du nur #defines hast wieso bekommst du dann eine Meldung bezüglich Scope? #defines sind keine Variablen, sondern lediglich Textersetzungen

Wenn du nur const Konstanten, enums oder #defines hast, dann verwende einen Header + #include

Aber wenn du das in eine .ino Datei packst wird diese durch die Arduino IDE automatisch mit dem Rest verwurschtelt. Also brauchst du sonst nichts mehr zu machen.

Ich habe da mal mit einer .ino Datei namens AGlobal.ino probiert. Und er scheint alles zu finden :slight_smile:
Ich habe 10 weitere .ino Dateien und die scheinen alle Variablen zu kennen die da drin stehen.

Also hast du zwei Optionen:
1.) Def.h und #include "Def.h"
<> ist übrigens eigentlich für System-Header. "" für Header im Sketch Ordner

2.) Eine Datei namens AGlobal.ino
Darin gehen dann auch richtige Variablen

Oder beides. Läuft auch bei mir so weit. Meine Konstanten lasse ich weiter an einer Stelle im Header

EDIT:
Moment, doch nicht so schnell. Wo er AGlobal.ino doch nicht zu finden scheint ist in der Haupt-ino Datei, wo setup() und loop() stehen :frowning:
Da bekomme ich dann auch einen Scope Fehler, obwohl die IDE (Visual Studio) die Variable findet. In den anderen .ino Dateien geht es aber.

Da wird dann das Arduino Getrickse nicht so wie gewollt funktionieren.

Bei mir funktioniert es aber, weil ich loop() minimal halte und praktisch alles in andere .ino Dateien ausgelagert habe, wo die globalen Variablen dann bekannt sind. In loop() werden fast nur Funktionen aufgerufen die in anderen Dateien stehen.

Uiiiii
Jetzt kapier ich gar nichts mehr :astonished:

#defines sind keine Variablen, sondern lediglich Textersetzungen

Ich machs momentan so:

#define Temp20 B00010100
      Serial.println (Temp20 >>2, BIN);

Die define-Anweisung am Sketchanfang. Das geht.
Die define-Anweisung in die Definitions.h im Sketch-Ordner geht nicht -> Temp20 was not declared in this scope.....
Die define-Anweisung in die Definitions.h im lib-Ordner geht wieder.

Ich hab nur eine Ino als Sketch.
Und frag mich, ob define das Richtige ist, oder gegen const getauscht werden sollte.

Kommando zurück:

Serenifly:
Also hast du zwei Optionen:
1.) Def.h und #include "Def.h"
<> ist übrigens eigentlich für System-Header. "" für Header im Sketch Ordner

#include "Def.h" damit gehts. Auch mit der Def.h-Datei im Sketch-Ordner

Def.h (mit Semikolon hinten dran oder auch nicht) geht aber nicht :frowning:
--> error: expected constructor, destructor, or type conversion before '.' token

Die define-Anweisung in die Definitions.h im Sketch-Ordner geht nicht -> Temp20 was not declared in this scope.....
Die define-Anweisung in die Definitions.h im lib-Ordner geht wieder.

Dann hast du vielleicht den Unterschied zwischen <> und "" nicht beachtet. Das ist Implementations-abhängig, aber allgemein sucht <> im Lib-Order und "" sucht zuerst im Sketch Order.

#define Temp20 B00010100
Serial.println (Temp20 >>2, BIN);

Und das kompiliert zu:

Serial.println (B00010100 >>2, BIN);

Weil der Prä-Prozessor vor dem Kompilieren Temp20 durch B00010100 ersetzt:

#define geht auf die Anfangstage von C zurück. Damals gab es noch kein const. Bei einzelnen Variablen ist heutzutage const in diesem Fall besser, da es typ-sicher ist. Es verhält sich wie eine Variable und wirft entsprechende Fehler wenn man es nicht richtig verwendet, aber der Compiler optimiert sie weg, da er weiß da sich nie ändert.

Geht aber so oder so. Und in Libraries ist #define immer noch Standard.

Def.h (mit Semikolon hinten dran oder auch nicht) geht aber nicht :frowning:
--> error: expected constructor, destructor, or type conversion before '.' token

Du arbeitest hier mit dem Prä-Prozessor. Nicht mit dem Kompiler. Deshalb die andere Syntax

OK,

danke. Wieder was gelernt. :slight_smile:

Na hoffentlich erinnere ich mich wieder, wenn ich es nochmal brauche ... LOL