Organisation von viel Code

Moin,

FunkyClouds ist mittlerweile ueber 50kB gross und wird langsam aber sicher unuebersichtlich, weil alles in einer einzigen Datei drinsteht. Ist ja schoen, alles zusammen zu haben, falls man mal schnell nachsehen moechte, was eine Funtion konkret tut, aber ohne Textsuche findet man fast nichts mehr.

Ich dachte mir, es waere sinnvoll, das in einzelne Dateien zu zerlegen: Farbmanagement, Oszillatoren, Emitter, Bildbearbeitung, Audiozeugs, Rauschfunktionen, Anwendungsbeispiele...

Wie mache ich das am einfachsten? Zerlegen, mit include wieder einbinden und fertig?

Das ganze Thema Librarys schreiben riecht mit momentan zu komplex und zeitaufwaendig, so dass ich mich gern weiterhin davor druecken wuerde...

Wie organisiert man ein groesseres Softwareprojekt moeglichst frustarm?

Erschwerend kommt hinzu, dass ich reisebedingt oft auf anderen Rechnern mit verschiedenen OS arbeite, weshalb ich bisher bei meiner Hassliebe ArduinoIDE als kleinstem gemeinsamen Nenner auf allen Systemen haengengeblieben bin.

Gruesse

Helmuth

Auch in der IDE kannst Du einfach den Code über mehrere Dateien splitten. Benenne einfach die Dateien *.cpp, die Header *.h und include diese (sollten im selben Verzeichnis sein, wie der Sketch *.ino). Du kannst auch gleich die *.cpp includen, das sollte aber normalerweise nicht notwendig sein (dann hättest Du nach dem Präprozessor wieder die riesige Datei).

Kann es zwar gerade nicht testen, aber kann man sich in der IDE nicht einfach mehrere Tabs/Reiter anlegen und den Code dorthin verschieben? Dürfte dann auch ohne Include funktionieren.

Ja. Der Nachteil ist dass die Tabs alphabetisch sortiert werden bevor sie von der IDE in eine .cpp Datei gewandelt werden. Das kann Probleme mit der Sichtbarkeit von globalen Variablen geben.

Was ich da gemacht habe ist ein Tab namens "aGlobal" zu erstellen und dort alle reinzupacken. Die sind dann überall sichtbar

Hallo,

könnt Ihr das bitte etwas genauer erklären? Was gehört in ein neues Tab? Kopiert man eine Funktion dort rein und die IDE macht daraus eine Library?

Nein. Keine Library. Eine Library ist eine Klasse. C++ zwingt einem aber nicht in einem bestimmten Stil zu programmieren und man muss nicht gleich für alles Klassen anlegen.

Die IDE kopiert einfach alle Tabs in alphabetischer Reihenfolge in eine .cpp Datei (und fügt noch den ganzen Arduino Code im Hintergrund ein). Für den Compiler sieht dass dann so aus als ob man alles in einer Datei geschrieben hätte.

Hallo,

man kann also zum Bsp. alle erfolgreich geschriebenen/getesteten Funktionen in ein Tab names "Funktionen" auslagern und das war's? Beim Sketch speichern werden alle Tabs darin mit gespeichert und sind beim öffnen wieder da?

Verschiedene Tabs sind verschiedene .ino Dateien.

Der Unterschied zu .cpp Dateien ist, dass globale Variablen und Funktionen in allen .ino Dateien bekannt sind. Das macht die IDE für dich. Hast also in einem Tab dein loop() und kannst dort Funktionen aufrufen, die in einem andern Tab stehen.

Funktionen ja. Die sind durch die von der IDE automatisch erzeugten Funktionsprototypen überall bekannt.

Das gilt aber nicht für Variablen! Sowie ich es verstehe werden die .ino Dateien vor dem Compilieren in alphabetischer Reihenfolge zu einer .cpp Datei zusammengefügt. Das kann dann dazu führen dass Variablen die weiter unten deklariert sind nicht oben sichtbar sind.
Ich hatte damit jedenfalls Probleme. Nachdem ich globale Variable die wirklich in mehreren anderen Dateien sichtbar sein müssen in eine .ino Datei die mit "a" anfängt platziert habe geht alles. Wenn eine globale Variable natürlich nur in ihrer eigenen .ino Datei gebraucht wird kann sie auch dort bleiben.

