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í
×
    dnes 12:33 | Nová verze

    Český LibreOffice tým vydává aktualizaci překladu příručky LibreOffice Draw 25.8. Tato kniha se zabývá hlavními funkcemi programu Draw, vektorové grafické komponenty systému LibreOffice. Pomocí Draw lze vytvářet širokou škálu grafických obrázků. Příručka je ke stažení na stránce dokumentace a tým hledá dobrovolníky pro další překlady.

    ZCR | Komentářů: 0
    dnes 04:00 | IT novinky

    Anthony Enzor-DeMeo je novým CEO Mozilla Corporation. Mozillu převzal po dočasné CEO Lauře Chambers. Vybudovat chce nejdůvěryhodnější softwarovou společnost na světě. Firefox by se měl vyvinout v moderní AI prohlížeč.

    Ladislav Hagara | Komentářů: 3
    včera 17:11 | Nová verze

    Byla vydána nová verze 9.20 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze například nový balíček RustDesk Server pro vzdálený přístup.

    Ladislav Hagara | Komentářů: 0
    včera 14:44 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 3.4.0 video editoru OpenShot (Wikipedie). Představení novinek také na YouTube. Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | Nová verze

    Byla vydána nová verze 1.6 otevřeného, licenčními poplatky nezatíženého, univerzálního ztrátového formátu komprese zvuku Opus (Wikipedie) a jeho referenční implementace libopus. Podrobnosti na demo stránce.

    Ladislav Hagara | Komentářů: 3
    včera 01:33 | Komunita

    Vojtěch Polášek představil Vojtux, tj. linuxovou distribuci pro zrakově postižené uživatele. Vychází ze spinu Fedory 43 s desktopovým prostředím MATE. Konečným cílem je, aby žádný Vojtux nebyl potřeba a požadovaná vylepšení se dostala do upstreamu.

    Ladislav Hagara | Komentářů: 10
    včera 00:33 | Nová verze

    Byla vydána (Mastodon, 𝕏) druhá RC verze GIMPu 3.2. Přehled novinek v oznámení o vydání. Podrobně v souboru NEWS na GitLabu.

    Ladislav Hagara | Komentářů: 0
    15.12. 15:22 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 160 (pdf).

    Ladislav Hagara | Komentářů: 0
    15.12. 14:11 | IT novinky

    Izrael od února zakáže dětem používat v prostorách základních škol mobilní telefony. Podle agentury AFP to uvedlo izraelské ministerstvo školství, které zdůraznilo negativní dopady, které na žactvo používání telefonů má. Izrael se tímto krokem přidává k rostoucímu počtu zemí, které dětem ve vzdělávacích zařízeních přístup k telefonům omezují.

    Ladislav Hagara | Komentářů: 43
    15.12. 14:00 | IT novinky

    Internetová společnost Google ze skupiny Alphabet pravděpodobně dostane příští rok pokutu od Evropské komise za nedostatečné dodržování pravidel proti upřednostňování vlastních služeb a produktů ve výsledcích vyhledávání. V březnu EK obvinila Google, že ve výsledcích vyhledávání upřednostňuje na úkor konkurence vlastní služby, například Google Shopping, Google Hotels a Google Flights. Případ staví Google proti specializovaným

    … více »
    Ladislav Hagara | Komentářů: 9
    Jaké řešení používáte k vývoji / práci?
     (35%)
     (47%)
     (20%)
     (18%)
     (23%)
     (15%)
     (24%)
     (16%)
     (18%)
    Celkem 474 hlasů
     Komentářů: 19, poslední 11.12. 20:04
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Dotaz: argument list

    23.7.2011 19:55 Petr
    argument list
    Přečteno: 332×
    #include curses.h

    void eas_debug(int debug_level, char *str1, ...) { va_list args; va_start(args, str1); printf(str1, args); }

    int main() { eas_debug(1, "Hello, world! %d\n", 2); }

    Tento program mi na konzoli vypíše: "Hello, world! -1076085368". namísto "Hello, world! 2". Co dělám špatně ? Díky za postřehy, Petr

    Řešení dotazu:


    Odpovědi

    23.7.2011 21:35 mato
    Rozbalit Rozbalit vše Re: argument list
    Hm, toto ma celkom zaujalo. Nikdy som s varargs nerobil, i ked mi je to zname. Podla man page to ale skor vyzera, ze ty tak argumenty nemozes dat. Ak som to spravne pochopil, tak k ... pristupujes cez va_* macra. Tj:
    
    #include <stdio.h>
    #include <stdarg.h>
    
    void eas_debug(int debug_level, char *str1, ...) {
            va_list args;
            va_start(args, str1);
    
            while (*str1) {
                    switch (*str1++) {
                    case 'd' : {
                                    int a = va_arg(args, int);
                                    printf ("eas_debug%d: got int: %d\n", debug_level, a);
                                    break;
                            }
                    }
            }
    
            va_end(args);
    }
    
    int main() {
            eas_debug(1, "%d", 2);
            return 0;
    }
    
    
    a vystup:
    
    $ cc -Wall -o atest test.c
    $
    
    $ ./atest
    eas_debug1: got int: 2
    $
    
    
    
    24.7.2011 00:15 Petr
    Rozbalit Rozbalit vše Re: argument list
    jj to bych celkem chápal, ale já potřebuju funkci které můžu předhodit v tom variable listu různé typy argumentů, prostě aby se to chovalo stejně jako standartní printf.

    Např. eas_debug(1, "24test: %d%s", 2, "4") a potom třeba eas_debug(1, "24test: %s%d", "2", 4). Tim přístupem přes va_arg() z toho bude pěkná brutalita, jestli to vůbec jde?
    24.7.2011 00:36 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: argument list

    S obyčejným printf() tohle (předání všech parametrů najednou) neuděláte, ale právě proto existuje vprintf() a příbuzné funkce:

    void debug(unsigned l, const char* fmt, ...)
    {
      va_list v;
      if (l > debug_level) return;
      va_start(v, fmt);
      vfprintf(stderr, fmt, v);
      va_end(v);
    }
    

    Jinak samozřejmě můžete udělat i to, co navrhoval mato, a napsat si svou vlastní funkci, která bude parsovat format string a zpracovávat podle něj jednotlivé parametry. Pokud ale potřebujete jen nadstavbu nad standardní printf(), zbytečně byste tím jen duplikoval už hotovou práci.

    24.7.2011 00:46 mato
    Rozbalit Rozbalit vše Re: argument list
    pekne, na *printf family som nepomyslel .. takto to funguje ukazkovo.
    24.7.2011 11:16 Petr
    Rozbalit Rozbalit vše Re: argument list
    To je přesně ono, díky ..
    24.7.2011 00:40 mato
    Rozbalit Rozbalit vše Re: argument list
    kedysi davnejsie som sa dival na zdrojove kody printf, namatkovo som teraz grepol zdrojaky z FreeBSD, v sys/boot/arm/at91/libat91/printf.c je (pastujem iba pre tvoju otazku dolezite veci):
    void printf(const char *fmt,...) {
            va_list ap;
            va_start(ap, fmt);
            while ((c = *fmt++)) {
                            c = *fmt++;
                            switch (c) {
                            case 'c':
                                    xputchar(va_arg(ap, int));
                                    continue;
                            case 's':
                                    for (s = va_arg(ap, char *); *s; s++)
                                            xputchar(*s);
                                    continue;
    
    
    odkial ten printf pochadza je uplne jedno. osobne by som povedal, ze sa to ale teda nada spravit tak, ako si to mal na mysli.

    mozno ma ale niekto opravi..
    12.9.2011 23:48 Nikola Pajkovský | skóre: 16
    Rozbalit Rozbalit vše Re: argument list
    #define debug(...)                                                      \
            do {                                                            \
                    fprintf(stderr, "%s:%s():%d:",                          \
                            __FILE__, __func__, __LINE__);                  \
                    fprintf(stderr, __VA_ARGS__);                           \
                    fprintf(stderr, "\n");                                  \
            } while(0)
    
    nebo pres funkci
    void log_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
    
    Save the whales. Feed the hungry. Free the mallocs
    13.9.2011 00:22 zulu
    Rozbalit Rozbalit vše Re: argument list
    Předchozí odpovědi a varování o stáří diskuze jsi přehlédl, nebo jen ignoroval?
    13.9.2011 11:25 Nikola Pajkovský | skóre: 16
    Rozbalit Rozbalit vše Re: argument list
    nevidel jsem reseni, tak jsem poslal
    Save the whales. Feed the hungry. Free the mallocs
    13.9.2011 15:08 Sten
    Rozbalit Rozbalit vše Re: argument list
    Problém je v tom, že printf předáváte ukazatel na ty argumenty místo samotných argumentů. Pro použití s va_list je vprintf ;-)

    Založit nové vláknoNahoru

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

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