INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Frage zur Adressierung von Variablen
27.10.2017, 20:03
Beitrag #9
RE: Frage zur Adressierung von Variablen
Hallo Arne,

ich bin mir nicht ganz sicher ob ich die Problemstellung richtig verstanden habe. Einen Austausch von Daten zwischen verschiedenen Teilnehmern habe ich, wie Du anfangs beschrieben hast, mit Arrays geplant. Damit sind nur noch Teilnehmername und Index-Nr der Variablen für den Dialog relevant. Das sollte mit einer Standardfunktion machbar sein.
Dann bekommt man unter Umständen so bescheuerte Variablennamen wie ich sie im Binshield verwendet habe. BE1[1]...BE[16]. Der Vorteil ist, bei späteren Änderungen muß das Programm nicht geändert werden, nur eine eventuell benötigte und vorhandene Zuweisungsliste für Klartext-Bezeichnungen.

Gruß
Rainer
Diese Nachricht in einer Antwort zitieren
27.10.2017, 20:24 (Dieser Beitrag wurde zuletzt bearbeitet: 27.10.2017 20:36 von Tommy56.)
Beitrag #10
RE: Frage zur Adressierung von Variablen
Irgendwie mag er das typedef nicht, was bei 1 Variablen pro Strukt auch kein Beinbruch ist..
Code:
struct struct1_t {
  byte     dummy11;
  uint16_t dummy12;
  // ...
}werte1;

struct struct2_t {
  uint32_t dummy21;
  int8_t   dummy22;
  // ...
}werte2;

struct struct3_t {
  float    dummy31;
  uint32_t dummy22;
  // ...
}werte3;

const uint8_t *structArray[] = {(const uint8_t *)&werte1, (const uint8_t *)&werte2, (const uint8_t *)&werte3};

/*
// sendet Daten aus lokalem Struct zur Gegenseite
uint16_t UDPwriteAnything (IPAddress ziel_IP, uint16_t ziel_Port, const uint8_t *p) {
  uint16_t i;
  udp.beginPacket(ziel_IP, ziel_Port);
  for (i = 0; i < sizeof value; i++) {
    udp.write(*p++);
  }
  udp.endPacket();
  return i;
}
*/

void setup() {
  werte1.dummy11 = 123;
  werte2.dummy21 = 123L;
  werte3.dummy31 = 123.0;
  
}

void loop() {

}
Das kompiliert.

Gruß Tommy

Da war meine Erinnerung schon etwas verwässert. Es gibt 2 Varianten, die sich aber nicht zusammen fassen lassen:
Code:
typedef struct struct1_t {
  byte     dummy11;
  uint16_t dummy12;
  // ...
};

struct1_t werte1;

// oder die andere Variante

struct struct1_t {
  byte     dummy11;
  uint16_t dummy12;
  // ...
} werte1;

struct1_t werte1;

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2017, 20:59
Beitrag #11
RE: Frage zur Adressierung von Variablen
Hallo Rainer,
die Sache ist vielleicht ähnlich aber nicht gleich wie bei deinem Binshield.

Ein Teilnehmer sendet zu einem zweiten Teilnehmer ein Datenpaket per UDP.
In diesem Datenpaket steht z.B. drin dass der zweite Teilnehmer eine Struktur mit Messwerten senden soll welche nur durch ein Byte im Datenpaket benannt ist.
Meine Frage bezog sich darauf wie ich am einfachsten mit diesem einen Byte eine Strukturvariable ansprechen kann die auf dem zweiten Teilnehmer liegt.

Hallo Tommy,
ohne "typedef" klappt es mit den Strukturen.
Ich hatte auch in der Vergangenheit immer schon Probleme bei der Verwendung von "typedef" in einer .ino . Wenn man die aber in eine .h legt und includiert geht es auch mit "typedef".
Ich will mich jetzt aber daran nicht weiter aufhalten und nehme die Version
Code:
struct struct1_t {
  byte     dummy11;
  uint16_t dummy12;
  // ...
}werte1;
Ich brauche wahrscheinlich auch immer nur eine Variable pro Struct, also alles recht easy.