Nein. Keine Library. Eine Library ist eine Klasse.

Eine Library ist häufig als Klasse organisiert, das muss aber nicht so sein. Du kannst auch eine Bibliothek mit häufig benötigten Funktionen anlegen und diese identisch wie eine Bibliothek mit einer darin enthaltenen Klasse in einem Verzeichnis im "libraries"-Folder im Sketchbook vorhalten. Was in der Arduino IDE eine Bibliothek oder eine sonstige Quellcode-Datei ist, hängt eigentlich nur damit zusammen, wie die IDE diese Datei findet. und unter Umständen, in welcher Reihenfolge sie eingebunden werden.

Ok, wenn man es genau nimmt :slight_smile: Die meisten sind aber schon Klassen. Oder auch Ansammlungen von Klassen (sdFat hat z.B. eine sehr komplexe Struktur und hat teils voneinander unabhängige Module).

Streaming ist ein Beispiel für eine Library ohne Klasse:
http://arduiniana.org/libraries/streaming/
Das ist nur ein Header mit inline Funktionen (+ ein paar structs und enums)

Die Verwendung von Tabs klingt nach der Loesung meines Problems, solange ich im alphabetisch ersten Tab alle globalen Variablen drin habe.

Mal noch eine bloede Frage: Ab welcher Versionsnummer sind die Tabs dabei? Kann bei 1.0.5 nichts dergleichen finden. Oder bin ich gerade ortsblind?

Ich habe noch im Hinterkopf, dass es nach dem Erscheinen immer hiess, v1.5 sei voller Bugs und Probleme, habe mich seit dem nie wieder mit dem Thema beschaeftigt. Welche Version benutzt ihr?

Moin Helmuth,
arduino 1.0.5: rechts oberhalb des Editor-Bereiches auf das Dreieck klicken, neuer Tab auswählen.
Dann den Namen angeben.

Gruss
Kurti

Also doch ortsblind...

Danke!

Also ich bin mit mit 1.5.7. BETA zufrieden. Da mögen Bugs drin sein, aber man hat auch substantielle Verbesserungen gemacht:

z.B.:

  • Upgraded AVR toolchain: gcc 4.8.1, avr-libc 1.8.0
    *avr: HardwareSerial support for different size of TX and RX buffer sizes (Jan Baeyens)
  • avr: Pile of HardwareSerial improvements (Matthijs Kooijman)

Gerade der erste Punkt ist ein riesiges Plus. Die vorherigen Versionen der Compiler und der avr libc waren antik. Letztere hatte einige Bugs.
Durch das Compiler Update kann man wenn man die platform.txt anpasst jetzt C+11 verwenden. Was da z.B. interessant ist sind "range based for loops", in manchen anderen Sprachen als "for each" bekannt.

Bei Serial gibt es einen Haufen Verbesserungen bezüglich Performance, Bugs und Konfigurationsoptionen. Es ist also nicht so dass 1.0.5. frei von Bugs ist! Im Gegenteil.

In der IDE gibt es auch zig Änderungen im Hintergrund. Oder auch offensichtliche Dinge wie Zeilennummern.

Hallo,

ich habe mal sämtliche Funktionen die ich unterhalb der Loop stehen habe, in ein extra Tab verschoben mit Namen "z_Funktionen.ino". Hauptsketch fängt mit "SD..." an. Kompiliert ohne Fehler. Dann habe ich den Namen in "a_Funktionen.ino" unbenannt. Kompiliert immer noch ohne Fehler. Es gibt also nur das Namensproblem, wenn ich alle globalen Variablen auslagere, die man vor setup() überlicherweise stehen hat?

Weißt du was Funktionsprototypen sind?

Normalerweise musst du von jeder Funktionen bevor man sie verwendet einen Prototyp erstellen. Dann ist die Signatur bekannt und man kann die Funktion auch verwenden bevor sie implementiert wurde.

Das übernimmt die IDE für dich automatisch im Hintergrund. Deshalb kann man Funktionen überall verwenden, egal wo sie stehen.

Hallo,

ja das weis ich. Deshalb schreibe ich keine Prototypen in der IDE. In dem Moment hatte ich daran aber nicht gedacht.