Re: konstante Arrys Kategorie: Programmierung (von Steffan - 24.01.2007 19:11) | ||
Als Antwort auf Re: konstante Arrys von olaf - 24.01.2007 16:03 | ||
| ||
Hallo Olaf, dein Lösungsansatz gefällt mir gut. Ich werde es einfach mal mit dieser Variante ausprobieren. Dann vergleiche ich mal die beiden. Das ist halt auch immer eine Gewöhnungssache. Es gibt eben immer viele Wege zum gleichen Ziel. Für mich ist es eben wichtig, den Code wartungsfreundlich zu gestalten. So bleibt der erneute Einarbeitungsaufwand trotz Dokumentation gering. Also besten Dank für den Denkansatz. Viele Grü�e Steffan > Hallo Steffan, > ich kenne keine funktion wie Array.lenght in c2 die du hier benötigst um die vom > compiler bestimmte Länge zu ermitteln. > Aber programatisch könnte man es entweder durch eine spezielle array end Markierung lösen (z.B. "-1"), > bis zu welcher deine Schleife dann läuft. > In meiner Haussteurung habe ich die gesamte Menü Darstellung und Navigation allerdings sehr generisch > gelöst. Dort exisistieren mehrere grosse arrays, die menu-item tags, typen, ressourcen > und unter menü-strukturen definieren. > Die algorithmen sind generisch und rekursiv, so dass sich (theoretisch) beliebig tiefe menü > strukturen aufbauen lassen. Die array Konstanten sehen dann so aus: > > > const MENU_TAGS[] = "Hauptmenü", // 0 > "untermenü1", // 1 > "untermenü2", // 2 > > const MENU_TYPE[] = MENUITEM_SUBMENU, //0 > MENUITEM_SUBMENU, //1 > MENUITEM_SUBMENU, //2 > > const MENU_RESOURCES[]= 0, //0 > 0, //1 > 0, //2 > 0, //3 > > const MENU_SUBSTART[] = 1, //0 > 10, //1 > 20, //2 > > const MENU_SUBEND[] = 6, //0 > 15, //1 > 22, //2 > > > > > das hei�t in dem fall das ein Menüeintrag ein untermenü beschriebt, so sind an der selben index position > von SUBSTART und SUBEND die offsets in das untermenü definiert. > Die Algorithmen für anzeige und navigation bzw. aktionsauslösung im menü arbeiten damit lediglich > auf dieser struktur und sind rekursiv. > > > function navigateMenu( byte pcfLCD, byte startingPos ) returns byte > { > menuPos pos; > > pos.firstDisplayedLine = c.MENU_SUBSTART[ startingPos ]; > pos.selectedLine = c.MENU_SUBSTART[ startingPos ]; > pos.startingLine = c.MENU_SUBSTART[ startingPos ]; > pos.endingLine = c.MENU_SUBEND[ startingPos ]; > pos.refreshNeeded = 1; > > > zur Anzeige des Hauptmenüs wird diese funktion dann einfach von dem für das betreffende Display > zuständigen thread so aufgerufen: > > menu.navigateMenu(pcfLCD,0); > > jeder Untermenü Aufruf ruft die funktion rekursiv auf. > > Damit gibt es nirgendwo eine Schleife oder ähnliches die über die arraystrukturen läuft, > sondern sie beschrieben sich selbst. > Das gesamte menü sowie die Menü/Untermenüstruktur wird lediglich über die Arraykonstanten definiert. > > Das nur so als Tip. Funktioniert bei meiner Lösung schon seit 4 Jahren wunderbar und die Architektur > hat schon entliche Erweiterungen "überlebt". > > ... sorry code kann ich leider nicht zur Verfügung stellen.. > > Gru� Olaf > > > > > Hallo, > > > > ich hab heute mal intensiv Lektüre und natürlich auch das Forum zu einer Problemstellung > > zu konstanten Arrays befragt, aber leider doch keine Antwort gefunden. Und zwar geht es um > > folgendes Problem: > > > > Ich habe konstante benannte Arrays deklariert und möchte nun in meinem Programm die Anzahl > > der Elemente ermitteln. Ich komm hier einfach nicht auf eine passende Idee. Das sieht ungefähr > > so aus: > > > > const MENUE1[] = "Füllen", "Michen", "Leeren"; > > const MENUE2[] = "Heben", "Senken"; > > ... > > > > Nun möchte ich auf die einzelnen Elemente der Arrays zugreifen. Dazu durchlaufe ich eine Schleife > > und lese die Elemente über den Index aus. > > > > str = MENUE1[i]; > > > > Da die einzelnen Arrays eine unterschiedliche Anzahl von Elementen besitzen, brauche ich dazu > > die Anzahl der Elemente, sonst kommt es zu einer Verletzung des zulässigen Indexbereiches. > > In VBA gibt es zu diesem Problem eine Lösung z.B. mit "UBound()". > > Gibt es hier auch so etwas ähnliches? > > > > Wäre super, wenn mir jemand weiterhelfen könnte. > > > > Viele Grü�e > > Steffan | ||
Antwort schreiben Antworten: |