Fruit International

Obrazek ovoce

ani nevim, proc jsem ted nalil tu coca colu do akvaria

Fruit Intl. morálně podporuje následující projekty:

schemik.sourceforge.net
diagnose.sourceforge.net
www.rustina-preklad.cz
petruj.eu/blog/

Prasime v C - ON a GOTO

Momentalne tunim jednu aplikaci na vykon a presto, ze jsem pri posledni aplikaci, co jsem psal v Basicu nadaval jak spacek. Postesklo se mne po jedne uzasne basicove konstrukci -- ON <cislo> GOTO <adresa1>, <adresa2>...

Jelikoz instrukce goto se v nekterych kruzich nesmi ani vyslovit, bude asi velke rouhani uvazovat o jeji parametrizaci.

Predstavte si, ze mate smycku typu (viz nize) a tato smycka, probiha v aplikaci miliardkrat.

while (podminka) {
int operace = getOperace();
switch (operace) {
case 0: delej_neco(); break;
case 1: delej_neco_jineho(); break;
...
}
}
Vypada to docela efektivne. Problem je, ze pri kazdem pruchodu se testujji vsechny moznosti, dokud se ta spravna nenajde -- slozitost O(n) k poctu moznosti. Pri poctu milard pruchodu, uz to prestane byt zanedbatelne. Jedno reseni je usporadat hodnoty podle pravdepodobnosti. Ale to nebyva zrovna elegantni. Dalsi reseni je prasit...

Pri hledani informaci o inlinovani funkci, jsem objevil zajimave rozsireni GCC. Diky operatoru && muzete pristupovat k jednotlivym labelum jako k hodnotam.

Pozor -- toto funguje jenom v gcc, jestli je to dobre nebo spatne nevim, kazdopadne melo by se to pouzivat pouze pokud tusite co delate.

void *ptr;
if (a == 1) ptr = &&nejaky_label1;
else ptr = &&nejaky_label2;
...
goto *ptr;
...
nejaky_label1:
nejaky_label2:

Neni to sice nejlepsi priklad, ale kdyz si vezmeme ten priklad se switch, uz to muze byt uzitecnejsi

void * op_table[] = { &&case_0, &&case_1, &&case_2, ...}
while (podminka) {
goto *op_table[getoperace];
case_0: delej_neco(); goto complete;
case_1: delej_neco_jineho(); goto complete;
...
complete:
}

Je to sice malinko hardcore, ale obcas to dava i lepsi vysledky, jelikoz to ma konstantni slozitost vzhledem k poctu moznosti.

Clanek byl publikovan na blogu na servru www.abclinuxu.cz

Vytvořil(a) deda.jabko v 25. 02. 2007, 23:18


Přidat komentář