Frage zum Thema Modul

Hallo an die Experten,
ich habe ein grösseres Programm, das ich in einzelne Module aufteilen will. Mein Programm habe ich jetzt sehr sehr stark vereinfacht für das Forum.
Ich habe ein Hauptprogramm (hier halt das setup). Vorher definiere ich in einer H-Datei die globalen Variablen. Dann noch eine h und cpp datei, die ich funki nenne. In der h Datei deklariere ich die Funktion, in die cpp-Datei schreibe ich rein, was die Funktion machen soll. Weise ich im setup der Variablen einen neuen Wert zu (i=2), kommt was von multiple defintion und da steige ich gedanklich aus, weil ich die Definition in globals gemacht habe. Was mache ich falsch.
Ich hoffe, dass dies mein Problem in dem grösseren Programm ist.
danke für die Antwort.

#include "globals.h"
#include "funki.h"


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

 funki_funk();
 i = 2;
 funki_funk();
 
}

void loop() {
  // put your main code here, to run repeatedly:

}

hier globals.h

 int i = 1;

hier funki.h

void funki_funk();

hier funki.cpp

#include <arduino.h>
#include "globals.h"
#include "funki.h"

void funki_funk(){
  Serial.println(i);
}

Wo ist die globals.h?
Hat die auch keinen Schutz gegen mehrfaches Einfügen wie die funki.h?

Gruß Tommy

gobals.h ist die zweite Datei. Die ist sehr klein, nur eine zeile.

Ja und die wird 2 Mal eingefügt. In der ino und der cpp.

Mach Dich mal schlau über "Include-Guard".

Gruß Tommy

[color=#bc7a00]#pragma once? ist das die lösung. Tut mir leid ich habs nicht gesehen weil ich noch zu neu bin. Wird gleich probiert,
danke[/color]

Ein include guard dürfte hier nichts helfen, da das für die .ino und die .cpp 2 getrennte Übersetzungsläufe sind. Ein include Guard hilft nur gegen mehrfaches includieren innerhalb eines Übersetzungslaufes.
Das Problem entsteht beim linken, da bei beiden Übersetzungsläufen eine Variable i angelegt wird. In der globals.h darf i nur deklariert werden (mit 'extern'). Angelegt werden darf die Variable dann nur entweder in der .ino oder der .cpp

Edit: unanhängig dabon ist ein include Guard immer eine gute Idee - speziell bei vielen Headerdateien, die selbst auch wieder Headerdateien includieren.

Da hast Du Recht mit extern, wobei man den Include-Guard trotzdem nicht vergessen sollte, sonst klemmt es woanders.

Gruß Tommy

langsam ich muss das alles erst probieren, ich bin schon etwas älter. jeder tip bringt mich etwas weiter. nur meine verdauungsgeschwindigkeit ist altermäßig begrenzt.

Du kannst übrigens Dein Programm auch auf mehrere ino-Dateien im Verzeichnis aufteilen. Die Haupt-Datei muss weiterhin so heißen, wie das Verzeichnis, die anderen kannst Du beliebig benennen, sinnvollerweise nach ihrem Inhalt.

Was das Alter betrifft, sind hier wohl viele älter, als Du.

Gruß Tommy

danke das mit dem extern hat funktioniert. wieder ein stück schlauer.
alle anderen tipps waren auch wichtig. alter, auch wenn nicht wichtig: c++ mit 58 anfangen und arduino noch dazu ist lustig. ich will nicht irgendwelchen code kopieren und dann nicht wissen, warum etwas nicht funktioniert. ich komme von fortran und das war 1985. aber das forum hier ist echt klasse. immer eine antwort oder tip und das sofort, hätt ich nie gedacht.
danke nochmal

lucianbetke:
... mit 58 anfangen ...

Junger Hupfer :slight_smile:

lucianbetke:
mit 58 anfangen

Jungspund :wink:

Gruß Tommy

Ich sage immer "Man ist so alt, wie man sich fühlt!" Also heute Abend bin ich über 90 :wink:
Falls die 56 bei Tommy auf das Baujahr anspielen, dann habe ich bis zu dem Alter noch 18 Jahre Zeit...

Gruß, Jürgen

Sie sind das Auslieferungsjahr :wink:

Gruß Tommy

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.