Hallo zusammen,
irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr und hoffe Ihr könnt mir helfen.
Ich habe ein Struct Array was ich aus Platzgründen in den PROGMEM schreibe und daraus mit einer Methode einzelne Zeilen auslesen möchte. Soweit alles fein, jedoch möchte ich die Methode in eine externe CLASS (xxx.h) auslagern, wo ich jedoch mit der Übergabe an die Methode meine Probleme habe.
#include "xxx.h"
// in der xxx.h ist folgende Struc definiert:
/*struct test_struc {
byte id;
byte port;
char bez[21];
};*/
const test_struc ioc[] PROGMEM =
{
//Test Array mit 3 Einträgen füllen und ins Memory schreiben
{0, 60, "Testtext1" },
{1, 61, "Testtext2" },
{2, 62, "Testtext3" },
};
//Methode zum auslesen des Memory Arrays in eine Struktur
test_struc get_conf(byte id)
{
test_struc temp;
for( int i=0; i<(sizeof(ioc)/sizeof(test_struc)); i++)
{
memcpy_P( &temp, &ioc[i], sizeof(test_struc));
return temp;
}
}
void setup() {
Serial.println(get_conf(2).bez);
}
void loop() {
// put your main code here, to run repeatedly:
}
Wie bereits beschrieben funktioniert dies tadellos. Wenn ich aber die Methode "get_conf" ins OPP in die xxx.h (und xxx.cpp) auslagern möchte, fehlt mir jegliche Idee / Ansatz den Array "ioc[]" in der Methode mit einem Type zu definierten damit ich dieses Array übergeben kann.
Ich habe auch in der SuFu nicht gefunden, vielleicht auch daher das ich kein KEYWORD allein habe. Habt Ihr hierzu eine Idee? Ich hoffe es war verständlich genug formuliert.
Vielen Dank schon mal im Voraus und Grüße,
Andy
combie
December 21, 2021, 2:42pm
2
Erstmal wundert mich die for Schleife....
Die ist doch garnicht nötig wenn man nur 1 Datensatz lesen will.
Tommy56
December 21, 2021, 2:44pm
3
Und in welchem Forum hättest Du gern die Antworten auf Deine verteilten Anfragen ?
Gruß Tommy
Hi, sorry hatte jetzt aber erst gesehen das es hier auch ein deutsches Forum gibt.
Von daher wäre es mir egal, da ich die Lösung dann eh in beiden zur Dokumentation für andere poste.
Grüße, Andy
J-M-L
December 21, 2021, 2:59pm
5
Ich habe das hier eingetragen es darf nicht kompiliert werden....
main.ino
#include "conf.h"
const t_configuration ioc[] PROGMEM =
{
{0, 60, "Testtext1" },
{1, 61, "Testtext2" },
{2, 62, "Testtext3" },
};
configClass myConfigurations(ioc, sizeof ioc / sizeof *ioc);
void setup() {
Serial.begin(115200); Serial.println();
Serial.println(myConfigurations.getConfigAtIndex(0).id); // ➜ 0
Serial.println(myConfigurations.getConfigAtIndex(1).port); // ➜ 61
Serial.println(myConfigurations.getConfigAtIndex(2).bez); // ➜ Testtext3
}
void loop() {}
conf.cpp
#include <Arduino.h>
#include "conf.h"
t_configuration configClass::getConfigAtIndex(size_t index) {
t_configuration aConfig;
if (index < configCount) memcpy_P( &aConfig, &configs[index], sizeof(t_configuration));
else memset(&aConfig, 0, sizeof(t_configuration));
return aConfig;
}
conf.h
#ifndef _CONF_H_
#define _CONF_H_
const byte maxBez = 20;
struct t_configuration {
byte id;
byte port;
char bez[maxBez+1];
};
class configClass {
public:
const t_configuration* configs;
size_t configCount;
configClass(const t_configuration* c, size_t n) : configs(c), configCount(n) {}
t_configuration getConfigAtIndex(size_t index);
};
#endif
Blockzitat
Erstmal wundert mich die for Schleife....
Die ist doch garnicht nötig wenn man nur 1 Datensatz lesen will.
Blockzitat
Vollkommen richtig, die FOR Schleife wird überhaupt nicht benötigt. Dies würde nun so aussehen, das Problem zu meiner eigentliche Frage bleibt dennoch:
test_struc get_conf(byte id)
{
test_struc temp;
memcpy_P( &temp, &ioc[id], sizeof(test_struc));
return temp;
}
Danke aber schon mal für den Hinweis!
Grüße, Andy
combie
December 21, 2021, 3:07pm
7
Ich habe weiterhin keine Ahnung, was du erreichen willst....
Nur, dass es irgendwas mit Klassen und Datensätzen zu tun haben soll.
struct test_struc
{
byte id;
byte port;
char bez[21];
};
const test_struc ioc[] PROGMEM =
{
//Test Array mit 3 Einträgen füllen und ins Memory schreiben
{0, 60, "Testtext1" },
{1, 61, "Testtext2" },
{2, 62, "Testtext3" },
};
class Test
{
private:
test_struc datensatz;
public:
Test(const test_struc *satz)
{
memcpy_P( &datensatz, satz, sizeof(*satz));
}
char *getName()
{
return datensatz.bez;
}
};
Test testa {ioc + 2}; // dritte Element
Test testb {ioc };// erstes Element
void setup()
{
Serial.begin(9600);
Serial.println("-----start----");
Serial.println(testa.getName()); // dritte Element
Serial.println(testb.getName()); // erstes Element
Serial.println("---------");
for(const test_struc &s:ioc) Serial.println(Test{&s}.getName());
}
void loop()
{
}
------------------------------------
Wenn man es sich lieber mit Referenzen, anstatt mit Pointern, antut:
struct test_struc
{
byte id;
byte port;
char bez[21];
};
const test_struc ioc[] PROGMEM =
{
//Test Array mit 3 Einträgen füllen und ins Memory schreiben
{0, 60, "Testtext1" },
{1, 61, "Testtext2" },
{2, 62, "Testtext3" },
};
class Test
{
private:
test_struc datensatz;
public:
Test(const test_struc &satz)
{
memcpy_P( &datensatz, &satz, sizeof(satz));
}
char *getName()
{
return datensatz.bez;
}
};
Test testa {ioc[2]}; // dritte Element
Test testb {ioc[0]}; // erstes Element
void setup()
{
Serial.begin(9600);
Serial.println("-----start----");
Serial.println(testa.getName()); // dritte Element
Serial.println(testb.getName()); // erstes Element
Serial.println("---------");
for(const test_struc &s:ioc) Serial.println(Test{s}.getName());
}
void loop()
{
}
Ich bin es noch in mein Projekt am implementieren und probieren, aber J-M-L Jackson hat mir die Lösung bereits serviert. DANKE dafür !!!!
Geiles Forum hier in der kurzen Zeit ein solches Feedback zu bekommen!
J-M-L
December 21, 2021, 3:44pm
9
aber ich sehe wirklich nicht, welchen Mehrwert die Klasse bringt....
Ich hätte es getan
ich hätte es so formuliert
const byte maxBez = 20;
struct t_configuration {
byte id;
byte port;
char bez[maxBez + 1];
};
const t_configuration ioc[] PROGMEM = {
{0, 60, "Testtext1" },
{1, 61, "Testtext2" },
{2, 62, "Testtext3" },
};
const size_t configCount = sizeof ioc / sizeof * ioc;
t_configuration getConfigAtIndex(size_t index) {
t_configuration aConfig;
if (index < configCount) memcpy_P( &aConfig, &ioc[index], sizeof(t_configuration));
else memset(&aConfig, 0, sizeof(t_configuration));
return aConfig;
}
void setup() {
Serial.begin(115200); Serial.println();
Serial.println(getConfigAtIndex(0).id); // ➜ 0
Serial.println(getConfigAtIndex(1).port); // ➜ 61
Serial.println(getConfigAtIndex(2).bez); // ➜ Testtext3
}
void loop() {}
Blockzitat
aber ich sehe wirklich nicht, welchen Mehrwert die Klasse bringt....
Ich hätte es getan
Blockzitat
relativ einfach, da es hierbei sich um ein größeres Projekt handelt und in diesen Klassen eh schon viele Methoden sind und nur noch das gefehlt hatte.
Nochmal DICKES Danke
OFFTOPIC:
J-M-L:
Ich hätte es getan
Bedeutet etwa "I would have done it",
dieses es wird oft mit sexueller Aktivität verbunden.
Unter "es tun" verstehen viele "Sex haben".
Wahrscheinlich hast du etwas wie
ich hätte es so formuliert
ich würde das so lösen
so würde ich das (Problem) lösen
(m)ein Lösungsvorschlag
(m)eine Lösung
ausdrücken wollen.
Schön, dass du dich mit der deutschen Sprache auseinandersetzt,
ich hoffe, du nimmst mir den Hinweis nicht übel.
J-M-L
December 21, 2021, 6:03pm
12
Hoppla
Ich versuche ein wenig zu üben, die Schule ist weit weg ...
[Noch mehr offtopic]
Wobei da dann eher "es miteinander tun" heißt, wenn es in Richtung Sex geht. Oder sogar "miteinander (rum)machen".
"es tun" kann auch "es gemeinsam tun" sein. Zum Beispiel feiern.
Durch die konjunktive Vergangenheitsform, wird es sogar noch schwerer eine "passende" Deutung ohne Kontext zu finden.
Deutsch ist leider sehr auf Betonung und Kontext angewiesen.
Aber Deine Aufzählung ist cool.
Bei uns wurden sexuelle Aktivitäten in der Schule nicht so gerne gesehen,
die Zeiten scheinen sich sehr geändert zu haben.
Schon klar, das Üben bezieht sich nicht auf die Aktivitäten,
könnte aber durchaus so verstanden werden.
Hier erzeugst du unabsichtlich einen Kontext.
Übung macht den Meister,
aber auch jetzt schon ist dein Deutsch besser als das mancher Muttersprachler.
J-M-L
December 21, 2021, 8:03pm
16
Ich werde jetzt nur noch C++ im deutschen Forum sprechen - ich verstehe Scope und Kontext besser