Forum: Mikrocontroller und Digitale Elektronik GLUE: Variablenwert statt Textersatz gefordert


von Stephan (Gast)


Lesenswert?

Hallo!

Folgender Code

#define Ueberschrift1 "Motor"
#define Ueberschrift2 "Kabel"
#define Ueberschrift3 "Batterie"
#define Anzahl_Ueberschriften 3

int Zaehler;

for(Zaehler=1; Zaehler<=Anzahl_Ueberschriften; Zaehler++;)
{
  UART1_send_string(GLUE(Ueberschrift,Zaehler));
}

soll gerne aus der COM ausspucken:
"Motor Kabel Batterie"

Offensichtlich tut das GLUE nicht das, was ich mir wünsche, der Compiler 
meldet "UeberschriftZaehler undeclared". Klingt leider nachvollziehbar. 
Aber wie kann ich machen, dass die Wertigkeit der Variable "Zaehler" 
eingesetzt wird anstelle des Namens?

Greetz
Stephan

von Karl H. (kbuchegg)


Lesenswert?

1
#define Anzahl_Ueberschriften 3
2
3
const char* Texte[Anzahl_Ueberschriften] =
4
  { "Motor",
5
    "Kabel",
6
    "Batterie",
7
  };
8
9
...
10
11
12
  for( i = 0; i < Anzahl_Ueberschriften; i++ )
13
    UART1_send_string( Texte[i] );


Es ist ein Fehler, für alles den Preprozessor einsetzen zu wollen.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Schadeschade. Ich habe das Gefühl, bei mir wäre es schon sinnvoll:
mein Programm soll am Hyperterminal einen Infoschirm aufbauen. Mit 
Überschriften und Unterpunkten zur jeweils angewählten Überschrift.

Um das Programm einfach wiederverwenden zu können (darum gehts mir), 
dachte ich, muss man nur in der Heeaderdatei die Anzahl und Name der 
Überschriften sowie die Anzahl und Namen der Unterpunkte angeben- die 
Positionierung soll das Programm dann selber übernehmen.

Gibts denn da keine andere Möglichkeit?

von Karl H. (kbuchegg)


Lesenswert?

Stephan schrieb:
> Schadeschade. Ich habe das Gefühl, bei mir wäre es schon sinnvoll:

Was soll da sinnvoll sein?

Der Preprozessor kommt zum Einsatz noch ehe sich der COmpiler das 
Programm vornimmt. D.h. mit dem Preprozessor kannst du im Prinzip nur 
Dinge machen, die du auch mit deinem Texteditor machen kannst.
Alles was darauf abzielt, dass es zur Laufzeit des Programms erst 
entsteht, kann aus Prinzipgründen nicht vom Proeprozessor erledigt 
werden.

> mein Programm soll am Hyperterminal einen Infoschirm aufbauen. Mit
> Überschriften und Unterpunkten zur jeweils angewählten Überschrift.

Ja, und?

Definier dir eine Datenstruktur, füll die Werte aus und lass das 
Programm die Datenstruktur abarbeiten.

> Um das Programm einfach wiederverwenden zu können (darum gehts mir),
> dachte ich, muss man nur in der Heeaderdatei die Anzahl und Name der
> Überschriften sowie die Anzahl und Namen der Unterpunkte angeben-

So gross ist der UNterschied dann ja auch wieder nicht zu dem 
vorgeschlagenem. Ob du nun ein neues #define anlegst, oder ob du zum 
Array eine Zeile hinzufügst, ist arbeitsmässig .... kein Unterschied.
Der Compiler kann dir sogar noch unter die Arme greifen
1
const char* Texte[] =
2
  { "Motor",
3
    "Kabel",
4
    "Batterie",
5
  };
6
7
#define ARRAY_SIZE(x)  (sizeof(x)/sizeof(*x))
8
...
9
10
11
  for( i = 0; i < ARRAY_SIZE(Texte); i++ )
12
    UART1_send_string( Texte[i] );

jetzt brauchst du dich noch nicht mal mehr um die Anzahl kümmern.

> Gibts denn da keine andere Möglichkeit?
C gut genug lernen.

