Variablen über Indexnummer auslesen?

Gast #1045761
Lesenswert?

Hallo,

ich habe im Programm viele Variablen abgelegt. Diese werden im laufendem 
Programm gesetzt. Über UART möchte ich die Variablen auslesen. Ich 
möchte jeder Variable eine Nummer vorgeben, um dann über UART mit Angabe 
der Nummer, die Variablen auslesen.

Praktisch sieht das so aus. Ich schicke über UART die Nummer an µC. Beim 
Empfang der Nummer, wird der Inhalt der entsprechenen Variable an den PC 
geschickt.

Zur Zeit habe ich eine <switch case> Anweisung mit sehr viel Text. Ich 
möchte Speicherplatz sparen und die Variablen sofort über die Nummer 
ansprechen und auslesen. Wie kann man das machen?

Gibt es so was wie eine Strukture oder ähnliches, damit ich dann einfach 
mit der Indexnummer die Variablen auslesen kann?

Danke!
Gast #1045776
Lesenswert?

Danke, das Problem ist aber, dass man bei Array nur einen Variablenamen 
hat, nähmlich den Arrayname. Und man kann sich schlecht merken, was für 
eine Variable sich unter der Nummer [x] verbirgt. Kann man das im 
Programmcode irgendwie besser gestalten? (ohne zu viel Speicherplatz zu 
verlieren)
Persönliche Seite #1045782
Lesenswert?

> man kann sich schlecht merken, was für eine Variable sich unter
> der Nummer [x] verbirgt.
> Kann man das im Programmcode irgendwie besser gestalten?

Du könntest die für den Arrayzugriff verwendeten Index-Werte als 
#defines oder als enum deklarieren:
1
#define IDX_KIRSCHTORTE 0
2
#define IDX_NAPFKUCHEN 1
3
#define IDX_QUARKKEULCHEN 2
4
#define IDX_BRATAPFEL 3
5

6
...
7

8
Array[IDX_NAPFKUCHEN] = 4;

Oder
1
enum Indexwerte =
2
{
3
  idx_kirschtorte,
4
  idx_napfkuchen,
5
  idx_quarkkeulchen,
6
  idx_bratapfel
7
};
8

9
Array[idx_kirschtorte] = 9;
Gast #1045784
Lesenswert?

Du kannst im Quellcode für die Nummern defines verwenden.

Also z.B.
#define TEMPERATUR 2
#define DRUCK      3

Dann kannst du im Programm übersichtlich mit variable[TEMPERATUR] drauf 
zugreifen. Ob du's so schreibst oder direkt variable[2] ändert an der 
Codegrösse nix.
Persönliche Seite #1045811
Lesenswert?

1
typedef union
2
  {
3
  uchar  Buffer[10];
4
  uchar Test1;
5
  uchar Test2;
6
--- usw..
7
  } TTest;
8

9
TTest TX_Buffer;
10
TTest RX_Buffer;

Das geht schief, da Test1 und Test2 denselben Speicherbereich belegen.

Richtig wäre es so:
1
typedef union
2
  {
3
  uchar  Buffer[10];
4
  struct
5
  {
6
    uchar Test1;
7
    uchar Test2;
8
--- usw..
9
  } TTest;
10

11
TTest TX_Buffer;
12
TTest RX_Buffer;

Wenn die in der union verwendete Struktur anonym bleibt, funktionieren 
die Zugriffe trotzdem so wie von tobi beschrieben.
Gast #1045885
Lesenswert?

@ Rufus:

Ja, du hast Recht!
War nur eine Idee von mir und zuwenig nachgedacht :-)
Exakt also so: (Klammerfehler!)
1
typedef union
2
  {
3
  uchar  Buffer[10];
4
  struct
5
    {
6
    uchar Test1;
7
    uchar Test2;
8
--- usw..
9
    }
10
  } TTest;
11

12
TTest TX_Buffer;
13
TTest RX_Buffer;
Gast #1045908
Lesenswert?

Würd ich anders machen:

1. Variablen ganz normal im Programm anlegen
2. Über die Uart wird keine Nummer, sondern die Addresse der Variablen 
übergeben (sowie deren Länge)
3. Aus dem Mapfile weißt du welche Variable wo liegt
4. Im Programm wird dann einfach aus dem Speicher gelesen
Gast #1045922
Lesenswert?

Die Lösung von Gast halte ich für die Sinnvollste. So bleibt der 
Debugging-Code klein, und unabhängig von der Art der Variable (zB 
Strukturen, real, int, ..)

Meines Wissens machen die Online-Debugger von SPS-Entwicklungsumgebungen 
das genauso, denn wenn man das falsche Projekt hat (also eine falsche 
Adresse ausließt) steht auch nur Müll in der Variable/Struktur.
Gast #1047048
Lesenswert?

Jap, man bildet die Variablen auf virtuelle Adressen ab. Ggf. kann man 
jeder virtuellen Adresse dann sogar noch eine Callback-Funktion 
zuordnen, welche bei Lese/Schreibzugriffen noch bestimmte Aktionen 
auslöst oder Bereichsprüfungen durchführt.


struct mem_map_s
{
  uint addr,
  void *p,
  uint len,
};

mem_map_t memory_map [] =
{
 /* virt. Adresse,   Zeiger,   Länge */
 {      ADDR_TAG,     &day,       1},
 {    ADDR_MONAT,   &month,       1},
 {     ADDR_JAHR,    &year,       1},
 {   ADDR_STATUS,   &state,       1}};

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