www.mikrocontroller.net

Forum: Compiler & IDEs Variablen über Indexnummer auslesen?


Autor: FrageMan (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ganz einfach!

Ein Array anlegen:

char Test[10] //10 char Variablen "hintereinander"

Ansprechen tust du diese dann mit

Test[0] //1. Variable
Test[1] //2. Variable
usw..

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ FrageMan (Gast)

>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?

Das Zauberwort heisst Array.

MFG
Falk

Autor: FrageMan (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#define IDX_KIRSCHTORTE 0
#define IDX_NAPFKUCHEN 1
#define IDX_QUARKKEULCHEN 2
#define IDX_BRATAPFEL 3

...

Array[IDX_NAPFKUCHEN] = 4;

Oder
enum Indexwerte =
{
  idx_kirschtorte,
  idx_napfkuchen,
  idx_quarkkeulchen,
  idx_bratapfel
};

Array[idx_kirschtorte] = 9;

Autor: Jaecko (Gast)
Datum:

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

Autor: Jaecko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mist, paar Minuten zu langsam g

Autor: FrageMan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE AN ALLE!!!

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder eine Union verwenden:

typedef union
  {
  uchar  Buffer[10];
  uchar Test1;
  uchar Test2;
--- usw..
  } TTest;

TTest TX_Buffer;
TTest RX_Buffer;

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zugriff dann über
TX_Buffer.Buffer[0] ...

ODER

TX_Buffer.Test1;

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef union
  {
  uchar  Buffer[10];
  uchar Test1;
  uchar Test2;
--- usw..
  } TTest;

TTest TX_Buffer;
TTest RX_Buffer;

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

Richtig wäre es so:
typedef union
  {
  uchar  Buffer[10];
  struct
  {
    uchar Test1;
    uchar Test2;
--- usw..
  } TTest;

TTest TX_Buffer;
TTest RX_Buffer;

Wenn die in der union verwendete Struktur anonym bleibt, funktionieren 
die Zugriffe trotzdem so wie von tobi beschrieben.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rufus:

Ja, du hast Recht!
War nur eine Idee von mir und zuwenig nachgedacht :-)
Exakt also so: (Klammerfehler!)
typedef union
  {
  uchar  Buffer[10];
  struct
    {
    uchar Test1;
    uchar Test2;
--- usw..
    }
  } TTest;

TTest TX_Buffer;
TTest RX_Buffer;

Autor: Gast (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Die Lösung von Gast halte ich für die Sinnvollste"

Natürlich! ;-)

Hat auch den Vorteil, das absolut simpel zu implementieren ist.

Autor: Hmm... (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.