von Stephan (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Gibts denn da keine andere Möglichkeit?
> C gut genug lernen.

Musste Lachen! Dankeschön!

von Karl H. (kbuchegg)


Lesenswert?

> mein Programm soll am Hyperterminal einen Infoschirm aufbauen.
> Mit Überschriften und Unterpunkten zur jeweils angewählten
> Überschrift.


mal so als Idee skizziert.
Der Seitenaufbau ist zwischen den mit
 // ----
markierten Zeilen. Die Texte alleine helfen dir ja auch nicht weiter. Du 
musst die Einzelteile ja auch miteinander verknüpfen, so dass man von 
einer 'Seite' auf die nächste 'Subseite' kommt (falls es eine gibt).
1
#include <stdio.h>
2
3
struct InfoPage_;
4
5
struct InfoPoint_
6
{
7
  const char* Text;
8
  struct InfoPage_* subPage;
9
};
10
11
struct InfoPage_
12
{
13
  const char*        title;
14
  int                nrInfos;
15
  struct InfoPoint_* Infos;
16
};
17
18
typedef struct InfoPoint_ InfoPoint;
19
typedef struct InfoPage_  InfoPage;
20
21
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))
22
#define DEF_PAGE(n,t,a)                           \
23
InfoPage n = { t, ARRAY_SIZE( a ), a }; 
24
25
// --------------------------------------------
26
27
InfoPoint MotorInfos[] =
28
  {
29
    { "Batterie", NULL },
30
    { "Lichtmaschine", NULL },
31
    { "Oel", NULL },
32
  };
33
34
DEF_PAGE( MotorPage, "Motor", MotorInfos );
35
36
InfoPoint BordComputerInfos[] = 
37
  {
38
    { "Verbrauchsrechnung", NULL },
39
    { "Strecke", NULL },
40
    { "verbleibende Spritmenge", NULL },
41
  };
42
43
DEF_PAGE( ComputerPage, "Bordcomputer", BordComputerInfos );
44
45
InfoPoint ElektronikInfos[] =
46
  {
47
    { "Bordcomputer", &ComputerPage },
48
    { "ABS", NULL },
49
    { "ESP", NULL },
50
  };
51
52
DEF_PAGE( ElektronikPage, "Elektronik", ElektronikInfos );
53
54
InfoPoint LackInfos[] =
55
  {
56
    { "Rot", NULL },
57
    { "Blau", NULL },
58
    { "Gruen", NULL },
59
  };
60
61
DEF_PAGE( LackPage, "Lackierungen", LackInfos );
62
63
InfoPoint BezugInfos[] =
64
  {
65
    { "Anthrazit", NULL },
66
    { "Grau", NULL },
67
    { "Vettel-Gelb", NULL },
68
  };
69
70
DEF_PAGE( BezugPage, "Stoff-Bezuege", BezugInfos );
71
72
InfoPoint AutoInfos[] =
73
  {
74
    { "Lackierungen", &LackPage },
75
    { "Bezuege",      &BezugPage },
76
    { "Elektronik",   &ElektronikPage },
77
    { "Motor",        &MotorPage },
78
  };
79
80
DEF_PAGE( AutoPage, "Auto", AutoInfos );
81
82
// -----------------------------------------
83
84
void ShowPage( InfoPage* whichPage )
85
{
86
  int Auswahl = 0;
87
88
  while( 1 )
89
  {
90
    printf( "\n" );
91
    printf( "%s\n", whichPage->title );
92
    printf( "----------------------\n" );
93
94
    for( int i = 0; i < whichPage->nrInfos; i++ )
95
    {
96
      printf( "%2d %s\n", i, whichPage->Infos[i].Text );
97
    }
98
    printf( " 9 Zurueck\n" );
99
100
    printf( "\nAuswahl: " );
101
    scanf( "%d", &Auswahl );
102
103
    if( Auswahl == 9 )
104
      return;
105
106
    if( Auswahl > whichPage->nrInfos )
107
      printf( "Ungueltige Auswahl!\n" );
108
109
    else
110
    {
111
      if( whichPage->Infos[Auswahl].subPage != NULL )
112
        ShowPage( whichPage->Infos[Auswahl].subPage );
113
      else
114
        printf( "keine Information verfuegbar\n" );
115
    }
116
  }
117
}
118
119
int main()
120
{
121
  while( 1 )
122
  {
123
    ShowPage( &AutoPage );
124
  }
125
}

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

Heidewitzka!
Da muss ich erstmal eintauchen....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.