Hallo zusammen,
ich habe das Problem, dass ich in meinem programm ein wert definiere und
dieser in einer includierten datei übernehmen soll bzw. eine abfrage
statt finden soll. Dieser wert soll dann über eine funktion abgerufen
werden.
Mit diesem #define möchte ich festlegen welchen header includiert werden
soll.
meinTest.ino
1
#define WERT_1
2
3
#include"test.h"
4
5
testt;
6
7
voidsetup(){
8
Serial.begin(9600);
9
t.showWert();
10
}
11
12
voidloop(){
13
14
}
test.h
1
#ifndef _TEST_H_
2
#define _TEST_H_
3
4
#if defined WERT_1
5
#include"var1.h"
6
#endif
7
8
#if defined WERT_2
9
#include"var2.h"
10
#endif
11
12
classtest{
13
public:
14
test(void);
15
voidshowWert(void);
16
private:
17
};
18
19
#endif
var1 oder var2 wird nicht geladen.
test.cpp
1
#if ARDUINO >= 100
2
#include"Arduino.h"
3
#else
4
#include"WProgram.h"
5
#endif
6
7
#include"test.h"
8
9
test::test(void){
10
}
11
12
voidtest::showWert(void){
13
Serial.println(wert);
14
}
var1.h
1
staticconstintPROGMEMwert=123;
var2.h
1
staticconstintPROGMEMwert=456;
gibt es vielleicht noch eine andere möglichkeit?
Gruß Alex
Hör mit dem .ino Zeugs auf.
Der Murks zerpflückt und verwürfelt Dein Programm auf nicht
vorhersehbare Weise so daß Du Dich nicht mehr auf die
Include-Reihenfolge (oder überhaupt irgendwas) verlassen kannst.
Schreib Dein Programm in C und wenn das nicht reicht dann nimm C++, aber
vor allen Dingen lass die Arduino-IDE mit ihren undurchsichtigen und
verwirrenden Eigenmächtigkeiten weg und nimm richtiges Werkzeug welches
genau das und nur das tut was Du ihm sagst.
Klar.. da ist mal wieder das Killerwort Arduino gefallen und schon wird
darauf rum gehackt...
Dabei tritt dieser Fehler in jeder Umgebung auf!
Wenn test.cpp kompiliert wird, wird findet ein include von test.h statt.
Bei diesem Vorgang wird #define WERT_1 nicht gesehen, da er ja in der
*.ino steht.
Klarer:
Wird die *.ino kompiliert wird der Wert gesehen.
Wird die *.cpp kompiliert gibt es den Wert nicht.
Und das hat nichts mit Arduino zu tun.
Bernd K. schrieb:> Der Murks zerpflückt und verwürfelt Dein Programm auf nicht> vorhersehbare Weise so daß Du Dich nicht mehr auf die> Include-Reihenfolge (oder überhaupt irgendwas) verlassen kannst.
Doch das ist nachvollziehbar.
Mann muss nur wollen!
Ulrich F. schrieb:> Wenn test.cpp kompiliert wird, wird findet ein include von test.h statt.
Normalerweise übergibt man solcherlei defines an der gcc Kommandozeile
mit der -D Option. Also trag das in den Projekteinstellungen der IDE
ein.
Bernd K. schrieb:> Also trag das in den Projekteinstellungen der IDE> ein.
Leider hat die Arduino IDE sowas nicht. Und auch kein make File.
Die Alternative wäre vielleicht eine eigene boards.txt/plattform.txt
anzulegen, und es dort einzutragen.
Oder eine config.h, mit dem define, anzulegen.
Dann in *.ino und in test.h ein include config.h machen.
Ulrich F. schrieb:> Bernd K. schrieb:>> Also trag das in den Projekteinstellungen der IDE>> ein.>> Leider hat die Arduino IDE sowas nicht.
Ja, genau solche Sachen meine ich. Was gibt es denn überhaupt für einen
Grund so verzweifelt an diesem unvollkommenen Spielzeug festzuhalten und
an allen Ecken umständliche Verrenkungen anzustellen wenn es doch alles
nur komplizierter statt einfacher macht?
Bernd K. schrieb:> Ja, genau solche Sachen meine ich. Was gibt es denn überhaupt für einen> Grund so verzweifelt an diesem unvollkommenen Spielzeug festzuhalten und> an allen Ecken umständliche Verrenkungen anzustellen wenn es doch alles> nur komplizierter statt einfacher macht?
Ich glaube mal, dass du bei deiner Einstellung wirklich auf den Einsatz
der Arduino IDE verzichten solltest.
Viel zuviel Aufregung für dich.... und für mich...
Nutze die IDE deiner Wahl und lass die Arduino Probleme, den Arduino
Nutzern.
Betrachte es als das, was es ist, als PAL, als "Problem anderer Leute".
Vielen Dank Ulrich für deine Tipps.
Hab das ganze jetzt im ATMEL Studio gemacht um unnötige, nichtsnutzige
Beiträge und Diskussionen zu vermeiden!!!
Wieder zurück zum Thema...
Vielleicht gibt es ja auch eine andere Lösung?
Mein vorhaben ist, eine Lib für ein Display zu programmieren und der
User soll die möglichkeit haben anhand des setzens eines #define eine
Schriftart auszuwählen. Die Schriftarten sind als einzelne header-Files
vorhanden.
z.B.
1
#define ARIAL // auswahl der Arial.h
2
#include"test.h"
3
4
testt;
5
6
intmain(void)
7
{
8
while(1)
9
{
10
11
}
12
}
Vielleicht hab ich auch einen falschen Ansatz. Sitze schon so lange
davor, dass ich wahrscheinlich den Wald vor lauter Bäume nicht mehr sehe
:)
Alex R. schrieb:> Die Schriftarten sind als einzelne header-Files> vorhanden.
Ich glaube da steckt der erste Fehler.
Daten sollen nicht in *.h stecken, sondern in *.c oder *.cpp Dateien
(auch wenn es technisch möglich ist)
Vorschlag:
Für jeden Font, machst du eine *.h und eine *.cpp Datei.
In der *.h deklarierst du das Fontarray als extern.
In der *.cpp definierst du das Datenarray.
Der Bezeichner aller dieser Fontarrays sollen gleich sein.
z.B. einfach nur font
Und der User, was hier wohl Programmierer bedeuten soll, macht in seinem
Hauptprogramm:
#include "arial.h"
Fertig!
User Fehler 1: Vergessen den Font einzubinden
Der Linker schreit, weil er die Array Referenzen nicht auflösen kann
User Fehler 2: Der User bindet 2 Fonts ein
Der Linker schreit, weil 2 gleich lautende Arrays vorhanden sind.
Alex R. schrieb:> Mein vorhaben ist, eine Lib für ein Display zu programmieren und der> User soll die möglichkeit haben anhand des setzens eines #define eine> Schriftart auszuwählen. Die Schriftarten sind als einzelne header-Files> vorhanden.
[obligatorisch]
Erstmal brauchst du ein Buch, und/oder ein Tutorial, anhand derer Du die
Grundlagen lernst.
[/obligatorisch]
>
1
>#defineARIAL// auswahl der Arial.h
2
>#include"test.h"
3
>
Wenn das Setzen eines Präprozessor-Defines etwas bewirken soll, dann
muss es natürlich auch abgefragt werden. Zum Beispiel so:
1
#define ARIAL // auswahl der Arial.h
2
3
#ifdef ARIAL
4
#include"arial.h"
5
#endif
Wenn der Benutzer aber sowieso den Sourcecode ändern muss, dann kann er
auch einfach gleich die #include Zeile anpassen.
Alex R. schrieb:> Mein vorhaben ist, eine Lib für ein Display zu programmieren und der> User soll die möglichkeit haben anhand des setzens eines #define eine> Schriftart auszuwählen. Die Schriftarten sind als einzelne header-Files> vorhanden.>> z.B.>
1
>#defineARIAL// auswahl der Arial.h
2
>#include"test.h"
3
>
4
>testt;
5
>
6
>intmain(void)
7
>
das kann aber so nicht funktionieren.
Denn der #define steht hier zwar zur Verfügung, wenn test.h inkludiert
wird. Von daher wäre das in Ordnung.
Wo er aber nicht zur Verfügung steht, das ist wenn test.cpp compiliert
wird. Jedes cpp File wird für sich selbst und unabhängig von allen
anderen compiliert. Was in dieser main.cpp an #define enthalten ist,
interessiert den Compiler nicht die Bohne wenn er test.cpp compiliert.
Der Compiler sucht sich nicht aus allen am Verzeichnis vorliegenden cpp
Files das zusammen, was er gerade braucht. Ein cpp File - ein unabhängig
von allen anderen durchgeführter Compiliervorgang.
Entweder du machst ein H-File, das zwangsweise von allen CPP Files
inkludiert werden muss. zb ein config.h oder du gibst die Option in dein
makefile bzw. in die korrespondieren Variante in deiner IDE auf dass so
sichergestellt ist, dass dem Compiler immer das entsprechende #define
von aussen vorgegeben ist.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.