Goto page Previous 1, 2
Patryk Sielski
Guest
Fri Mar 02, 2007 11:58 am
marcinuh <marcinuh@o2.pl> pisze:
Quote:
Hmm, a mo?esz wrzuci? przyk?ad jak si? w AVR-GCC kompiluje case? w mcc18 to
jest xor dla porównania i skok - trudno co? mniejszego i szybszego by by?o.
b8e: c7 36 cpi r28, 0x67 ; 103
b90: d1 05 cpc r29, r1
b92: a4 f4 brge .+40 ; 0xbbc
b94: c1 36 cpi r28, 0x61 ; 97
b96: d1 05 cpc r29, r1
b98: 54 f5 brge .+84 ; 0xbee
b9a: ca 35 cpi r28, 0x5A ; 90
b9c: d1 05 cpc r29, r1
b9e: 09 f4 brne .+2 ; 0xba2
Quote:
Rozumiem o co Ci chodzi, chcia?by? np. rozkazu u?y? jako indeksu w tablicy,
tablice by?yby tworzone po jednej dla kazdego protoko?u. Proponuj? tablice
wska?ników do funkcji, je?eli zadeklarujesz je jako void od(void), to nie
masz praktycznie ?adnego narzutu w kodzie i czasie na wywo?anie i powrót z
funkcji - nie trzeba pcha? na stos parametrów ani zwraca? warto?ci...
W takich sytuacjach zawsze staram si? pami?ta? o maksymie wyczytanej w
ksi??ce na temat programowania kernela - "do not try to be too smart"

