Calocybe: Array-Elemente nicht variabel ansprechbar?

Beitrag lesen

Hello again!

In diesem Falle geht aber doch diese Unflexibilität bei Dir soweit, daß ich eben NICHT die Sprache in einer extra Variablen halten kann, so daß ich je nach deren Inhalt entweder die englische oder die deutsche Variante erhalte. Statt dessen muß ich hier den Programmcode anpassen ...

Richtig. Es ist aber C, und nicht Perl. Deswegen wuerde man kaum etwas schreiben, was Deiner Zeile
    $string = $sprachen{$language}->[1];
direkt entspricht. Vielmehr wuerde man etwas wie

char * GetTerm(char * language, int index) {
        if (strcmp(language, "english") == 0) {
            return sprachen.english[index];
        } else {
            return (strcmp(language, "deutsch") ? NULL : sprachen.deutsch[index]);
        }
    }

bauen und dann mit
    char * string = GetTerm(language, 1);
aufrufen. Da man die Language aber sowieso im ganzen Programm des oefteren abfragt, wuerde man es eigentlich noch anders machen. Naemlich einfach int-Werte definieren (0-english; 1-deutsch usw.) und nur einmal die Strings anschauen und eine int-Variable dementsprechend setzen.

Und solche Strukturen kann ich mir ja auch unter Perl basteln. Oder etwas einfacher - ich nutze einen weiteren Namensraum:
package sprachen;
my $english, $deutsch;

Sicher kannst Du dafuer ein eigenes Modul schreiben, aber das ist dann doch schon etwas weit ausgeholt. Fuer ein Objekt mit Eigenschaften und Methoden mag das ja angebracht sein, aber fuer ein einfaches struct mit zwei Membern? Da finde ich Deine Hash-Methode viel besser (die ganz nebenbei auch noch sehr flexibel ist). Uebrigens wird sowas auch in der perldsc manpage empfohlen.

Ich denke mal, daß Hashes in Perl über Hashes realisiert sind, weswegen sie wohl auch so heißen.

Na gut, das klingt irgendwie naheliegend. *g* Leider kenne ich mich mit Hashfunktionen nicht aus. Jedoch frage ich mich, funktionieren die denn auch vernuenftig mit so dynamischen Dingen wie einem Perl-Hash? Denn schliesslich ist die Groesse eines solchen im vorneherein nicht bekannt. Da kann man nicht einfach einen Bereich von 0 bis 99 (oft zu klein) oder bis 99999 (meist zu gross, kann aber trotzdem auch zu klein sein) annehmen. Wie handlet man denn sowas, bzw. sind Hashes ueberhaupt fuer sowas vorgesehen?

Aber sicher werden nicht alle Objekte in einer doppelt verketteten Liste durchsucht, wenn mit einem konkreten Key nach einem Wert suche!

Natuerlich nicht. Man kann die Schluessel aber beim Einfuegen sortieren, sodass man immer in der Mitte einer Menge nachschaut, ob der dortige Wert groesser oder kleiner als der gesuchte ist und damit nur noch in einer der beiden Haelften weitersuchen muss. Dadurch wird die zu durchsuchende Menge bei jedem Nachschauen halbiert. Mit maximal 32 Vergleichen kannst Du so einen Wert in einer Menge von 4 Milliarden finden. Den Namen dieses Verfahrens habe ich leider vergessen. Allerdings setzt dieses Verfahren einen direkten Index-Zugriff auf ein Array voraus, welcher bei einer verketteten Liste nicht gegeben ist. Man muss sich deshalb noch durch die Liste durchhangeln, was wiederum Zeit kostet. Aber soviel nun auch wieder nicht; ist also auf jeden Fall weitaus schneller als alle Elemente der Reihe nach zu vergleichen.

Assoziativ halt, weil Strings anstelle von Integern für die Keys verwendet werden.

Mal so nebenbei, kann man eigentlich auch was anderes als Strings (bzw. in Strings umgewandelte Integer) verwenden? Mmh... macht das ueberhaupt Sinn?

Calocybe