Hallo, bin relativ neu dabei und ätte da mal eine Frage, da ich langsam doch über die Blinkschaltung hinaus komme: Kann man aus einem Ergebnis heraus direkt auf eine Routine verweisen ? Ich setlle mir das z.B. so vor: Routinen[12]="Tudas"; Ergebnis=12; Routinen[Ergebnis](); Oder sind Bedingungen die einzige Möglichkeit ? Danke
Du kannst entweder vorher eine If-Abfrage machen: if (ergebnis==1) { .. } if (ergebnis==2) { ... } usw. oder du machst das ganze in einer Funktion mit übergabewert und machst das ganze dann in der Funktion. irgendeinfunktionsnamen(Ergebnis); Aber was willst du denn machen?
Meine Wahrsagekugel sagt, dass du vermutlich C meintst. Mit Zeigerarithmetik kann man solche unsauberen Dinge durchaus hinbekommen, sollte man aber nicht. Einfach mit if() Bedingung - das verstehst dann jeder später beim lesen des Quellcodes auch, und du selber in einem Jahr auch noch. if( Ergebnis == 12 ) Tudas(); oder bei vielen Bedingungen mit switch/case: switch(Ergebnis) { case 1 : tudas1();break; case 3 : tudas3();break; case 12 : tudas12();break; default: tunix(); } cu joern
Funktionspointer sind in C gängige Praxis und sehr effizient und überhaupt nicht dreckig. Hier mal ein Beispiel:
1 | typedef unsigned char u8; |
2 | |
3 | typedef u8 (*u8_fp_v)(void); |
4 | |
5 | extern u8 f0( void ); |
6 | extern u8 f1( void ); |
7 | extern u8 f2( void ); |
8 | |
9 | |
10 | u8_fp_v functions[] = { f0, f1, f2 }; |
11 | |
12 | |
13 | u8 call_nr( u8 nr ) |
14 | {
|
15 | if( nr >= sizeof(functions) / sizeof(u8_fp_v)) |
16 | return 0xFF; // out of table |
17 | |
18 | return functions[nr](); // execute function |
19 | }
|
Die Funktionen f0..f2 geben hier eine Byte zurück, mit dem man den Erfolg signalisieren kann. Wird versehentlich ein Funktionsindex übergeben, der außerhalb der Tabelle liegt, wird natürlich nichts ausgeführt, sondern 0xFF zurückgegeben. Ist auch ein schönes Beispiel für den sizeof Operator. Beim AVR-GCC gibt es noch einige Besonderheiten, wenn man die Tabelle in den Flash-Bereich legen will. Peter
Das mit den if-Abfragen u.s.w. war mir schon klar, so habe ich das ja auch bisher gemacht. Ich dachte mir nur einfach, dass die andere Möglichkeit eventuell effektiver wäre, was ich auch probieren werde, sobald ich den Beitrag von Peter Dannegger 100% verstanden habe (noch nicht mit Pointern gearbeitet) Danke ...
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.