Verfasst: Sonntag 18. Oktober 2009, 20:06
SCNRkimx hat geschrieben:Jetzt gehts. Habe leider den Post mit der korrekten Methode nicht gesehen.
Sehr gutes Forum, danke nochmal
kimx
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
SCNRkimx hat geschrieben:Jetzt gehts. Habe leider den Post mit der korrekten Methode nicht gesehen.
Sehr gutes Forum, danke nochmal
kimx
Inwiefern?mikehydro hat geschrieben:Danke Hyperion.
Nun hast Du zum Abschluß noch eine schöne Schlammschlacht geliefert.
Hat hoffentlich gut getan.
Das ist hier im Forum eigentlich ein Standard!Ich bin jedenfalls nicht persönlich verbal beleidigend geworden.
Was denn? Ich kapiere den Bezug zum Satz davor nicht...Wo lernt man so was?
Inwiefern?Nun weiß hier jeder über Dich Bescheid.
Danke, ich bemühe mich stests. Jaja, ich weiß, das was Ironie von Dir. Ich nehme es aber mal als unironisches Kompliment aufDu hast ein tolles Niveau.
Pluralis majestatis?Wir sind stolz auf Dich.
Hab ich irgendwelche Beiträge von Hyperion überlesen oder hat der TS Halluzinationenmikehydro hat geschrieben:Danke Hyperion.
Nun hast Du zum Abschluß noch eine schöne Schlammschlacht geliefert.
Hat hoffentlich gut getan.
Ich bin jedenfalls nicht persönlich verbal beleidigend geworden.
Wo lernt man so was?
Nun weiß hier jeder über Dich Bescheid.
Du hast ein tolles Niveau.
Wir sind stolz auf Dich.
Ha, ich wußte doch ich hatte mal so etwas ausprobiert:pillmuncher hat geschrieben:Schon. Und die Ähnlichkeiten gehen weiter, da man ja auch in C ein Mapping funcname --> function bräuchte. Dem OP Viel Spaß beim selber bauen.Hyperion hat geschrieben:Wobei man sich doch auch in C einen Zeiger auf die Funktion merken würde, oder nicht? Speziell bei diesem Problem sehe ich da sogar durchaus Ähnlichkeiten zu C.pillmuncher hat geschrieben:Python != C, und eine Lösung, die in C gut ist, braucht deswegen nicht auch in Python gut sein.
Gruß,
Mick.
Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählenHyperion hat geschrieben:Ha, ich wußte doch ich hatte mal so etwas ausprobiert:
http://paste.pocoo.org/show/145708/
Ich finde die Zeilen 42-46 und dann der Aufruf in Zeile 53 zeigen doch sehr schön die Ähnlichkeit zu dicts in Python.
Code: Alles auswählen
struct funcmap {
char name[10];
void (*func)(void);
};
...
// define our mapping
struct funcmap dispatch[CALLS] = {
{"foo", foo},
{"bar", bar},
{"index", bar},
{"Zeitscheibe", Zeitscheibe}
};
Gäbe aber zumindest beim Compilieren ein Warningpillmuncher hat geschrieben: Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählen)
Code: Alles auswählen
struct funcmap { char name[10]; void (*func)(void); }; ... // define our mapping struct funcmap dispatch[CALLS] = { {"foo", foo}, {"bar", bar}, {"index", bar}, {"Zeitscheibe", Zeitscheibe} };
Stimmt! Da müßte man also irgend wie hashen, um die Zugriffszeit zu verbessern und näher an ein dict zu kommen. Ich sollte mir mal den C-Quellcode zum dict in Python angucken... vermutlich werde ich ihn wohl aber nicht durchschauenAußerdem ist die Suche nach der passenden Funktion O(n) (naja, bei drei oder vieren...). Nicht, dass dein Code irgendwie schlecht wäre, man programmiert halt so in C.
Klar. Ich wollte ja nur mal zeigen, dass es in C nicht unbedingt anders läuft. Letzteres scheint der OP ja super zu verstehen; evtl. hilft es ihm ja auf die Sprünge.Aber die Verwendung eines Python-dicts ist im Vergleich dazu die flexiblere, einfachere und fehlertolerantere Lösung, insbesondere deswegen, weil man dict nicht erst selber programmieren muss.
Danke für den Hinweis. Die Glib ist für C ja mittlerweile fast ein Muss. Werde mein Beispiel dahingehend mal anpassenlunar hat geschrieben:@Hyperion: Du kannst auch GHashTable nutzen.
Den Aufwand würde ich gar nicht treiben, sondern nur das char-Array vergrößern. Ist ja dein Code, und du weißt ja, wie lang deine Funktionsnamen sind. Vielleicht noch einen Kommentar daneben, damit man's nicht vergisst.Hyperion hat geschrieben:Gäbe aber zumindest beim Compilieren ein Warningpillmuncher hat geschrieben: Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählen)
Code: Alles auswählen
struct funcmap { char name[10]; void (*func)(void); };
Müßte man also statt dem char-Array einen Zeiger auf ein solches nehmen und dann die Länge beim Anlegen dynamisch allocieren?
Vielleicht wollte er auch nur zu erkennen geben, dass er eine "richtige" Programmiersprache kann, statt "bloß" eine "Scriptsprache". Aber wahrscheinlich nicht, denn man soll ja von den Menschen immer nur das beste denken......nur mal zeigen, dass es in C nicht unbedingt anders läuft. Letzteres scheint der OP ja super zu verstehen; evtl. hilft es ihm ja auf die Sprünge.
Gemäß Murphys Law vergisst man es irgendwann aber doch, und den Fehler muss man dann erstmal finden.pillmuncher hat geschrieben:Den Aufwand würde ich gar nicht treiben, sondern nur das char-Array vergrößern. Ist ja dein Code, und du weißt ja, wie lang deine Funktionsnamen sind. Vielleicht noch einen Kommentar daneben, damit man's nicht vergisst.
Für seine Zwecke nichts... Manchmal habe ich den Hang, die gestellte Frage genau zu beantworten; gelegentlich ist sie ja auch tatsächlich genau so gemeint und sinnvoll. Hier wären aber die dictionary- oder deque-Lösungen, die direkt das Funktionsobject beinhalten, besser.Hyperion hat geschrieben:Und was genau ist daranbesser / leichter verständlich alsCode: Alles auswählen
def tolle_funktion(s): print "Hipp, Hipp,", s func_name = tolle_funktion.func_name # Aufruf dann... eval(func_name)("Hurra!")
?Code: Alles auswählen
def tolle_funktion(s): print "Hipp, Hipp", s func = tolle_funktion func("Hurra!")
Und noch "eigentlicher" ist sie im Code konstant, da die Anzahl der Funktionen im Voraus veststeht.pillmuncher hat geschrieben:Außerdem ist die Suche nach der passenden Funktion O(n) (naja, bei drei oder vieren...).
Und wenn du jetzt noch verstehst, warum es funktioniert, aber warum man es so auf keinen Fall machen sollte, dann hast du etwas wichtiges gelerntmikehydro hat geschrieben:Zum Abschluß nochmal danke an bords0.
Diese Antwort hat mich am besten weitergebracht.
Das was Du hier schreibst funktioniert prima.
EyDu hat geschrieben:Und noch "eigentlicher" ist sie im Code konstant, da die Anzahl der Funktionen im Voraus veststeht.pillmuncher hat geschrieben:Außerdem ist die Suche nach der passenden Funktion O(n) (naja, bei drei oder vieren...).
Code: Alles auswählen
for(int i=0; i<CALLS; i++) {
if(strcmp(dispatch[i].name, argv[1]) == 0) {
dispatch[i].func();
return 0;
}
}
Code: Alles auswählen
#define CALLS 3
...
// define our mapping
struct funcmap dispatch[CALLS] = {
{"foo", foo},
{"bar", bar},
{"index", bar}
};
Link? Laut Leonidas soll das zumindest in comp.lang.c (Recht groß?) nicht der Fall sein. Und ich hab noch von keiner nicht-C Version von Ulrich "WTF is this crap" Drepper gehört (ohne damit sagen zu wollen, daß alle C Programmierer so wären).In den C-Foren klappt das besser. Ohne Überheblichkeit.
Könnte man. Übringens könntest du noch alle Elemente der Struktur "const" machen. (Wobei ich gar nicht weiß, ob das bei Funktionszeigern klappt).Müßte man also statt dem char-Array einen Zeiger auf ein solches nehmen und dann die Länge beim Anlegen dynamisch allocieren?
Wenn du dir einfache C Implementationen für solche Datenstrukturen ansehen willst: Ich habe vor kurzer Zeit diese Seite gefunden. Sieht recht gut aus, hab ich aber selbst nur oberflächlich durchgeschautIch sollte mir mal den C-Quellcode zum dict in Python angucken... vermutlich werde ich ihn wohl aber nicht durchschauen Very Happy
Ja, der Suchalgorithmus ist linear, das will ich auch gar nicht bestreiten. Mir ging es hier um die konkrete Ausprägung mit drei Elementen. Dafür ist es sehr einfach eine Abschätzung mit konstanter Schranke zu machen.lunar hat geschrieben:@EyDu: Wie definierst Du denn eine "lineare Suche"?! Und worauf willst Du mit deinem Quelltextausschnitt hinaus?
Im Allgemeinen jedenfalls ist es völlig ohne Belang, ob die Anzahl der Eingabewerte nun zufälligerweise konstant ist oder nicht. Der gezeigte Suchalgorithmus ist linear, und sofern der gesuchte Name nicht ebenfalls konstant ist, kann der Compiler das auch nicht in einen Zugriff in konstanter Zeit optimieren.