Go Down

Topic: #define #include  (Read 950 times) previous topic - next topic

timomatrixer

Hallo User,
Meine Frage ist, wie kann ich eine Headerdatei (Deutsch.h) welche ausschließlich #define 's (Beispiel #define JA "JA") beinhaltet mit einer anderen (English.h) welche die gleichen #define (#define JA "YES") Bezeichnungen enthält im Programm ersetzen?

Ich habe im Programm folgende Funktion:
Code: [Select]

void setup() {
...
#include "English.h"
language();
}
void language() {
  do {
    if (button_trigger) {
      #include "English.h"
      Trig = 1;}
    If (button_trigger2) {
      #include "Deutsch.h"
      Trig = 1; }
  }while(Trig != 0)
}

Diese wird im Setup einmalig ausgeführt. Ich habe in der Funktion auch bereits eine serielle Ausgabe gemacht um zu überprüfen ob die richtigen Übersetzung für die Schlüsselwörter eingesetzt wurden. Funktioniert auch. Allerdings wenn die Funktion beendet ist und ich in der nächsten Funktion ein Schlüsselwort abfrage kommt die Übersetzung der falschen h-Datei. Zuerst wird laut dem Programm die English.h implementiert. Wenn aber durch die Button abfrage Deutsch.h included wird funktioniert das auch solange das program in der Funktioniert ist. Anschließend besitzen die Schlüsselwörter wieder die English Übersetzung. Aber warum? Muss ich extra ne Klasse machen mit .cpp Datei ect?

Über hilfreiche Antworten würde ich mich sehr freuen.

uxomm

#include und #define sind Anweisungen für den Preprozessor und werden nur beim Kompilieren ausgeführt.
Du kannst das also nicht von einer "Tasterabfrage" abhängig machen (die wird ja erst zur Laufzeit gemacht).
Always decouple electronic circuitry.

timomatrixer

Hab ich noch nicht ganz verstanden. Wie kann ich das denn alternativ gestalten?  Die Marlin.ino arbeitet doch auch so ähnlich oder nicht? Würde mich freuen wenn du mich aufklären könntest wie man das realisiert.

michael_x

#3
Feb 07, 2017, 08:55 am Last Edit: Feb 07, 2017, 08:58 am by michael_x
Quote
Die Marlin.ino arbeitet doch auch so ähnlich oder nicht?
Sicher nicht.
Wenn du während des setup umschalten willst, müssen doch beide Text im Flash sein.
Also müsstest du beide Texte irgendwie gleichzeitig in den Sketch bekommen.

Wenn du allerdings per #define und #ifdef während des Kompilieren umschaltest, musst du natürlich zur Sprachumschaltung neu Übersetzen und Hochladen.

Marlin, die 3D-Drucker Firmware, hab ich mir jetzt nicht angeschaut.

timomatrixer

#4
Feb 07, 2017, 09:00 am Last Edit: Feb 07, 2017, 09:23 am by timomatrixer
Ah ich verstehe. Ok. Also es muss auf dem arduino bereits beides zur Verfügung stehen und im .h File dann über ne if Direktive auswählen was genutzt werden soll. Hab ich das richtig verstanden? Danke für die freundlichen Antworten bis hierhin.

Sorry. Marlin ist oft der Programmcode von 3d Druckern.

Tommy56

Schreibe doch beide Wortlisten in ein Array z.B.
Code: [Select]

// Die Worte in beiden Sprachen die 5 ist die Maximallänge+1
const char *worte[][5] = {"Ja","NEIN","TEST", "YES", "NO", "TEST"};
// offset für die Sprachwahl = Anzahl der Worte / 2  (hier 3)
const byte offset = 3;
#define DE 0
#define EN 1

// wortNummer nummer des Wortes in der 1. Sprache, Sprache 0 (Default) oder 1
const char *holeWort(const byte wortNummer, const byte sprache = 0) {
  return worte[0][wortNummer + sprache * offset];
}

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  Serial.println(holeWort(0,DE));
  Serial.println(holeWort(0,EN));
 
}

void loop() {
 
}

Dann kannst Du jeweils die Sprache auswählen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

timomatrixer

Finde ich gut die idee. Aber nutze ich dadurch nicht viel mehr Speicherkapazität? Wollte ja ziemlich schlank bleiben ^^

Serenifly

Wenn du RAM sparen willst, verwende PROGMEM. Dann brauchst du nur ein Array das Platz für den längsten String hat. Und man kopiert nur jeweils den aktuellen String aus dem Flash ins RAM.

combie

Quote
Aber nutze ich dadurch nicht viel mehr Speicherkapazität?
Willst du Worte ausgeben?
Dann musst du sie irgendwo speichern!

Gibt es dazu irgendeine Alternative?
Nein!

Dann dreht es sich nur noch darum WO die Daten/Worte zu speichern sind.
Es bieten sich an:
Flash
EEPROM

Alles andere wäre extern.
z.B. das EEPROM auf der RTC
SD Karte
und viele weitere, welche sich über I2C oder SPI ansprechen lassen.
Ein schwarzes Schaf, zur rechten Zeit, erspart den Streit, bringt Einigkeit.

timomatrixer

Ja sauber. Vielen Dank. Gute infos.

Go Up