Go Down

Topic: Richtig Deklarationen und Code spliten  (Read 1 time) previous topic - next topic

Muecke

Nov 19, 2017, 10:07 am Last Edit: Nov 19, 2017, 10:17 am by Muecke
Hallo miteinander,

ich möchte meinen Code etwas aufräumen :-) und dazu habe ich mir überlegt den Code in verschiedene Dateien zu packen.

dabei habe ich schon gelernt das in eine .ino Datei meine Haupt Programm steht.
In .h Dateien sind immer nur Deklarationen und im .cpp Dateien sind dann die Funktionen die ich in der .h richtig Deklariert habe.

Da ich davon noch keinen Plan habe habe ich mir ein Kleines Test Programm erstellt.

Man kann dem Arduino einfach einen JOB nennen und er schreibt dann etwas auf dem Seriellen Monitor.

Das habe ich alles in eine .ino Datei gepackt.
Da Funktioniert mein Code auch ohne Probleme.

Dann habe ich mir überlegt welche Dateien möchte ich für mein Aufräumen haben.
und habe diese erst ein mal angelegt und per include eingebunden.

Dann bin ich hin und wollte eins (Funktionen) nach dem anderen verschieben und da kamen dann die Probleme, die IDE Deklariert die Funktionen nicht mehr selbst :-(

Also bin ich hin und habe die erste ziele der Funktion in die .h Datei geschrieben das hat aber nichts gebracht :-(  

Irgend wie verstehe ich das nicht wie ich das machen muss, gibt es etwas das ich nachlesen kann sagen wir mal Deklarationen von Funktionen für Sau doofe?



Gruß Mücke


das ist mein Code alles in einer Datei:
Code: [Select]
/* Deklarieren.ino
 *
 * Übungsprogramm um Code auslagern und richtig zu Deklarieren
 *
 */

// Deklarationen
  #include "Funktion.h"                         // Deklarationen der Funkzionen
  #include "Job.h"                              // Deklarationen der Funkzionen

// Funktion etc.
  #include "Funktion.cpp"                       // Deklarationen der Definitionen  
  #include "Job.cpp"                            // Deklarationen der Definitionen  


  #define Baudrate 9600                         // Geschwindigkeit, Serielle Schnittstelle
  
void setup()
{
  Serial.begin(Baudrate);                       // Seriellen Monitor Installiren
}

void loop()
{
  delay(10);                                    // warten für eine Sekunde
  Serielle_abfrage();                           // abfrage der Seiellen schnittstelle und Job aufrufen
}



/* ***********************************************************************************************
 * ***********************************************************************************************
 * Das soll alles in die Datei Funktion.cpp
 * ***********************************************************************************************
 * ***********************************************************************************************
 */


/* ***********************************************************************************************
 *                            FunktionSerielle Schnittstelle auslesen
 * ***********************************************************************************************/
 #define ZEILENTRENNZEICHEN 10
  
  char* receiveBuffer()
  {
    static char lineBuffer[35];
    static byte counter = 0;
    char c;
      if (Serial.available() == 0) return NULL;
      if (counter == 0) memset(lineBuffer, 0, sizeof(lineBuffer));
    c = Serial.read();
      if (c == ZEILENTRENNZEICHEN)
      {
        counter=0;
        return lineBuffer;
      }
      else if (c>=40)
      {
        lineBuffer[counter] = c;
        if (counter < sizeof(lineBuffer) - 2) counter++;
      }
    return NULL;
  }

/* ***********************************************************************************************
 *                            Funktion Serielle Schnittstelle Abfragen
 * ***********************************************************************************************/
void Serielle_abfrage()
{
  
   char* text=receiveBuffer();
     if(text != NULL)
     {
             if (strcmp_P(text, PSTR("Test"))==0)          { Job_Test(); }           // Ausgabe TEST
        else if (strncmp_P(text, PSTR("Print"), 5)==0)     { Job_Print(text + 6); }  // Ausgabe alles was Hinter Print: kommt
        else  { Serial.println(F("NOK, Unbekannter Job"));}
     } // if text
    
} // Serielle_abfrage



/* ***********************************************************************************************
 * ***********************************************************************************************
 * Das soll alles in die Datei Job.cpp
 * ***********************************************************************************************
 * ***********************************************************************************************/


/* ***********************************************************************************************
 *                            Job: Test
 * ***********************************************************************************************/
void Job_Test()
{
   Serial.println(F("OK, TEST"));
}

/* ***********************************************************************************************
 *                            Job: Print
 * ***********************************************************************************************/
void Job_Print(String str)
{
   Serial.print(F("Übergeben wurde: "));
   Serial.println(str);
}
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

combie

Code: [Select]
// Funktion etc.
  #include "Funktion.cpp"                       // Deklarationen der Definitionen 
  #include "Job.cpp"                            // Deklarationen der Definitionen 


Das lass weg!
Die IDE kompiliert automatisch die cpp Dateien.
Und der Linker bindet sie ein.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Muecke

Code: [Select]
// Funktion etc.
  #include "Funktion.cpp"                       // Deklarationen der Definitionen 
  #include "Job.cpp"                            // Deklarationen der Definitionen 


Das lass weg!
Die IDE kompiliert automatisch die cpp Dateien.
Und der Linker bindet sie ein.
Wenn ich das richtig verstanden habe?
eine CPP Datei die in einem Tab schon mit Offen ist muss ich nicht per include einbinden?
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Muecke

Ich komme mit der CPP Datei nicht zurecht.

ich habe das
Code: [Select]
// Funktion etc.
  #include "Funktion.cpp"                       // Deklarationen der Definitionen
  #include "Job.cpp"                            // Deklarationen der Definitionen 


aus dem Code gelöscht.

Dann habe ich den Teil
Code: [Select]
/* ***********************************************************************************************
 *                            Job: Test
 * ***********************************************************************************************/
void Job_Test()
{
   Serial.println(F("OK, TEST"));
}

genommen und in die Datei Job.cpp gepackt.
in der Datei Job.h habe ich hinein geschrieben
Code: [Select]
void Job_Test()
{ }


Dann bekomme ich beim Koppeliren den Fehler:
Quote
sketch/Job.cpp: In function 'void Job_Test()':
Job.cpp:6: error: 'Serial' was not declared in this scope
    Serial.println(F("OK, TEST"));
    ^
Job.cpp:6: error: 'F' was not declared in this scope
    Serial.println(F("OK, TEST"));
                               ^
exit status 1
'Serial' was not declared in this scope
Wenn ich jedoch meinen Code anstelle in die .cpp Datei ihn in die .h Datei packe dann funktioniert mein Programm wider, doch das ist nicht sinn und Zweck des ganzem.

Warum mag er auf einmal Serial und F nicht mehr?
An was denke ich nicht? was wies ich nicht? wo mache ich den Fehler?


gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

guntherb

wenn es dir nur darum geht, deinen Code in Dateien zu gliedern, kannst du auch in der IDE verschiedene Tabs aufmachen, von denen jeder für sich in einer Datei abgelegt wird.
Grüße
Gunther

combie

#5
Nov 19, 2017, 10:39 am Last Edit: Nov 19, 2017, 12:17 pm by combie
Hier mein Vorschlag (im Anhang)

Edit: Update/korrektur
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Muecke

@guntherb du hast alles in ino Dateien gepackt, muss ich dann die Dinge nicht Deklarieren macht das die IDE dann wider?

Erlich gesagt geht es mir darum eine Besser  Übersicht in meinen Code zu bekommen.
ich suche mir immer einen Wolf der eigentliche Code mit dem ich arbeite ich in zwischen ein paar Seiten lang.


Das andere ist das ich bei kleinen Fehlern immer sehe lange nach Lösungen suchen muss, daher würde ich es auch gerne etwas verstehen was ich da mache. Wobei ich das ganze nicht Studien möchte und auch nicht der Ultimative Programmierer werden möchte und muss.


@combie: Wow, das dauert etwas bis ich das alles durch geschaut habe, und alles nachgeschlagen habe was da neu für mich ist.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Serenifly

.cpp Dateien muss man nicht mit #include einbinden. Das ist für Header. Was in der .cpp Datei steht wird dann praktisch automatisch gefunden

Muecke

Also für das mit der richtigen auslagern ist doch etwas (Deutlich) komplexer wie ich angenommen habe
.
Arrr...

da werde ich wohl doch auf mehrere .ino Dateien zurück greifen wie von @Gunther vorgeschlagen. das ist bei meinen Fähigkeiten der deutlich bessere Ansatz, irgend wann die Ziellinie zu sehen ;-).

da jedoch die ino Dateien einfach mit eingebunden werden ohne das ich was tun muss, komme ich mit dem Include Befehl jetzt nicht mehr so richtig klar in meinem Kopf.

Angenommen ich möchte einfach einen Bestimmten Code da es sehr viel ist wo anders hin schieben um Ihn dann per Include an einer bestimmten Stelle im Code aufzurufen.
Welche Endung muss dann die Datei haben? 


Als Beispiel nehme ich einfach mal die PIN Belegung, sagen wir ich habe 50 LED`s die ich an Pins belegen möchte, Ja sehr unwahrscheinlich ist mir jetzt aber erst mal egal.

Dann würde das bei mir so aussehen:

Code: [Select]

.....

int ledPin1 = 3;
int ledPin2 = 4;
... usw. so das hier 50 Stück stehen.

void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
... usw. so das hier 50 Stück stehen.
}

...


Jetzt kommt mir bitte nicht das ich das in eine For schleife packen könnte ;-)


An genommen ich möchte in eine Separate Datei den teil
Code: [Select]
...
int ledPin1 = 3;
...

Packen damit das im Programm etwas Ordentlicher ausschaut.


Sprich so:
Code: [Select]

.....

#include "LED_PIN_Nummern.???"

void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
... usw. so das hier 50 Stück stehen.
}

...


Die Datei "LED_PIN_Nummern.???" würde dann so ausschauen:
Code: [Select]

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
... usw. so das hier 50 Stück stehen.


Welche Endung gebe ich der Include Datei?
muss ich dann alles was darin ist irgend wie Deklarieren?
oder kann ich der IDE sagen das der teil beim Koppeliren einfach dort eingefügt werden soll, und ich das Include nur für das Übersichtlichere Darstellen für mich da stehen habe?


Mir verwirrt das irgend wie das die ino und die CPP Dateien von alleine eingebunden werden.


gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

combie

#9
Nov 19, 2017, 08:40 pm Last Edit: Nov 19, 2017, 08:44 pm by combie
Quote
Mir verwirrt das irgend wie das die ino und die CPP Dateien von alleine eingebunden werden.
Das sind 2 völlig unterschiedliche Verfahren.

Alles in *.ino, damit bist du auf einem propitären Ast.
Welcher auch einige Fallstricke bereit hält.
(warte es nur ab!)

Mein Weg ist der C++ Weg.
Der C++ Welt weit akzeptierte Standard Weg.
(zumindest dicht dran)

Stell dir nur mal vor, du würdest dich mal in das einarbeiten, was du da tust, und plötzlich verstehst du die verrücktesten Programme. Kannst dich mit ALLEN Programmieren weltweit austauschen.
Wäre das nicht wunderbar?
Mich würde erfreuen, wenn du da mal hin kommst!

Und nein, du kannst das Internet nicht leer lesen.
Du muss nichts für andere übrig lassen.



Tipp:
Irgendwo, in den Tiefen der Arduino Web Seite ist der Build Prozess beschrieben.
Lese es, oder lass es.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Tommy56

Angenommen ich möchte einfach einen Bestimmten Code da es sehr viel ist wo anders hin schieben um Ihn dann per Include an einer bestimmten Stelle im Code aufzurufen.
Include bindet ein, da ist nix mit "an bestimmter Stelle per Include aufrufen".

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

Muecke

Stell dir nur mal vor, du würdest dich mal in das einarbeiten, was du da tust, und plötzlich verstehst du die verrücktesten Programme. Kannst dich mit ALLEN Programmieren weltweit austauschen.
Wäre das nicht wunderbar?
Mich würde erfreuen, wenn du da mal hin kommst!
Mich auch, jedoch ist das Thema extrem Komplex finde ich, leider fehlt mir auch oft die zeit, da ich sonst nihcts Programmire, und nur die kleinen für euch wahrscheinlich echt super kleinen Projekte habe.

Quote
Mein Weg ist der C++ Weg.
Der C++ Welt weit akzeptierte Standard Weg.
(zumindest dicht dran)
Denn habe ich mir angeschaut, ich bin auch sehr begeistert davon, verstehe aber extrem wenig davon, habe heute auch einiges nachgeschlagen und nachgelesen, und bin extrem verwirrt dadurch, ich kann dir noch nicht mal sagen warum eigendlich, es dreht sich alles udn ich verstehe davon fast nichts. sobald ich eine Kleinigkeit  ändere kommen Fehlermeldungen die ich wider nachschlagen muss ;-).

Ich würde gerne so viel davon verstehen, und richtig Können, nur wir wissen ja wie das ist wenn man das gelernte nicht anwendet dann verblast es auch wider, ich wende es immer dann an wenn ich hier im Forum schreibe ansonsten habe ich damit 0,0 Zutun.



Include bindet ein, da ist nix mit "an bestimmter Stelle per Include aufrufen".

Gruß Tommy
Verstehe ich nicht ;-(
ich hatte den Befehl Include bisher so verstanden das ich genau an der Stelle an der der Befehl steht denn Text schreibe der in der Datei steht der durch Include aufgerufen wird.

Sprich das was ich da im Kopf habe geht nicht?


Gruß Mücke
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

combie

#12
Nov 19, 2017, 09:09 pm Last Edit: Nov 19, 2017, 09:13 pm by combie
Was du im Kopf hast sehen wir nicht.
:smiley-evil: Ich weiß auch nicht ob ich das überhaupt sehen will. :smiley-evil:


Tipp:
Solange du begründest, warum das nichts werden kann, solange wird das auch nichts.

Denn:
Wer will, findet Wege.
Wer nicht will, findet Gründe.


Quote
, ich kann dir noch nicht mal sagen warum eigendlich,
Darüber solltest du dir klar werden.

Denn dann könntest du mich fragen.
So kleine konkrete Fragen....
Denn es hat ja Gründe, warum ich das so, genau so, und nicht anders, getan habe.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Muecke

Was du im Kopf hast sehen wir nicht.
:smiley-evil: Ich weiß auch nicht ob ich das überhaupt sehen will. :smiley-evil:
:o ist vielleicht besser so, ist manchmal ziemlich Karotisch in meiner Birne ;-)

Tipp:
Solange du begründest, warum das nichts werden kann, solange wird das auch nichts.

Denn:
Wer will, findet Wege.
Wer nicht will, findet Gründe.
Das ist mir auch klar.


Darüber solltest du dir klar werden.

Denn dann könntest du mich fragen.
So kleine konkrete Fragen....
Denn es hat ja Gründe, warum ich das so, genau so, und nicht anders, getan habe.
genau das wäre echt schön wenn ich das wüste, ich wollte auch kein Blöden Fragen stellen, bei denen ich mit einfachen Google drauf komme, denn dann wird mir auch irgend wann nicht mehr geholfen das will ich nicht.

Etwas selbst zu erarbeiten ist auch mal ganz gut ;-)
Vielleicht kommt das wenn ich die ein oder andere Nacht drüber geschlafen habe, das ich das ein oder andere doch verstehe, und dann Konkrete fragen stellen kann.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Muecke

@combie: Ich möchte es mal wagen: und kleine Fragen Stellen zu deinem Programm Aufbau.
Auch wenn ich Gefahr laufe das ich gleich mit Google bestraft werde.

Ich gehe das Haupt Programm von Oben nach unten durch.

1. die Datei config.h wird eingebunden. OK
es gibt jedoch keine Config.cpp somit stehen dort nur Deklarationen drin !

Hier hast du die Installation der Serielenschnitstelle und den Zeilenumbruch (Job Bestätigung) bei der Serielenschnitstelle.

ich habe das auseinander genommen was du da geschrieben hast: sieht dann so aus bei mir.
Code: [Select]
#pragma once

 static const unsigned long Baudrate = 9600;   // Geschwindigkeit, Serielle Schnittstelle
 static const char ZEILENTRENNZEICHEN = 10;    // Zeilenumbruch in der Serielle Komunikation


/*  static
 *   Variable bleibt bestehen wird nach einem Fungzionsaufruf nicht zerstört.
 *  const
 *   Keine Variable sondern eine Konstante, kann werend des Programm
 *   ablaufes nihct geändert werden.
 *  unsigned long
 *   keine negativen Zahlen, Bereich von 0 bis 4.294.967.295
 *  char
 *   ist ein art String wenn ein * dahinter steht dann wird nicht nur der
 *   Wert sondern die Zeichenkette im Speicher verändert ! extrem verwirend
 *   für mich.
 */


Meine Frage, warum hast du das #define hier raus genommen?
mit #define habe ich doch die Möglichkeit das der Wert der dahinter steht im gesamten Code eingetragen wird, warum hast du das bei dir so Kompliziert geschrieben?

Wenn ich die Config Datei richtig verstanden habe, kann ich in in die alles rein schreiben das sonst vor dem void setup() steht? auch genau so wie es vor dem Loop sonst steht, ich muss da auf nichts achten?

Ich arbeite mich langsam durch das Programm Stück für Stück, und versuche auch so viel als Möglich nach zu googeln.
 

Gruß Mücke




Damit man alles noch mal in der Übersicht hat:

MueckeAuslagern.ino
Code: [Select]

  #include "config.h"
  #include "Funktionen.h"                       // Deklarationen der Funkionen
  #include "Job.h"                              // Deklarationen der Funkionen
   
void setup()
{
  Serial.begin(Baudrate);                       // Seriellen Monitor Installiren
}

void loop()
{
  delay(10);                                    // warten für 10 millisekunde
  Serielle_abfrage();                           // abfrage der Seiellen schnittstelle und Job aufrufen
}



Funktionen.cpp
Code: [Select]
#include <Arduino.h>
#include "config.h"
#include "Job.h"
#include "Funktionen.h"

/* ***********************************************************************************************
 *                            FunktionSerielle Schnittstelle auslesen
 * ***********************************************************************************************/
  char* receiveBuffer()
  {
    static char lineBuffer[35];
    static byte counter = 0;
    char c;
      if (Serial.available() == 0) return NULL;
      if (counter == 0) memset(lineBuffer, 0, sizeof(lineBuffer));
    c = Serial.read();
      if (c == ZEILENTRENNZEICHEN)
      {
        counter=0;
        return lineBuffer;
      }
      else if (c>=40)
      {
        lineBuffer[counter] = c;
        if (counter < sizeof(lineBuffer) - 2) counter++;
      }
    return NULL;
  }

/* ***********************************************************************************************
 *                            Funktion Serielle Schnittstelle Abfragen
 * ***********************************************************************************************/
void Serielle_abfrage()
{
 
   char* text=receiveBuffer();
     if(text != NULL)
     {
             if (strcmp_P(text, PSTR("Test"))==0)          { Job_Test(); }           // Ausgabe TEST
        else if (strncmp_P(text, PSTR("Print"), 5)==0)     { Job_Print(text + 6); }  // Ausgabe alles was Hinter Print: kommt
        else  { Serial.println(F("NOK, Unbekannter Job"));}
     } // if text
     
} // Serielle_abfrage


Funktionen.h
Code: [Select]
#pragma once

char* receiveBuffer();
void Serielle_abfrage();


Job.cpp
Code: [Select]
#include <Arduino.h>
#include "Job.h"

/* ***********************************************************************************************
 *                            Job: Test
 * ***********************************************************************************************/
void Job_Test()
{
   Serial.println(F("OK, TEST"));
}

/* ***********************************************************************************************
 *                            Job: Print
 * ***********************************************************************************************/
void Job_Print(char* str)
{
   Serial.print(F("Übergeben wurde: "));
   Serial.println(str);
}


Job.h
Code: [Select]
#pragma once

void Job_Test();
void Job_Print(char* str);


Job.h
Code: [Select]
#pragma once

 static const unsigned long Baudrate = 9600;   // Geschwindigkeit, Serielle Schnittstelle
 static const char ZEILENTRENNZEICHEN = 10;    // Zeilenumbruch in der Serielle Komunikation
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Go Up