.
To, żeby to przepisać jako funkcje już myślałem, alke to strasznie dużo
roboty jest i trzeba nieco pozmieniać te funkcje, bo czasem jeden rozkaz
wykonuje też i inny, ktgóry jest dalej.
BTW: Chyba zapytam za dwa tygodznie, jak wątek będzie świeży i zaznaczę,
że nie chodzi i o przepisanie tego na funkcję, bo z uporem godnym
lepszje sprawy proponuje mi sie te funkcje mimo, ze napisalem, że to
ostateczność.
--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl
J.F.
Guest
Fri Mar 02, 2007 12:41 pm
On Thu, 01 Mar 2007 23:20:41 +0100, Patryk Sielski wrote:
Quote:
OK, jest to interpreter pewnych protokołów.
Protokołów jest kilka. Rozkazów do wykonania-full.
W tej chwili jest tak:
switch (rozkaz)
case 'A' : wykonanie rozkazu 'A';break;
case 'B' : wykonanie rozkazu 'B';break;
case 'C' : wykonanie rozkazu 'C';break;
case 'D' : wykonanie rozkazu 'D'; // i jedziemy dalej wykonując rozkaz E
case 'E' : wykonanie rozkazu 'E';break;
wady rozwiązania:
1) na każdy protokół muszę mieć osobnego switcha
Jesli problemem jest dlugie "wykonanie rozkazu" to
mozesz wstepnie transkodowac do jednego protokolu..
Quote:
2) ten switch optymalizuje się tak dziwnie, że
argument porównywany jest kolejno z każdymi casem.
Na każdy case jest porównanie i skok i tak dalej.
Trwa to trochę. O wiele szybciej byłoby zrobić tabelę
i po prostu jechać po tabeli, jak się znajdzie - skok.
Kompilator powinien ocenic i zoptymalizowac. Czesto mu
wyjdzie ze tak jak powyzej jest najlepiej.
Quote:
Funkcje są pewnym rozwiązaniem, ale spowoduje to zbyt duże przypisywanie
kodu, tak więc szukam czegoś, żeby tylko te 'case' zamienić na jakieś
etykiety.
Ogolnie C nie przewiduje.
J.
Guest
Fri Mar 02, 2007 1:15 pm
On 2 Mar, 12:41, J.F. <jfox_xnosp...@poczta.onet.pl> wrote:
Quote:
On Thu, 01 Mar 2007 23:20:41 +0100, Patryk Sielski wrote:
Funkcje są pewnym rozwiązaniem, ale spowoduje to zbyt duże przypisywanie
kodu, tak więc szukam czegoś, żeby tylko te 'case' zamienić na jakieś
etykiety.
Ogolnie C nie przewiduje.
Ogólnie to owszem. Ale gcc posiada rozszerzenie, które w tym przypadku
może się nadać - skoki wyliczane. Wygląda to mniej więcej tak:
void *gdzie;
gdzie = &&etykieta;
...
if (costam) goto *gdzie;
...
etykieta: /* tu dalszy ciag programu */
Nie żeby kod miał przez to ładniej wyglądać, ale do interpretera może
się nadać.
Szeluś
Patryk Sielski
Guest
Fri Mar 02, 2007 1:39 pm
szelus@googlemail.com pisze:
Quote:
Ogólnie to owszem. Ale gcc posiada rozszerzenie, które w tym przypadku
może się nadać - skoki wyliczane. Wygląda to mniej więcej tak:
MISZCZ!
Dzięki!
--
Pozdrawiam,
Patryk Sielski
http://usprawnienia.pl
Artur M. Piwko
Guest
Fri Mar 02, 2007 1:41 pm
In the darkest hour on Thu, 01 Mar 2007 20:35:46 +0100,
Virus_7 <virus_7@WYTNIJ_TO.o2.pl> screamed:
Quote:
W jaki sposób pozyskać adres pewnego miejsca w programie w momencie
kompilacji?
Z tego co mnie uczyli, to nie powinno się używać instrukcji goto w takim
języku jakim jest C. Nie można tego rozwiązać inaczej? Konstrukcja
"switch() + case:"?
Źle uczyli. Przydaje się min. w sytuacji gdy chcesz zrobić
wielopoziomowy break lub nie chcesz dublować pewnych instrukcji
w instukcjach warunkowych obsługujących błąd w funkcji.
To oczywiście tylko niektóre z przykładów kiedy wolę goto.
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:226B ]
[ 13:29:48 user up 11268 days, 1:24, 1 user, load average: 0.06, 0.06, 0.06 ]
If it wasn't so cold out today, it would be warmer.
Virus_7
Guest
Fri Mar 02, 2007 5:16 pm
Artur M. Piwko napisał(a):
Quote:
Źle uczyli. Przydaje się min. w sytuacji gdy chcesz zrobić
wielopoziomowy break lub nie chcesz dublować pewnych instrukcji
w instukcjach warunkowych obsługujących błąd w funkcji.
To oczywiście tylko niektóre z przykładów kiedy wolę goto.
Ok. Przyjmuję do wiadomości. ;)
--
__ ___ * Pozdrawiam * ____
\ \ / (_)_ _ _ _ ___ |__ |
mailto://rot13.ivehf_7@b2.cy/
\ V /| | '_| || (_-< ___ / /
http://www.b3d.pl/
\_/ |_|_| \_,_/__/|___|/_/
gg://2812776/
Adam Wysocki
Guest
Fri Mar 02, 2007 7:41 pm
Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!
Quote:
Tak, to jest rozwiązanie, aczkolwiek ma pewne wady, ponieważ nie mogę
wskoczyć w środek funkcji na przykład
Jeżeli potrzebujesz wskoczyć w środek jakiejś funkcji z innej funkcji to
znaczy, że funkcja jest źle zaprojektowana.
Funkcja to czarna skrzynka. Opcjonalnie dostaje coś na wejście, robi coś
i opcjonalnie zwraca coś na wyjściu.
Quote:
etyk1:
bla();
etyk2:
bla2();
etyk3:
bla();
return;
Jeżeli naprawdę bardzo potrzebujesz, to sparametryzuj te skoki.
enum egoto {
GOTO1,
/* ... */
};
typedef enum egoto goto_t;
void f2(goto_t arg)
{
if (arg == GOTO1)
goto etyk1;
/* ... */
etyk1:
/* ... */
}
void f1(void)
{
f2(GOTO1);
}
--
Adam Wysocki * Warszawa *
http://www.chmurka.net/ * GSM: 514 710 213
FidoNet: 2:480/138, SWL: SP5-250730, QTH: KO02MF, CB: 19 Śródmieście
Pozbawił mnie sygnaturki strzał z dwururki (C) tren R @ appm 03.2003
Adam Wysocki
Guest
Fri Mar 02, 2007 7:41 pm
Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!
Quote:
O wiele szybciej byłoby zrobić tabelę i po prostu jechać po tabeli,
jak się znajdzie - skok.
A jeszcze szybciej wyszukiwać binarnie...
A jeszcze szybciej sparametryzować tabelę rozkazem.
#include <stdio.h>
static void hnd1(int param) { printf("hnd1, param=%d\n", param); }
static void hnd2(int param) { printf("hnd2, param=%d\n", param); }
static void hnd3(int param) { printf("hnd3, param=%d\n", param); }
static void parse(unsigned int rozkaz, int param)
{
typedef void (*fn_t) (int param);
const fn_t fn[] = {
hnd1, hnd2, hnd3
};
if (rozkaz >= sizeof(fn) / sizeof(*fn)) {
printf("blad\n");
return;
}
fn[rozkaz](param);
}
int main(void)
{
parse(0, 123);
parse(1, 456);
parse(2, 789);
parse(3, 0);
return 0;
}
Po uruchomieniu:
[gophi@avenger ~]$ ./dupa
hnd1, param=123
hnd2, param=456
hnd3, param=789
blad
[gophi@avenger ~]$
--
Adam Wysocki * Warszawa *
http://www.chmurka.net/ * GSM: 514 710 213
FidoNet: 2:480/138, SWL: SP5-250730, QTH: KO02MF, CB: 19 Śródmieście
ciezko wsunac pinezke pod kogos juz siedzacego (C) megan @ afhmm 2k3
Adam Wysocki
Guest
Fri Mar 02, 2007 7:41 pm
Spinacz biurowy, Patryk Sielski <psielski-usun@elka-usun.pw.edu.pl>!
Quote:
BTW: Chyba zapytam za dwa tygodznie, jak wątek będzie świeży i zaznaczę,
że nie chodzi i o przepisanie tego na funkcję, bo z uporem godnym
lepszje sprawy proponuje mi sie te funkcje mimo, ze napisalem, że to
ostateczność.
Bo to jest naprawdę dużo lepszy pomysł.
--
Adam Wysocki * Warszawa *
http://www.chmurka.net/ * GSM: 514 710 213
FidoNet: 2:480/138, SWL: SP5-250730, QTH: KO02MF, CB: 19 Śródmieście
Pozbawił mnie sygnaturki strzał z dwururki (C) tren R @ appm 03.2003
identyfikator: 20040501
Guest
Sat Mar 03, 2007 4:47 pm
a przy okazji, ktoś tu wspominał jak wstawia się fragmenty
assemblerowe do programu w C?
Marcin Stanisz
Guest
Sat Mar 03, 2007 7:49 pm
On Sat, 3 Mar 2007 16:47:25 +0100, identyfikator: 20040501 wrote:
Quote:
a przy okazji, ktoś tu wspominał jak wstawia się fragmenty
assemblerowe do programu w C?
Jest to opisane w manualu do avr-libc...
Pozdrawiam
Marcin Stanisz
--
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
Goto page Previous 1, 2