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
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
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?
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.
Karl Heinz Buchegger schrieb: >> Gibts denn da keine andere Möglichkeit? > C gut genug lernen. Musste Lachen! Dankeschön!
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.