Forum: Mikrocontroller und Digitale Elektronik Variable in Struct zur laufzeit schreiben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht 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() {


}

von Dumm Frager (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Al. K. schrieb:
> Ist ein Ardu Programm!

Was ist ein Ardu Programm?

Kann man das essen?

von Al. K. (alterknacker)


Bewertung
-1 lesenswert
nicht lesenswert
Dumm Frager schrieb:
> Kann man das essen?

Du kannst das bestimmt, kleiner Spaßvogel;-))

von Struckd Looser (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Al. K. schrieb:
> Habe mich noch nicht richtig mit Struct befasst.

Dann mach das doch jetzt!

Hast genug Zeit dafür.

Kauf dir Ein Buch zum Lernen/Programmieren von C oder
besuche einen Kurs in der Volkshochschule.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht 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
}

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
1
msg[1].data[0]=42;

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Wenn man die Array-Größe an den Anfang schreibt,
1
struct Message {
2
   unsigned char len;
3
   unsigned char data[7];
4
} ;
dann muß man keine Byte-Löcher übertragen.

: Bearbeitet durch User
von nfet (Gast)


Bewertung
-3 lesenswert
nicht 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

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
Hallo
msg[1].data[0]=4;

Habe damit im Setup und Loop  experimentiert.
Damit geht es.
Werde morgen mal den Vorschlag von  nfet (Gast)
testen.
Das mit der zusätzlichen Include gefällt mir aber nicht .

von Nik D. (nik_uc)


Bewertung
3 lesenswert
nicht lesenswert
Warum genau muss man für ein simples Struct ne Klasse drum rum 
matschen....

KISS...

von nfet (Gast)


Bewertung
0 lesenswert
nicht 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.

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
Nik D. schrieb:
> Warum genau muss man für ein simples Struct ne Klasse drum rum
> matschen....

Wenn du mir damit etwas sagen willst, dann musst du es schon genauer 
erklären.

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

: Bearbeitet durch User
von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
nfet schrieb:
> Mein Beispiel (auch wenn es funktioniert)


Nein, es funktioniert nicht.

Denn in der Arduino Welt gibt es von Hause aus kein:
#include <iostream>

von Klaus (Gast)


Bewertung
1 lesenswert
nicht 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

von Sebastian S. (amateur)


Bewertung
0 lesenswert
nicht 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.

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian S. schrieb:
> Vor allem, wenn man dies auch noch zur Laufzeit macht.

Wird doch nur einmalig gemacht, das sind wenige Millionstel sec.
Es kommt immer darauf an was man machen will!

von nfet (Gast)


Bewertung
0 lesenswert
nicht 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)

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
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}
  };

Wie kann ich zur Laufzeit die 4 auf 3 Ändern?!

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Natürlich mit

1
  msg[1].len = 3;

Was ist daran so schwer?

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Was ist daran so schwer?

Das ist es bestimmt nicht, aber wenn man es sucht und nicht weis, dann 
ja!
Habe es in meinen Decoder getestet.
Jetzt kann ich endlich Licht, F1-F28 und Speed -Vor Rück einsetzen.
Danke

von Der Pointler (Gast)


Bewertung
0 lesenswert
nicht 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...

von Al. K. (alterknacker)


Bewertung
0 lesenswert
nicht lesenswert
Der Pointler schrieb:
> Noch einfacher kann man es
> eigentlich nicht mehr haben...

wenn es für dich so einfach ist, warum hast du nicht geantwortet,
Wenn das Problem durch einen Anderen gelöst wird , ist gut Torte essen!

von Eric B. (beric)


Bewertung
0 lesenswert
nicht lesenswert
Al. K. schrieb:
> Wenn das Problem durch einen Anderen gelöst wird , ist gut Torte essen!

Dann mal guten Appetit.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
nfet schrieb:
> Um Adr im struct zu ändern muss man nun nur noch:myadr = 78

Das mag ich so an C++, dieses Verschleiern.
Niemand sieht dann mehr durch, welche Variable wo geändert wird.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.