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 05:11 | Nová verze

    Incus, komunitní fork nástroje pro správu kontejnerů LXD, byl vydán ve verzi 7.0 LTS (YouTube). Stejně tak související LXC a LXCFS.

    Ladislav Hagara | Komentářů: 0
    dnes 05:00 | Nová verze

    Google Chrome 148 byl prohlášen za stabilní. Nejnovější stabilní verze 148.0.7778.96 přináší řadu novinek z hlediska uživatelů i vývojářů. Vypíchnout lze Prompt API (demo) pro přímý přístup k AI v zařízení. Podrobný přehled v poznámkách k vydání. Opraveno bylo 127 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 16:44 | Komunita

    Richard Hughes oznámil, že po společnostech Red Hat a Framework a organizacích OSFF a Linux Foundation, službu Linux Vendor Firmware Service (LVFS) umožňující aktualizovat firmware zařízení na počítačích s Linuxem, nově sponzorují také společnosti Dell a Lenovo. Do dnešního dne bylo díky LVFS provedeno více než 145 milionů aktualizací firmwarů od více než 100 různých výrobců na milionech linuxových zařízení.

    Ladislav Hagara | Komentářů: 0
    včera 15:22 | IT novinky

    Americké technologické společnosti Microsoft, Google a xAI souhlasily, že vládě Spojených států poskytnou přístup k novým modelům umělé inteligence (AI) před jejich uvedením na trh. Oznámila to americká vláda, která tak bude moci prověřit, zda modely nepředstavují hrozbu pro národní bezpečnost. Oznámení podtrhuje rostoucí obavy Washingtonu z rizik spojených s výkonnými AI systémy. Americké úřady chtějí v rámci předběžného přístupu

    … více »
    Ladislav Hagara | Komentářů: 0
    včera 14:11 | IT novinky

    Společnost Valve zveřejnila (GitLab) nákresy ovladače Steam Controller a puku. Pro všechny, kdo by jej chtěli hacknout nebo modifikovat, případně pro ně navrhnout nějaké příslušenství. Pod licencí Creative Commons (CC BY-NC-SA 4.0).

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Komunita

    PHP bylo dlouho distribuováno pod vlastní licencí – s výjimkou částí spadajících pod licenci Zend Engine. Po několikaleté práci se povedlo PHP přelicencovat na 3bodovou licenci BSD.

    Ladislav Hagara | Komentářů: 0
    včera 05:00 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube). Na Linuxu je vedle Qt frontendu nově k dispozici také GTK4 / libadwaita frontend.

    Ladislav Hagara | Komentářů: 19
    5.5. 20:22 | IT novinky

    Neziskové průmyslové konsorcium Khronos Group vydalo verzi 3.1 specifikace OpenCL (Open Computing Language). OpenCL je průmyslový standard pro paralelní programování heterogenních počítačových systémů.

    Ladislav Hagara | Komentářů: 0
    5.5. 13:11 | Nová verze

    Homebridge pro integraci chytrých domácích zařízení byl vydán ve verzi 2.0.0. Nově vedle protokolu HomeKit Accessory Protocol (HAP) podporuje standard chytré domácnosti Matter.

    Ladislav Hagara | Komentářů: 0
    5.5. 04:11 | Nová verze

    Omarchy je linuxová distribuce s dlaždicovým správcem oken Hyprland. Založena je na Arch Linuxu. Vydána byla v nové verzi 3.7.0 - The Gaming Edition. Z novinek lze vypíchnout příkaz omarchy a celou řadu herních možností.

    Ladislav Hagara | Komentářů: 2
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (9%)
     (2%)
     (14%)
     (32%)
     (4%)
     (7%)
     (3%)
     (16%)
     (24%)
    Celkem 1519 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    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: 335×
    #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.