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 15:11 | IT novinky

    Miliardy korun na digitalizaci služeb státu nestačily. Stát do ní v letech 2020 až 2024 vložil víc než 50 miliard korun, ale původní cíl se nepodařilo splnit. Od loňského února měly být služby státu plně digitalizované a občané měli mít právo komunikovat se státem digitálně. Do tohoto data se povedlo plně digitalizovat 18 procent agendových služeb státu. Dnes to uvedl Nejvyšší kontrolní úřad (NKÚ) v souhrnné zprávě o stavu digitalizace v Česku. Zpráva vychází z výsledků víc než 50 kontrol, které NKÚ v posledních pěti letech v tomto oboru uskutečnil.

    Ladislav Hagara | Komentářů: 0
    dnes 13:55 | IT novinky

    Nadace Wikimedia, která je provozovatelem internetové encyklopedie Wikipedia, oznámila u příležitosti 25. výročí vzniku encyklopedie nové licenční dohody s firmami vyvíjejícími umělou inteligenci (AI). Mezi partnery encyklopedie tak nově patří Microsoft, Amazon a Meta Platforms, ale také start-up Perplexity a francouzská společnost Mistral AI. Wikimedia má podobnou dohodu od roku 2022 také se společností Google ze skupiny

    … více »
    Ladislav Hagara | Komentářů: 0
    dnes 02:22 | Nová verze

    D7VK byl vydán ve verzi 1.2. Jedná se o fork DXVK implementující překlad volání Direct3D 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.

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

    Byla vydána verze 12.0.0 knihovny libvirt (Wikipedie) zastřešující různé virtualizační technologie a vytvářející jednotné rozhraní pro správu virtuálních strojů. Současně byl ve verzi 12.0.0 vydán související modul pro Python libvirt-python. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 19:22 | Humor

    CreepyLink.com je nový zkracovač URL adres, 'díky kterému budou vaše odkazy vypadat tak podezřele, jak je to jen možné'. Například odkaz na abclinuxu.cz tento zkracovač převádí do podoby 'https://netflix.web-safe.link/logger_8oIlgs_free_money.php'. Dle prohlášení autora je CreepyLink alternativou ke zkracovači ShadyURL (repozitář na githubu), který dnes již bohužel není v provozu.

    NUKE GAZA! 🎆 | Komentářů: 3
    včera 12:33 | IT novinky

    Na blogu Raspberry Pi byla představena rozšiřující deska Raspberry Pi AI HAT+ 2 s akcelerátorem Hailo-10 a 8 GB RAM. Na rozdíl od předchozí Raspberry Pi AI HAT+ podporuje generativní AI. Cena desky je 130 dolarů.

    Ladislav Hagara | Komentářů: 3
    včera 12:11 | Komunita

    Wikipedie slaví 25. výročí svého založení. Vznikla 15. ledna 2001 jako doplňkový projekt k dnes již neexistující encyklopedii Nupedia. Doména wikipedia.org byla zaregistrována 12. ledna 2001. Zítra proběhne v Praze Večer svobodné kultury, který pořádá spolek Wikimedia ČR.

    Ladislav Hagara | Komentářů: 1
    včera 04:44 | Nová verze

    Po více než dvou letech od vydání předchozí verze 2.12 byla vydána nová stabilní verze 2.14 systémového zavaděče GNU GRUB (GRand Unified Bootloader, Wikipedie). Přehled novinek v souboru NEWS a v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    včera 02:22 | Nová verze

    Google Chrome 144 byl prohlášen za stabilní. Nejnovější stabilní verze 144.0.7559.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 10 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře (YouTube).

    Ladislav Hagara | Komentářů: 4
    včera 01:55 | Humor

    Microsoft zveřejnil zdrojový kód XAML Studia a uvolnil ho pod MIT licencí. XAML Studio je nástroj ze světa Windows, určený pro tvorbu uživatelského rozhraní aplikací pomocí XAML (Extensible Application Markup Language). Stalo se tak zhruba po osmi letech od prvního prohlášení Microsoftu, že se tento kód chystá zveřejnit.

    NUKE GAZA! 🎆 | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (4%)
     (0%)
     (9%)
     (19%)
     (3%)
     (6%)
     (3%)
     (11%)
     (43%)
    Celkem 457 hlasů
     Komentářů: 12, poslední 14.1. 21:12
    Rozcestník

    Dotaz: Ulozit 2x INT v poli char

    15.11.2017 15:48 darren97 | skóre: 4
    Ulozit 2x INT v poli char
    Přečteno: 867×
    Ahojte, potreboval by som radu, ako ulozit int do pola typu char. Napr. mam slovo "ahoj", ale v poli by som potreboval: 15s2ahoj ...cislo sizeof(int) potom jeden char -> cize 1 bajt potom zase cislo sizeof(int) a potom to slovo. Zaroven to tam dat a vediet cisla aj potom vybrat a dat to do premennej typu int. Pozicie tych cisel a pismenka medzi nimi budu vzdy na pevno od zaciatku pola a az potom bude nasledovat text co tam dam. Viete niekto ako na to?

    Řešení dotazu:


    Odpovědi

    15.11.2017 16:36 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    sprintf?
    Řešení 1× (darren97 (tazatel))
    kozzi avatar 15.11.2017 18:09 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    to asi neni to co chce, sice podle zadani by to tak i vypadalo ale neco mi rika ze to chce na urovni pameti, takze proste chce mit napriklad pole 20 charu, kde prvniu 4chary bude ten int, pak nejakej jeden char(znak), pak zase 4*char pro int a pak zbytech znaku retezce.

    Ja bych to tam nakopiroval pomoci memcopy, nebo primo.

    
    struct __attribute__((__packed__)) RetezecPrefix {
        int cislo1;
        char znak;
        int cislo2;
    };
    
    int main(int argc, char **argv)
    {
        // zpusob 1
        int cislo1 = 15;
        int cislo2 = 2;
        char znak = 's';
        char* cislo1c = (char*)&cislo1;
        char* cislo2c = (char*)&cislo2;
        char* ahoj = "ahoj";
        char* vysledne_pole = (char*)malloc((strlen(ahoj) + 1) + (2*sizeof(int)));
        memcpy(vysledne_pole, cislo1c, sizeof(int));
        vysledne_pole = vysledne_pole + sizeof(int);
        memcpy(vysledne_pole, &znak, 1); // vysledne_pole[0] = znak;
        vysledne_pole = vysledne_pole + sizeof(char);
        memcpy(vysledne_pole, cislo2c, sizeof(int));
        vysledne_pole = vysledne_pole + sizeof(int);
        memcpy(vysledne_pole, ahoj, strlen(ahoj));
    
        // zpusob2
        struct RetezecPrefix rp = {15,'s',2};
        char* vysledne_pole2 = (char*)malloc(strlen(ahoj) + sizeof(struct RetezecPrefix));
        memcpy(vysledne_pole2, &rp, sizeof(struct RetezecPrefix));
        vysledne_pole2 = vysledne_pole2 + sizeof(struct RetezecPrefix);
        memcpy(vysledne_pole2, ahoj, strlen(ahoj));
    
    
    	return 0;
    }
    
    Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
    16.11.2017 10:03 R
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    To je humus...zakladne nepochopenie zmyslu struct.
    #include <string.h>
    
    struct my_data {
            int cislo1;
            char znak;
            int cislo2;
            char text[];
    } __attribute__((__packed__));
    
    int main(void) {
            char pole[256];
            struct my_data *data = (void *)pole;
    
            data->cislo1 = 15;
            data->znak = 's';
            data->cislo2 = 2;
            strcpy(data->text, "nejaky text"); // pozor na buffer overflow
    
            return 0;
    }
    16.11.2017 14:33 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    Obojí výše uvedené je humus. Základní nepochopení smyslu union.

    16.11.2017 07:51 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    union intydzr
    {
        int i;
        char c[sizeof(int)];
    };
    
    Ale pozor na '\0'.
    Pochybnost, nejistota - základ poznání
    16.11.2017 07:54 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Jo a pozor na endianitu, pokud to má být přenosné.
    Pochybnost, nejistota - základ poznání
    16.11.2017 10:34 darren97 | skóre: 4
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Diky za navrhy, mam to skoro hotove :)
    16.11.2017 18:01 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    Tak já půjdu naschvál špatným příkladem, aneb prasárny s pointery a makry. Takhle se to dá třeba zařídit v čistém C, pokud nechceš používat nestandardní __packed__ kdesicosi.

    Jestli to má být portovatelné, pak by bylo dobré do toho pole místo obyčejných integerů přiřazovat htobe32(nějaký_integer) a číst je odtud pomocí be32toh(integer_z_pole). Tohle je popsané v man 3 endian.

    #include <stdio.h>
    
    #define ARRAY_TYPE(tail_size, type_name) \
      typedef char type_name[2 * sizeof(int) + sizeof(char) + tail_size]
    #define first_int(array) (*(int*)array)
    #define middle_char(array) (array[sizeof(int)])
    #define second_int(array) (*(int*)(array + sizeof(int) + sizeof(char)))
    #define tail_string(array) (array + 2 * sizeof(int) + sizeof(char))
    
    #define TAIL_STRING "ahoj"
    static const char *const TAIL = TAIL_STRING;
    static const size_t TAIL_SIZE = sizeof(TAIL_STRING) - 1;
    
    int main() {
      ARRAY_TYPE(TAIL_SIZE, Array);
      Array array;
    
      first_int(array) = 15;
      middle_char(array) = 's';
      second_int(array) = 2;
      for (const char *t = TAIL; *t; ++t)
        tail_string(array)[t - TAIL] = *t;
    
      printf("First int: %d\n"
             "Middle char: %c\n"
             "Second int: %d\n"
             "Tail string: ",
             first_int(array), middle_char(array), second_int(array));
      for (size_t i = 0; i < TAIL_SIZE; ++i)
        putchar(tail_string(array)[i]);
      putchar('\n');
    
      return 0;
    }
    
    16.11.2017 18:46 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Nádherná ukázka, jakým zvěrstvem se dá nahradit jednořádková funkce sprintf().
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    16.11.2017 19:08 kverulant
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Tak buď jste nepochopil tu ukázku, funkci sprintf(), nebo obojí.
    16.11.2017 20:31 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    Tak prosím, ten jednořádkový ekvivalent mé ukázky by mě opravdu zajímal. :-D Kdepak je?

    Mimochodem, odkdy sprintf() píše integery binárně po bytech? Že jsem si toho nějak nevšiml. Nesnažíš se doufám naznačit, že hrůza typu sprintf(string + sizeof(int) + sizeof(char), "%c%c%c%c", ((char*)&integer)[0], ((char*)&integer)[1], ...) by byla lepší…?

    16.11.2017 22:17 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    sprintf(str, "%d%c%d%s", cislo1, znak, cislo2, "ahoj");
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    16.11.2017 22:36 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    :-D Uf. To má být vtip? Vždyť to nedělá ani náhodou totéž co moje ukázka. Ptal jsem se na jednořádkový ekvivalent mé ukázky, nikoliv na něco náhodného jiného.

    Pravda, zadání je trochu nepřesné (hlavně kvůli tomu podivně zřetězenému příkladu). Já jsem zadání pochopil tak, že integer má být v tom poli binárně jako 4 byty — výslovně je tam zmínka o sizeof(int) —, nikoliv jako desítková textová reprezentace. String "2" nebo "15" opravdu nemá velikost sizeof(int).

    16.11.2017 23:03 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Copak mohu tušit, co dělá tvá ukázka? Odpovídám na původní dotaz. Vypusť si ze zadání nesmyslné sizeof() a máš to.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    16.11.2017 23:17 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    Moje ukázka ze zadání nic nevypouští. V tom je celá pointa. Prostě se snažím zadání interpretovat tak, aby v té interpretaci bylo co nejméně rozporů. Zadání se neptá, „jak zřetězit pár stringů“, ale mluví v podstatě o nějaké packed reprezentaci dat s fixní velikostí (sizeof(int) atd.). Přesně tu moje ukázka vytváří.

    Navíc zadání říká, že data se z toho pole mají dát získat zpátky. Tohle tvé řešení taky nesplňuje, například když zvolím ten char '3' a závěrečný string "1234".

    Jo, taky by se mi líbilo řešit věci tak, že půlku zadání vypustím a druhou půlku upravím — to by bylo fajn! :-D

    16.11.2017 23:40 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Aspoň má darren97 z čeho vybírat.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    17.11.2017 20:59 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Odpovídám na původní dotaz.

    Neodpovídáte.

    17.11.2017 21:02 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Jestli to má být portovatelné, pak by bylo dobré do toho pole místo obyčejných integerů přiřazovat htobe32(nějaký_integer) a číst je odtud pomocí be32toh(integer_z_pole).

    htonl(), ntohl() :-) Ale pak by ten protokol/formát nejspíš měl ta čísla na 32 bitů zarovnaná.

    17.11.2017 23:56 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char

    Tahle archaická sada funkcí/maker (většinou) nemá 64-bitové ekvivalenty, proto bych ji příliš nedoporučoval. Vůbec je smutné, že hton{l,s}()/ntoh{l,s}() jsou standardní POSIX, zatímco to, co jsem doporučoval, vůbec není standardizované. Ale aspoň to má 64-bitovou verzi a nesnaží se to jedno z možných pořadí bytů nazývat záhadně "network".

    18.11.2017 00:49 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Ulozit 2x INT v poli char
    Na tom označení není vůbec nic záhadného. Právě proto, že kdysi dávno padla u základních protokolů rodiny TCP/IP volba na big endian, má smysl ho pro síťovou komunikaci používat i dnes, přestože naprostá většina komunikujících systémů už je dnes little endian. I když je to technicky totéž, tím že mu budu říkat NBO místo BE, dávám najevo, že ho používám právě z těchto důvodů, ne proto, že jsem si (např.) hodil korunou.

    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.