[linux-l] Function Pointer in C (was: java Klotz am Bein ?)

Rocco Rutte pdmef at cs.tu-berlin.de
Mi Mai 18 22:00:19 CEST 2005


Hi,

* Axel Weiß [05-05-18 21:21:18 +0200] wrote:

[...]

>wie machst Das das in C eleganter?

struct foo {
  char* key;
  int (*handle) (char* key, list_t* args, unsigned long data);
  unsigned long data;
};

Damit braucht man nur noch:

struct foo Foo[] = {
  { "foo",      handle1,        0 },
  { "bar",      handle2,        0 },
  { NULL,       NULL,           0 }
};

Und braucht quasi nur noch:

int config_exec (list_t* l) {
  int i = 0;
  while (Foo[i].key) {
    if (safe_strcmp (Foo[i], l->data[0]) == 0 && Foo[i].handle)
      return (Foo[i].handle (l->data[0], l, Foo[i].data));
    i++;
  }
  return (0);
}

int config_parse (const char* line) {
  list_t* l = list_from_str (line, " \t");
  int rc = config_exec (l);
  list_del (&l, _free);
  return (rc);
}

Vorurteilsfrei: das einzige, was ich in Java in dieser Richtung gesehen 
habe sind lange Orgien, wo mittels TokenizerIrgendwas ein String in 
String[] aufgespalten wurde und dann sowas wie:

if (t.getFirst.equals ("foo"))
  // behandle keyword "foo"
else if (t.getFirst.equals ("bar"))
  // behandle keyword "bar"
...

Der Vorteil an Callback ist IMHO, dass man nicht alles direkt in den 
Code frickeln muss, weil es dort nicht hingehört, und wenn es nur ein 
Aufruf pro Keyword ist. Man könnte ja auch auf die Idee kommen, solche 
Keywords von außen dynamisch hinzufügen zu wollen oder eine Liste mit 
allen Keywords haben zu wollen...

Auch wenn man da wild mit Pointern durch die Gegend schiesst, was 
manchmal gefährlich sein kann, erreicht man dadurch sauberes Information 
Hiding auch locker in C und man spart es sich, sehr viel Zeug immer 
direkt in den Code zu schreiben sondern packt es ordentlich in Methoden. 
Für ein Projekt habe ich zum Beispiel:

void* hash_new (int size);
...
void hash_map (void*, int (*mapfunc) (const char*, void*, unsigned long), unsigned long);

Es muss außer der Implementierung niemand wissen, wie ich die Tabelle 
organisiere bzw. ob es überhaupt eine Tabelle ist, ein Baum, was auch 
immer. Der Aufrufer bekommt bei der map-Funktion (ähnlich funktionalen 
Sprachen) nur den aktuellen Schlüssel, die dazugehörigen Daten und 
wahlweise extra Informationen. Da kann man sauber Funktionalität wie 
"nur bestimmte Schlüssel zurückgeben" aus der Tabelle raushalten.

Auch wenn da schrecklich viele Klammern, Sternchen und & drin vorkommen 
werden, so habe ich als derjenige, der nur das schlanke Interface kennt, 
quasi alle Möglichkeiten über den Callback.

Ich tendiere eher dazu, die generischsten EierLegendenWollmichSauen 
haben zu wollen, quasi supereinfachübersichtlich und trotzdem sehr 
mächtig. Das geht mit solchen Konstrukten IMHO ganz gut auch wenn die 
Gefahr besteht, dass man den Überblick verliert.

Ich will damit nicht sagen, dass ich Java per se nicht mag und C ja 
sowieso ganz toll ist, die Frage nach dem Wie war ernst gemeint.

  bye, Rocco
-- 
:wq!



Mehr Informationen über die Mailingliste linux-l