Forum: Mikrocontroller und Digitale Elektronik #define übergreifend problem


von Alex R. (itaxel)


Lesenswert?

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
test t;
6
7
void setup() {
8
  Serial.begin(9600);
9
  t.showWert();
10
}
11
12
void loop () {
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
class test {
13
  public:
14
    test(void);
15
    void showWert(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
void test::showWert(void) {
13
  Serial.println(wert);
14
}




var1.h
1
static const int PROGMEM wert = 123;


var2.h
1
static const int PROGMEM wert = 456;

gibt es vielleicht noch eine andere möglichkeit?

Gruß Alex

von Bernd K. (prof7bit)


Lesenswert?

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.

von Ulrich F. (Gast)


Lesenswert?

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!

von Bernd K. (prof7bit)


Lesenswert?

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.

von Ulrich F. (Gast)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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?

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

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".

von Alex R. (itaxel)


Lesenswert?

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
test t;
5
6
int main(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 
:)

von Ulrich F. (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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
> #define ARIAL  // 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.

von Karl H. (kbuchegg)


Lesenswert?

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
> #define ARIAL  // auswahl der Arial.h
2
> #include "test.h"
3
> 
4
> test t;
5
> 
6
> int main(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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.