Variable in Struct zur laufzeit schreiben

OP #5107141
Lesenswert?

Hallo
Habe mich noch nicht richtig mit Struct befasst.
Möchte eigentlich in einen vorgegebenen Programm nur die Variable Adr 
zur Laufzeit ändern.
Und diese soll in den Struckt geschrieben werden.

Geht dies in einfacher Form z.B in Loop.
Ist ein Ardu Programm!
Danke

int Adr=24;

struct Message {
   unsigned char data[7];
   unsigned char len;
} ;

#define MAXMSG  2

struct Message msg[MAXMSG] = {
    { { 0xFF,     0, 0xFF, 0, 0, 0, 0}, 3},
    { {Adr, 0x3F,  0, 0, 0, 0, 0}, 4}
  };


void setup() {


}

void loop() {


}
#5107159
Lesenswert?

@ Al. Kn. (alterknacker)

>Habe mich noch nicht richtig mit Struct befasst.

Dann solltest du das nachholen und ein gutes C-Buch lesen. Auch in 
deinem gesetzten Alter.

>Möchte eigentlich in einen vorgegebenen Programm nur die Variable Adr
>zur Laufzeit ändern.
>Und diese soll in den Struckt geschrieben werden.

Dann tu das.

>Ist ein Ardu Programm!

Und das deine unverständliche AbKü? Warum schreibst du nicht einfach 
Arduino? Keine Zeit?
1
struct Message {
2
   unsigned char data[7];
3
   unsigned char len;
4
} ;
5

6
#define MAXMSG  2
7

8
struct Message msg[MAXMSG] = {
9
    { { 0xFF,     0, 0xFF, 0, 0, 0, 0}, 3},
10
    { {Adr, 0x3F,  0, 0, 0, 0, 0}, 4}
11
  };
12

13

14
void setup() {
15

16
  msg.data[2] = 1;
17
  msg.len = 42;
18
}
Gast #5107194
Lesenswert?

Und hier das ganze nochmal in "toll":
1
#include <iostream>
2

3
unsigned char Adr=70;
4

5
struct Message {
6
   unsigned char data[7];
7
   unsigned char len;
8
} ;
9

10
#define MAXMSG  2
11

12
Message msg[MAXMSG] = {
13
    { {0xFF, 0, 0xFF, 0, 0, 0, 0}, 3},
14
    { {Adr, 0x3F, 0, 0, 0, 0, 0}, 4}
15
  };
16

17
class mc {
18
  public:
19
    mc& operator=(unsigned char rhs) {
20
        msg[1].data[0] = rhs;
21
        return *this;
22
    };
23
};
24

25
mc myadr;
26

27
void setup() {
28
    std::cout << msg[1].data[0] << std::endl;
29
    myadr = 71;
30
    std::cout << msg[1].data[0] << std::endl;
31
}
32

33
void loop() {
34

35

36
}
37

38
int main() {
39
  setup();
40
//  while(true) {
41
//    loop();
42
//  }
43
}

Um Adr im struct zu ändern muss man nun nur noch:
1
myadr = 78
 schreiben :D
Gast #5107258
Lesenswert?

Das include ist nur für die couts da. Wenn dir das nicht bekannt ist, 
fehlen dir aber noch sehr viele (alle?) Grundlagen!

Mein Beispiel (auch wenn es funktioniert) war auch alles andere als 
ernst gemeint. Wenn dich interessiert, wie es funktioniert, so ist das 
Stichwort dazu Operatorüberladung.
Alles was ich gemacht habe, ist eine Funktion namens "=" zu erstellen, 
die auch nichts anderes als
1
msg[1].data[0]=42;
 macht.
Gast #5107491
Lesenswert?

Al. K. schrieb:
> Für mich ist nur wichtig ,das  das läuft was ich machen will.
> Alles andere kostet nur Lebenszeit!

Das ist Einbildung. Wenn man etwas wacklig aufhängt und sagt "hält 
schon" wird es über kurz oder lang runterfallen. Dann kostet es noch 
viel mehr Lebenszeit, nur später. Ist beim Programmieren genauso.

MfG Klaus, auch nicht mehr der Jüngste
#5107531
Lesenswert?

Das Prinzip: A box in a box in a box in a...
Ist doch sehr effektiv, wenn einem der Arduino zu schnell ist.
Vor allem, wenn man dies auch noch zur Laufzeit macht.

- Also Parameter auf den Stapel
- Ausgangsadresse ebenso
- Funktionsaufruf
- Parameter erneut vom Stapel holen
- >>Werte zuweisen<<
- Rücksprungadresse holen mit Rücksprung

Einfach:
>>Werte zuweisen<<
wäre doch viel zu schnell und das (den?) FLASH des "Adru" bekommt man so 
auch nicht voll.
Gast #5108382
Lesenswert?

Sebastian S. schrieb:
> Das Prinzip: A box in a box in a box in a...
> Ist doch sehr effektiv, wenn einem der Arduino zu schnell ist.
> Vor allem, wenn man dies auch noch zur Laufzeit macht.
>
> - Also Parameter auf den Stapel
> - Ausgangsadresse ebenso
> - Funktionsaufruf
> - Parameter erneut vom Stapel holen
> - >>Werte zuweisen<<
> - Rücksprungadresse holen mit Rücksprung
>
> Einfach:
>>>Werte zuweisen<<
> wäre doch viel zu schnell und das (den?) FLASH des "Adru" bekommt man so
> auch nicht voll.

Falls auch das auf meine "Lösung" bezogen war: zumindest ein aktueller 
ARM gcc und ein aktueller x86 gcc und ein deravr gcc 4.6.4 machen mit O3 
auch meinen überladenen = operator zu einem einfach store byte. Es 
brauch aber tatsächlich mehr flash (s. https://godbolt.org/g/8ZcvrR)
Gast #5143722
Lesenswert?

Al. K. schrieb:
> Das ist es bestimmt nicht, aber wenn man es sucht und nicht weis, dann
> ja!

Wenn ich nach "struct" und "C" suche wird mir gleich im ersten Treffer 
genau erklärt, wie man sowas bewerkstelligt. Noch einfacher kann man es 
eigentlich nicht mehr haben...
Gast #5144172
Lesenswert?

Wenn man schon C++ zur Verfügung hat, kann man auch das fiese Makro
Al. K. schrieb:
> #define MAXMSG  2
ersetzen durch eine "echte" Konstante
1
static const size_t MAXMSG = 2;
das ist genauso effizient, vermeidet aber diverse Probleme (Typ, Scope / 
Namenskollision, Pointer/Referenz darauf).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren