abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 11:55 | Komunita

Vývojový tým OpenSSL ve spolupráci s iniciativou Core Infrastructure konsorcia Linux Foundation spustil proces přelicencování této kryptografické knihovny ze současné licence na licenci Apache Licence v 2.0 (ASLv2). Nová licence usnadní začleňování OpenSSL do dalších svobodných a open source projektů. Všichni dosavadní vývojáři OpenSSL (Authors) obdrží v následujících dnech email s prosbou o souhlas se změnou licence.

Ladislav Hagara | Komentářů: 7
včera 01:11 | Komunita

Před třemi týdny Mozilla.cz představila projekt Photon, jehož cílem je návrh a implementace nového vzhledu Firefoxu. Včera zveřejnila první náhled vzhledu Photon. Práce na projektu Photon jsou rozděleny do pěti týmů, které celkem čítají 19 lidí. Zaměřují se na zlepšení prvního spuštění Firefoxu a zaujetí nových uživatelů, celkovou úpravu vzhledu, zlepšení animací, zrychlení odezvy uživatelského rozhraní a také upravení nabídek. Vývoj lze sledovat v Bugzille.

Ladislav Hagara | Komentářů: 28
23.3. 20:00 | Komunita

OneDrive pro firmy je již ve webových prohlížečích na Linuxu stejně rychlý jako na Windows. Microsoft opravil chybu z listopadu loňského roku. OneDrive pro firmy běžel na Linuxu mnohem pomaleji než na Windows. V popisu chyby bylo uvedeno, že stačilo v prohlížeči na Linuxu nastavit v user-agentu Windows a vše se zrychlilo. Odpovědí Microsoftu bylo (Internet Archive: Wayback Machine), že Linux není podporován. Po bouřlivých diskusích na redditu i Hacker News byla chyba nalezena a opravena.

Ladislav Hagara | Komentářů: 6
23.3. 19:00 | Zajímavý projekt

Byla vyhlášena soutěž Hackaday Prize 2017. Soutěž je určena vývojářům open source hardwaru. Pro výherce je připraveno celkově 250 tisíc dolarů. Každý ze 120 finalistů získá tisíc dolarů. Nejlepší pak navíc 50, 30, 20, 15, 10 a 5 tisíc dolarů. Jedná se již o čtvrtý ročník soutěže. V roce 2014 zvítězil projekt globální sítě open source pozemních satelitních stanic SatNOGS. V roce 2015 zvítězil open source systém pro řízení elektrických invalidních vozíků pohybem očí Eyedriveomatic. V roce 2016 zvítězil modulární robot Dtto.

Ladislav Hagara | Komentářů: 0
23.3. 15:00 | Bezpečnostní upozornění

Byla vydána Samba ve verzích 4.6.1, 4.5.7 a 4.4.12. Řešen je bezpečnostní problém CVE-2017-2619. Pomocí symbolických odkazů a souběhu (symlink race) lze "teoreticky" získat přístup k souborům, které nejsou sdíleny. Linuxové distribuce jsou postupně aktualizovány (Debian).

Ladislav Hagara | Komentářů: 0
23.3. 07:43 | Nová verze

Na Steamu se objevil port hry Arma: Cold War Assault (Operation Flashpoint) pro Mac a Linux. … více »

creon | Komentářů: 30
23.3. 05:55 | Nová verze

Po 18 měsících od vydání verze 8.0 byla vydána verze 9.0 open source alternativy GitHubu, tj. softwarového nástroje s webovým rozhraním umožňujícího spolupráci na zdrojových kódech, GitLab. Představení nových vlastností v příspěvku na blogu a na YouTube.

Ladislav Hagara | Komentářů: 0
23.3. 03:33 | Komunita

Platnost posledního patentu souvisejícího s Dolby Digital (AC-3) vypršela. Po MP3 se tak do Fedory oficiálně dostane také kodek AC-3.

Ladislav Hagara | Komentářů: 5
23.3. 00:44 | Komunita