Gruß
Arne

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2017, 21:11 (Dieser Beitrag wurde zuletzt bearbeitet: 27.10.2017 21:20 von Corvus.)
Beitrag #12
RE: Frage zur Adressierung von Variablen
Du kannst das ganze ja auch am Anfang einmal Definieren:
Code:
#define GETWERT(X) ( (X==0x01)?wert1:(X==0x02)?wert2:(X==0x03)?wert3:"error" )
Aufruf erfolgt dann z.B. so:
Code:
UDPwriteAnything(station1_IP, station1_Port, GETWERT(telegramm);

etwas komplizierter aber evtl. eher das was du suchst:
LINK
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2017, 22:17
Beitrag #13
RE: Frage zur Adressierung von Variablen
Zum Programm aus #10
Code:
// sendet Daten aus lokalem Struct zur Gegenseite
uint16_t UDPwriteAnything (IPAddress ziel_IP, uint16_t ziel_Port, const uint8_t *p) {
  uint16_t i;
  udp.beginPacket(ziel_IP, ziel_Port);
  for (i = 0; i < sizeof value; i++) {
    udp.write(*p++);
  }
  udp.endPacket();
  return i;
}
Kompiliert leider nicht fehlerfrei.
Code:
'value' was not declared in this scope

Habe dann
Code:
for (i = 0; i < sizeof value; i++) {
durch
Code:
for (i = 0; i < sizeof *p; i++) {
ersetzt.

Das kompiliert dann fehlerfrei. Aber sizeof *p; liefert immer 1 zurück und nicht die wahre Länge der Struktvariablen. Confused

Deshalb wird auch immer nur das erste Byte der Struktvariablen gesendet.
Aber es ist das erste Byte aus dem richtigen Struct was bedeutet dass die Adressierung über den Index von ... *structArray[] ... funktioniert. Smile

Gruß
Arne

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.10.2017, 10:44
Beitrag #14
RE: Frage zur Adressierung von Variablen
Ja, und um die Länge zu bekommen, müssen wir sie mit übergeben, da man sie aus dem Pointer nicht mehr ermitteln kann. Das ist ein wesentlicher Unterschied zwischen Pointer und Reference.
Code:
// die Längen
const uint16_t laengen[] = {sizeof(werte1), sizeof(werte2), sizeof(werte3)};
....
// sendet Daten aus lokalem Struct zur Gegenseite
uint16_t UDPwriteAnything (IPAddress ziel_IP, uint16_t ziel_Port, const uint8_t *p, const uint16_t laenge) {
  uint16_t i;
  udp.beginPacket(ziel_IP, ziel_Port);
  for (i = 0; i < laenge; i++) {
    udp.write(*p++);
  }
  udp.endPacket();
  return i;
}
...
// Aufruf:
UDPwriteAnything(zielIp,zielPort, structArray[0],laengen[0]);

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.10.2017, 11:16 (Dieser Beitrag wurde zuletzt bearbeitet: 28.10.2017 11:19 von ardu_arne.)
Beitrag #15
RE: Frage zur Adressierung von Variablen
Nachdem gestern auch alle meine Versuche gescheitert sind die Länge im Unterprogramm "UDPwriteAnything" zu ermitteln wollte ich heute genau deinen Vorschlag angehen und die Länge als zusätzlichen Parameter übergeben.

Ich baue das mal so ein und bin guter Dinge dass es funktionieren wird.

Pointer, Reference, Referenceierung und Dereferenceierung müsste ich mir dringend mal unter das Kopfkissen legen. Blush

Gruß
Arne

Edit: Soeben gefunden, vielleicht hilft es.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 801 19.03.2019 20:33
Letzter Beitrag: Hilgi
  Hilfe bei Formulierung der Frage Matt 3 650 23.02.2019 12:45
Letzter Beitrag: Tommy56
  Frage zur Datei "preferences.txt" daja64 5 471 17.02.2019 21:00
Letzter Beitrag: amithlon
  char in Variablen aufteilen fv1895 7 528 06.01.2019 11:59
Letzter Beitrag: Tommy56
  Variablen zu einem CHAR verbinden und einbinden Frank_aus_WOB 3 605 02.01.2019 09:07
Letzter Beitrag: Tommy56
  Verkettung von Variablen flint74 5 606 30.12.2018 14:33
Letzter Beitrag: Tommy56
  Variablen über Eingabe im Setup beschreiben heini320 3 541 30.12.2018 11:37
Letzter Beitrag: Tommy56
  Frage zu goto uweausbaden 5 481 23.12.2018 13:56
Letzter Beitrag: hotsystems
  Guren Morgen, Frage zu SD BanditBandeh 2 450 05.12.2018 10:19
Letzter Beitrag: Tommy56
  Zentrale Variablen für verschiedene Klassen Smirgel 3 506 29.10.2018 21:24
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste