select in C mit switch-case verknüpfen

Herakles

Profifragensteller
Moin!

Ich mache in der Sprache C ein select(2) auf 8 Filedescriptoren und will danach gucken, auf welchem Deskriptor was passiert ist. Jetzt kann man natürlich mit 8 if-abfragen prüfen, welcher aktiviert worden ist, das ist mir aber zu "unschön" und zuviel if. :)

Code:
for( i=0; i < GPIO_INPUTS; i++ ) {
	FD_SET( fileno(global.fd_gpio_in[i]), &gpio_fds );
}
select( fileno(global.fd_gpio_in[i]) + 1, &gpio_fds, NULL, NULL, NULL );
if( FD_ISSET( global.fd_gpio_in[0], &gpio_fds) { printf("1\n"); }
if( FD_ISSET( global.fd_gpio_in[1], &gpio_fds) { printf("2\n"); }
if( FD_ISSET( global.fd_gpio_in[2], &gpio_fds) { printf("3\n"); }
und so weiter....

Mir würde ein switch-case besser gefallen, ich weiß aber nicht, wie ich das realisieren könnte. Hat jemand eine Idee?

Danke für jede Hilfe!

Herakles
 
Ich denke in der Regel behandelt man das eher mit einer Schleife, grast alle fd's damit ab und guckt wer neue Daten hat.
 
Hi,

Vielleicht ist dies etwas OT, aber es sei moeglich ein switch-case aehnliches Szenario bzgl. Funktionsaufrufe darzustellen... wahrscheinlich ist dieser Loesungsansatz nicht wirklich anwendbar bzgl. den in SELECT(2) erwaehnten Makros (da es mir als Anfaenger im Hinblick auf Systemprogrammierung schlichtweg noch das Hintergrundwissen fehlt, aber ich bin fleissig am pauken)... nun ich versuchs trozdem mal:

Sei eine Menge an i Zustaenden (oder was auch immer) mit \forall i \in N_0: i < n gegeben, welche per spezifischer Funktion, gleicher Signatur behandelbar waeren oder auch koennten. Dann sei es moeglich sich eines Feldes, gebildet aus Funktionenzeigern, zu bedienen. Wobei die Inixierung die Menge an gegebenen Zustaenden, welche mittels eines Codes (oder aehnlichen) beschrieben (abgebildet seien) sind.
Code:
int tuhe_dies(void *argI, void *argJ);
int tuhe_das(void *argI, void *argJ);
int tuhe_jenes(void *argI, void *argJ);
	.
	.
	.
int tuhe_welches(void *argI, void *argJ);
dann koennte bspw. mittels
Code:
typedef int (*wirkung_t)(void *argI, void *argJ);
ein aus
Code:
struct wirkung_s
{
	wirkung_t dann;
};
gebildetes Feld
Code:
struct wirkung_s my_funcs[] =
{
	{ tuhe_dies 	},
	{ tuhe_das	},
	{ tuhe_jenes 	},
		.
		.
		.
	{ tuhe_welches	}
};
per
Code:
int wenn = IRRGEND_EIN_DATUM_VON_IRGENDWOHER;
	.
	.
	.
(void)my_funcs[wenn].dann(datensenke_p, datenquelle_p);
	.
	.
	.
usw.usf...
bspw. eine Problembehandlung moeglich sein... das kam mir so als erstes in den Sinn, ein switch-case-aehnliches-szenario zu basteln... ferner eignet sich anstatt eines Feldes zu bedienen das Verwenden einer Verketteten Liste unter Nutzung von Makros aus "sys/queue.h".

Da sind der Phantasie (fast) keine Grenzen gesetzt :-)
 
Last edited by a moderator:
switch-case geht nur mit konstanten Ausdrücken, also keine Funktionsaufrufe.

Ja, aber diese Konstanten können Funktionspointer sein. Wenn er jetzt ein Array von Funktionspointern hat und und den Index (vorzugsweise mit Boundscheck) in ein Array von Funktionspointern steckt. Und ja mit Inlineasm ist es möglich ein primtiven Ersatz für Closures zu bauen mit nen paar Instruktionen die die Parameter/Umgebung auf den Stack legen und zur eigentlich Funktion springt. Das Debuggen wird dann zu einem Krampf und C debugger auf die Nützlichkeit eines Monitors reduziert. Es geht, aber denkt gut drüber nach ob du es willst. Und hier kann man viele Kleinigkeiten falsch machen z.B. Caches nicht korrekt syncen. Memory barriers falsch implementieren etc.
 
Danke für Eure Antworten. Wenn ich mal VIEL Zeit habe, denk ich mich da vielleicht rein, aber für's Erste soll's die Schleife tun... :)

Grüße
Herakles
 
Back
Top