Feral Interactive, společnost zabývající se vydáváním počítačových her pro operační systémy macOS a Linux, nabízí své hry na Steamu vývojářům open source 3D grafické knihovny Mesa zdarma. Podmínkou je minimálně 25 commitů za posledních 5 let. Stejnou nabídku dostali vývojáři knihovny Mesa v roce 2015 od Valve. O rok dříve dostali od Valve tuto nabídku vývojáři Debianu a Ubuntu.

Ladislav Hagara | Komentářů: 0
22.3. 23:55 | Nová verze

Opera 44, verze 44.0.2510.857, byla prohlášena za stabilní. Nejnovější verze tohoto webového prohlížeče je postavena na Chromiu 57. Z novinek vývojáři Opery zdůrazňují podporou Touch Baru na nejnovějších MacBoocích Pro (gif). Přehled novinek pro vývojáře na blogu Dev.Opera.

Ladislav Hagara | Komentářů: 1
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (14%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 930 hlasů
 Komentářů: 72, poslední 1.3. 11:16
    Rozcestník

    Implementace Hello World v C (Ukazatele na funkce)

    25.2. 12:58 | Přečteno: 1178× | Ostatní | Výběrový blog | poslední úprava: 25.2. 12:56

    Trocha programátorských šprýmů...

    #include <stdio.h>
    
    #define	N(a)	(sizeof(a) / sizeof(a[0]))	
    
    void f1(char *s);
    void f2(void);
    void f3(char *s1, char *s2);
    
    int main()
    {	
    	int i;
    	
    	char *strings[] = {"Hello", NULL, "World"};
    	void (*array_pf[])() = {f1, f2, f3};
    	
    	
    	for (i = 0; i < N(array_pf); i++)
    		(*array_pf[i])(strings[i], "!!!\n");	
    	
    	return 0;
    }
    
    void f1(char *s)
    {
            printf("%s", s);
    }
    
    void f2(void)
    {
    	printf(" ");
    }
    
    void f3(char *s1, char *s2)
    {		
    	printf("%s%s", s1, s2);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
           

    Hodnocení: 60 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    xkucf03 avatar 25.2. 13:52 xkucf03 | skóre: 45 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Funkce se v C může volat s libovolným počtem parametrů a vezme si jen ty, které deklaruje?
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
    25.2. 14:41 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Štandart C - nie.
    Štandart C++ - áno.
    26.2. 21:48 .
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Ahá :-D
    25.2. 14:58 sad
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Já bych spíše řekl, že tohle je prasárna, protože jsem neuvedl typ argumentů v deklaraci ukazatele na funkci.

    S tímto už vyskočí hafo varovných hlášek:
    void (*array_pf[])(char *, char *) = {f1, f2, f3};
    Takže toho tučňáka byste mi měli odebrat :-)
    25.2. 15:04 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Snažíš sa aj o nejaký polymorfizmus, alebo sa len hraješ so smerníkmi?
    25.2. 15:11 sad
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Jen si hraju.
    Grunt avatar 26.2. 17:08 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Je (slovo) „smerník“ to co si myslím že je?
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    xxxs avatar 26.2. 17:27 xxxs | skóre: 17 | blog: vetvicky
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    ak myslis, pointer, ukazatel, tak ano. ak nie, tak som nevyvestil dobre.
    Grunt avatar 26.2. 17:37 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Priečinok, smerník, strážnik, nohavičky… co tam máte dál?
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    26.2. 18:55 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    dátovod :-)
    Grunt avatar 26.2. 19:03 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    …který se napojuje „rúrami“ a měří datojemem, ne? Doufám že až se narodím v příštím životě, narodím se na Slovensku.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    26.2. 20:35 citanus | skóre: 8 | Cork (Ireland)
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    : ) tot jsem potkal minuly tyden..

    class Predavac : public TransactionBroker
    26.2. 21:24 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)

    Ten termín jsem potkal ve slovenském překladu K&R, kde ho používali dost důsledně, ale netuším, jestli se opravdu ujal.

    který se napojuje „rúrami“

    Těmito? :-)

    Grunt avatar 26.2. 21:38 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Tyhle jsem myslel. Kupodivu překlad zklamal. Nedává smysl ještě víc než kdyby to těma rourama spojovali.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    26.2. 21:45 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Tyhle jsem myslel.

    To mi došlo - jenže právě tomu v té knize říkali dátovod.

    Grunt avatar 27.2. 09:16 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Aha. Tak potkat to někde a nevědět to, těžko bych to vykoumal.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    27.2. 02:27 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    kocka
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    xxxs avatar 3.3. 14:19 xxxs | skóre: 17 | blog: vetvicky
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    pod nohavickami uz nic.
    28.2. 23:27 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Slovo smerník som myslel ako pointér.
    25.2. 15:34 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Já bych spíše řekl, že tohle je prasárna, protože jsem neuvedl typ argumentů v deklaraci ukazatele na funkci.
    Ale uviedol, všimni si, čo je počiarknuté. void (*array_pf[])() = {f1, f2, f3}; To znamená, že odkaz na funkciu bude bez perametrov. V najnižšej hardvérovej úrovne je funkcia len adresa, na ktorú skočí vykonavať procesor program. Parametre funkcie hovoria, že čo sa spraví zo zásobníkom. O ich prípravu, uloženie, mazanie sa stará prekladač. A pri void (*array_pf[])(char *, char *) = {f1, f2, f3}; už očakáva, že prvy poľa budu smerniky na funkciu s 2 dvoma parametrami.

    A ignorovať paramatre (zásobnika) funkcií vieš. Naopak už to je iné.
    25.2. 15:37 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    To čo si definoval, je kvázi len rozhranie. A čo si dal do prvok pola, už môže byť (reálne) druhá vec.
    25.2. 15:44 sad
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Ale takto by to asi bylo čistější
    #include <stdio.h>
    #include <stdarg.h>
    
    #define	N(a)	(sizeof(a) / sizeof(a[0]))	
    
    void f1(char *s, ...);
    void f2(char *s, ...);
    void f3(char *s, ...);
    
    int main()
    {	
    	int i;
    	
    	char *strings[] = {"Hello", NULL, "World"};
    	void (*array_pf[])(char *, ...) = {f1, f2, f3};
    	
    	
    	for (i = 0; i < N(array_pf); i++)
    		(*array_pf[i])(strings[i], "!!!\n", 42);	
    	
    	return 0;
    }
    
    void f1(char *s, ...)
    {
            printf("%s", s);
    }
    
    void f2(char *s, ...)
    {	
    	printf(" ");
    }
    
    void f3(char *s1, ...)
    {
    	va_list pa;
    
    	va_start(pa, s1);	
    
    	printf("%s%s", s1, va_arg(pa, char*));
    	printf("%d", va_arg(pa, int));
    
    	va_end(pa);
    }
    
    26.2. 12:03 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Parametre funkcie hovoria, že čo sa spraví zo zásobníkom.
    To neni zaruceno. Vyuzivas toho, ze argumenty se vzdy predavaji v urcitem presne danem poradi bez znalosti prototypu funkce. Napriklad u ABI procesoru ARM je zaludnost v tom, ze pokud mas beznou funkci, tak hodnoty typu double/float se predavaji v odpovidajicich floating-point registrech, pokud je to variadicka funkce (napr. printf) tak se tyto hodnoty predavaji v beznych general-purpose registrech. Jinymi slovy, pokud budes provadet takove pretypovani, pouzijes odkaz na printf a nejaky double/float, nebude to fungovat.
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    1.3. 14:44 graviton
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    f() - To znamená, že odkaz na funkciu bude bez perametrov
    Nikoliv, to se v C řekne f(void). f() znamená, že to má nějaké neurčité argumenty, které se budou předávat podle pravidel pro varargs, čili jako kdyby tam bylo f(...).
    oryctolagus avatar 1.3. 15:04 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    To není pravda. f() je "old-style" deklarace a máš pravdu, že má neurčité argumenty (kompilátor z toho neví typ/počet), ale s varargs to nemá vůbec nic společného. f(...) je něco jiného.
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    1.3. 15:15 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Tak nějak. Tahle deklarace znamená, že funkce může mít ve skutečnosti libovolné parametry a je jen na volajícím a volaném, aby se trefili do stejných (nebo aspoň kompatibilních), překladač si myje ruce.
    pavlix avatar 1.3. 19:04 pavlix | skóre: 53 | blog: pavlix
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Až na to, že varargs k tomu navíc ještě pokud vím potřebují alespoň jeden specifikovaný argument.
    oryctolagus avatar 25.2. 22:45 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Funkce se v C může volat s libovolným počtem parametrů a vezme si jen ty, které deklaruje?
    Ne! On ty funkce přetypoval. IIRC to, co udělal, vede dle standardu k UB (undefined behaviour) a může vést k nečekaným vedlejším účinkům. Například, jaké číslo vytiskne následující program?

    #include <stdio.h>
    
    void __attribute__((noinline)) foobar(long a, long *p1) {
    	*p1 += a;
    }
    
    int main(int argc, char const *argv[])
    {
    	long x = 0;
    	void (*bastardized)(long) = foobar;
    
    	foobar(1, &x);
    	bastardized(1);
    
    	printf("%ld\n", x);
    
    	return 0;
    }
    

    Po přeložení gcc -O2 -S na x86-64:

    main:
    	subq	$24, %rsp
    	movl	$1, %edi
    	leaq	8(%rsp), %rsi
    	movq	$0, 8(%rsp)
    	call	foobar
    	movl	$1, %edi
    	call	foobar
    	movq	8(%rsp), %rsi
    	movl	$.LC0, %edi
    	xorl	%eax, %eax
    	call	printf
    	xorl	%eax, %eax
    	addq	$24, %rsp
    	ret
    

    Čiliže tohle je něco, co by se rozhodně nemělo dělat ;-)
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    xkucf03 avatar 25.2. 23:53 xkucf03 | skóre: 45 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    On ty funkce přetypoval.
    Kde? Na tomhle řádku jsou bez parametru:
    void (*array_pf[])() = {f1, f2, f3};
    A tady je všechny volá se dvěma parametry:
    (*array_pf[i])(strings[i], "!!!\n");
    A funkce ignorují parametry, které nedeklarovaly.

    Zkoušel jsem to zkompilovat a spustit – funguje to a nevypisuje jediné varování.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
    oryctolagus avatar 26.2. 00:12 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Na obou těch zmíněných řádcích se přetypovává - C je v tomhle dost liberální a celkem ochotně implicitně přetypovává. Je to v zásadě stejný případ jako:

    void (*ptr)();
    ptr(1, 2, 3);

    Nebo třeba:

    float f = 3.14;
    int *i = &f;
    

    Btw. C++ kompilátor tyhle implicitní konverze odmítne, tam by se musel udělat reinterpret_cast().
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    xkucf03 avatar 26.2. 22:08 xkucf03 | skóre: 45 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Mě na tom až tak neudivuje to, že to funguje, jako spíš to, že kompilátor nevypsal žádné varování.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
    oryctolagus avatar 26.2. 10:51 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Btw.:
    A funkce ignorují parametry, které nedeklarovaly.

    Zkoušel jsem to zkompilovat a spustit – funguje to a nevypisuje jediné varování.
    Ano, ale to je pouze šťastná náhoda, že ta dotyčná funkce nedělá nic s příslušnýma registrama a práce se stackem je taky zrovna náhodou kompatibilní. Nic z toho nemusí platit na jiné architektuře nebo třeba jen s jiným kompilátorem nebo nastavením. Když např. v tom kódu z n blogu upravim funkci f1 takhle:

    void f1(char *s, char *s2, void (*ptr)(char *))
    {
    	printf("%s\n", s);
    	char *str = "Wtf, why is this string printed?";
    	if (s != str) ptr(str);
    }
    

    "Funguje" mi to na x86-64 při přeložení pomocí gcc -O0 a gcc -O2 (protože úplnou náhodou funkce main ten třetí parametr jakoby nastavuje, resp. používá stejný registr pro procházení tím polem), už to ale nefunguje s clangem nebo gcc -O1.
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    26.2. 21:56 .
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Když funkci, která čeká tři parametry dáš jen dva, tak to možná nebude fungovat. Na to jsi přišel sám? Šikulka.
    oryctolagus avatar 26.2. 22:16 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    To, že to možná nebude fungovat, je celkem jasné. Zajímavější jsou ty případy, kdy to funguje nebo funguje nějak nečekaně, jako třeba s tím vypsáním toho stringu výše.
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    25.2. 15:50 Dušan Kreheľ | skóre: 7 | blog: krehel_sk___informovat_o_novych_verziach_softveru | Prešov
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Hraj sa, hraj ... lebo v reále ...
    27.2. 02:31 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Jsem tuhle viděl v kernelu funkci:
    dint &= (dint - 1);
    
    volanou ve smyčce. Taky dobrej hack (schválně zda to někdo popíše z hlavy, já si to musel rozepsat cyklus po cyklu).
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    27.2. 07:10 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Asi už mám příliš zdeformované myšlení, když "x & (x - 1)" považuju za standardní idiom (zejména když se výsledek použije jako bool). :-)
    27.2. 19:42 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Bool? Jako pro ukončení cyklu? V tom kernelu se to používalo na mazání jedniček zprava :-D.
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    27.2. 20:12 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    include/linux/log2.h:
    static inline __attribute__((const))
    bool is_power_of_2(unsigned long n)
    {
            return (n != 0 && ((n & (n - 1)) == 0));
    }
    

    Má to konstantní časovou složitost a lze to použít i v preprocesoru - viz makro BUILD_BUG_ON_NOT_POWER_OF_2().

    28.2. 21:09 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Taky dobrý použití. Já to mám odsuď (je to vlastně status bit pro každý zdroj přerušení v 32bit registru).
    721         while (dint) {
    722                 i = __ffs(dint);
    723                 dint &= (dint - 1);
    724                 phy = &pdev->phys[i];
    
    Mě právě překvapilo, že se nepoužilo vymaskování tou nalezenou jedničkou nebo ještě líp maskování 1<<[0..31], ale co já vím, možná to ARM dokáže nacpat do jedné instrukce :-D.
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    28.2. 21:31 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)

    Ta instrukce nevrátí tu nalezenou jedničku, ale její index, takže byste musel udělat něco jako

            dint &= ~(1 << i)
    

    tj. tři instrukce - a to si ještě nejsem jistý, jestli ten shift nebude pomalejší než bitové operace nebo odečtení jedničky.

    2.3. 23:17 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Právě, ono záleží na architektuře. Některý umí NAND instrukci. A v asm-generic je ta ffs funkce přes několik shiftů a podmínek (16/8/4/2/1 testy).
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    3.3. 06:41 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    ono záleží na architektuře. Některý umí NAND instrukci

    Je brzy ráno, neměl jsem ještě kafe, tak se dám se poddat: jak by mi v tomto konkrétním případě pomohla?

    5.3. 03:18 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Teda blbost ANDN, nějak se mi to plete :-D. Microblaze má něco jako tohle:
    x = a AND NOT b
    
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    xkucf03 avatar 28.2. 22:23 xkucf03 | skóre: 45 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    BTW: Jsou tyhle konstrukce/idiomy někde zdokumentované nebo se počítá s tím, že tomu případný čtenář bude rozumět? Co třeba nějaké komentáře nad tímto kódem? Částečně se to dá přirovnat k návrhovým vzorům – existuje nějaká jejich knihovna?l
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
    oryctolagus avatar 28.2. 23:12 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    BTW: Jsou tyhle konstrukce/idiomy někde zdokumentované
    Jj: Bit Twiddling Hacks.
    Částečně se to dá přirovnat k návrhovým vzorům
    Nééé, jen to ne. Technicky máš samozřejmě pravdu, dá se to k tomu přirovnat, ale byl bych radši, kdyby C zůstalo kargokultu tzv. návrhových vzorů ušetřeno...
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    1.3. 00:44 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Jsou tyhle konstrukce/idiomy někde zdokumentované nebo se počítá s tím, že tomu případný čtenář bude rozumět?
    Treba:
    • Warren H.S.: Hacker's Delight
    • Arndt J.: Matters Computational
    • Knuth D.: TAOCP Volume 4A – Combinatorial Algorithms, Part 1
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    2.3. 23:17 pc2005 | skóre: 32 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    No v té funkci to zdokumentované není, proto jsem si to musel pustit, abych to pochopil :-D. Já bych ten 32bit registr naivně testoval bit po bitu :-D (zase ono to tak moc nezpozdí).
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    15.3. 22:08 Pali
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Pri implementácii fínskeho stromu sa bežne používa "a & (a ^ (a - 1))" na iteráciu.
    Aminux avatar 27.2. 18:57 Aminux | HC city
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Našel by se tu někdo, kdo by ten kód (do)vysvětlil člověku, jenž zná trochu Javu a C minimálně?

    1 řádek, definuje konstantu N o velikosti a? Ten výraz v závorkách za tim vypočítává nějakou velikost, kterou pak přiřadí do tý konstanty, nebo co? Sizeof je, myslím, získání délky/velikosti, takže zjistí velikost "a" a podělí ji čím, polem a?

    Ty řádky void f (...); - to jsou funkce? A pokud jo, proč nemaji tělo ve složených závorkách, nebo je možno definovat nejprve takto funkci bez těla a pak ji použít?
    Když kradeš, kraď tak, aby to nikdo nepoznal. Vždycky se kradlo. Všichni si nakradli. A jsou za vodou. Páťa Tlučhoř
    Josef Kufner avatar 27.2. 19:06 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    V C je potřeba mít funkci alespoň deklarovanou, abys ji mohl „používat“. Definice (tj. včetně těla) funkcí jsou pak na konci. Trochu to souvisí s odděleným překladem.

    Řádek void (*array_pf[])() = {f1, f2, f3}; je temná magie, kterou když pochopíš, tak umíš ¾ jazyka C.
    Hello world ! Segmentation fault (core dumped)
    Grunt avatar 27.2. 20:01 Grunt | skóre: 22 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Přepíšu to s dovolením do BASICu:
    10 FOR A = 100 TO 300 STEP 100
    20 GOSUB A
    30 NEXT A
    40 END
    100 REM f1
    110 PRINT "Hello"
    120 RETURN
    200 REM f2
    210 PRINT " "
    220 RETURN
    300 REM f3
    310 PRINT "World!!!"
    320 RETURN
    
    akorát Céčko už je natolik pokročilý jazyk z budoucnosti že vše nejsou čísla řádků, ale adresy, takže do pole se nacpou jména funkcí a některá hvězdička je přežvýká na adresy a pak už je to úplně obyčejné GOTO, resp. jmp v assembleru a autor blogu s tím dělá machry. Odhadl jsem to špatně?
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    28.2. 16:20 sad
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    To N(a) v #define vrací velikost pole a je použito v cyklu for
    for (i = 0; i < N(array_pf); i++)
    Nedá se však použít u dynamicky alokovaného pole.

    Tenhle program bys také mohl napsat tak, že bys poslední prvek v poli ukazatelů na funkci nastavil na NULL.
    int main()
    {	
    	char *strings[] = {"Hello", NULL, "World"};
    	void (*array_pf[])(char *, ...) = {f1, f2, f3, NULL};
    	
    	print(array_pf, strings);	
    	
    	return 0;
    }
    
    void print(void (*apf[])(char *, ...), char *s[])
    {
    	while (*apf)
    		(*apf++)(*s++, "!!!\n", 42);	
    }
    
    Mimochodem zvyšování strings nebo array_pf pomocí operátoru ++ ti nebude fungovat ve funkci main(), protože obě proměnné jsou deklarovány jako pole ukazatelů a na pole nelze používat operátory ++ nebo --. Můžeš si však pomoci funkcí, která ve skutečnosti převede pole ukazatelů na ukazatel na ukazatele.

    C není moc snadný jazyk.

    oryctolagus avatar 28.2. 17:56 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Můžeš si však pomoci funkcí, která ve skutečnosti převede pole ukazatelů na ukazatel na ukazatele.
    Na to nepotřebuješ funkci, stačí přetypovat. Minimalistický příklad:

    #include <stdio.h>
    
    int main(int argc, char **argv) {
    	int pole[] = {1, 2, 3, 0};
    	for (int *ptr = pole; *ptr; ptr++) printf("%d\n", *ptr);
    	return 0;
    }
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED
    28.2. 21:41 Kvakor
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Ten výraz v závorkách za tim vypočítává nějakou velikost, kterou pak přiřadí do tý konstanty, nebo co? Sizeof je, myslím, získání délky/velikosti, takže zjistí velikost "a" a podělí ji čím, polem a?
    No, ona se ta velikost vlastně nepočítá, ale určí už během překladu, v přeloženém kódu je už jenom konstantní hodnota (proto to nejde použít na dynamická pole). Operátor sizeof vrací velikost, ale v bytech, takže pokud je pole z čehokoliv jiného, tak se musí podělit velikostí prvku. V praxi se to dělá spíš naopak, počet prvků je většinou známý předem a velikost se získává vynásobením velikostí prvku, např. stylem dynamicke_pole=ḿalloc(pocet_prvku*sizeof(typ_prvku)) ....
    Aminux avatar 1.3. 18:53 Aminux | HC city
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Děkuji fšem za odpovědi. Za to, že jste na mě tak hodní, slibuju, že tu nebudu (tolik) trollit (ovšem pokud nepříde otík1918 :-)).

    Projíždím si teď nějaké tutorialy - Itnetwork, knihy z uložto. Nemám až tak problém chápat základní principy, mám představu co je adresa/ukazatel, jak se adresuje paměť apod. Horší je, když se to začne různě kombinovat. V jedné knize jsem narazil na toto:

    char *(*( *var) () ) [10];

    Trochu se mi zamotala hlava, tak jsem si cvaknul něčeho ostřejšího (naštěstí máme domácí pálenku... :-)). Uvádí tam takový návod, že je dobrý číst to od prostředka. Tedy asi, že var je ukazatel na funkci, která vrací ukazatel na pole 10 prvků, které jsou sami ukazateli na char. Ufff....

    Jestli to nepletu, tak např. int (*fce) (); je ukazatel na funkci, zatímco int *fce (); je ukazatel na typ.

    Ještě jedno se chci zeptat, máte někdo zkušenosti s online IDE, plnohodnotná náhrada to asi není, nejspíš to bude nějak osekaný? Zkouším si hrát s tímto - https://www.tutorialspoint.com/compile_c_online.php, nechce se mi hned instalovat a babrat se s nějakým IDE, možná později.
    Když kradeš, kraď tak, aby to nikdo nepoznal. Vždycky se kradlo. Všichni si nakradli. A jsou za vodou. Páťa Tlučhoř
    Josef Kufner avatar 1.3. 19:12 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    … nechce se mi hned instalovat a babrat se s nějakým IDE, možná později.
    Celý Unix je IDE. Nainstaluj build-essential (metabalíček s gcc, make, libc-dev) a pak už potřebuješ jen textový editor.
    Hello world ! Segmentation fault (core dumped)
    oryctolagus avatar 1.3. 20:45 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Implementace Hello World v C (Ukazatele na funkce)
    Trochu se mi zamotala hlava, tak jsem si cvaknul něčeho ostřejšího (naštěstí máme domácí pálenku... :-)). Uvádí tam takový návod, že je dobrý číst to od prostředka.
    Tak, případně můžeš použít cdecl ...
    Shell v kostce: echo -e "\e[1;2r\e[?2l"  |  Java v kostce  |  Haskell v kostce  |  RESOLVED FIXED

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.