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

    Byl vydán Debian 13.6, tj. šestá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.15, tj. poslední patnáctá opravná verze Debianu 12 s kódovým názvem Bookworm, k dispozici je LTS. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

    Ladislav Hagara | Komentářů: 0
    10.7. 16:11 | Bezpečnostní upozornění

    V jádře Linux byla nalezena a v upstreamu již byla opravena kritická zranitelnost GhostLock aneb CVE-2026-43499. Lokálnímu uživateli umožňuje získat práva roota a také obejít kontejnerovou izolaci. Zranitelnost existovala v Linuxu 15 let, tj. od roku 2011, od Linuxu verze 2.6.39.

    Ladislav Hagara | Komentářů: 2
    10.7. 13:55 | IT novinky

    Evropská komise předběžně shledala, že návykový design aplikací Instagram a Facebook od americké společnosti Meta porušuje unijní nařízení o digitálních službách (DSA). Návykový design zahrnuje například takzvané nekonečné posouvání, automatické přehrávání videí, tzv. push notifikace, kdy aplikace uživatele vybízí k návratu do jejího prostředí, či vysoce personalizovaný algoritmus, který rychle pozná, co uživatele baví a snaží

    … více »
    Ladislav Hagara | Komentářů: 8
    10.7. 12:11 | Nová verze

    Byla vydána verze 1.97.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    10.7. 05:00 | IT novinky

    Švýcarská společnost Punkt. má nově v nabídce telefon Punkt. MC03. Telefon byl navržen ve Švýcarsku s důrazem na soukromí a digitální suverenitu a vyroben v Německu. V telefonu běží operační systém AphyOS (Apostrophy OS) založený na AOSP (Android Open Source Project) 15. Cena telefonu je 745 eur.

    Ladislav Hagara | Komentářů: 20
    10.7. 04:44 | Nová verze

    TypeScript (Wikipedie), tj. JavaScript rozšířený o statické typování a další atributy, byl vydán v nové verzi 7.0. Kompilátor byl kvůli výkonu přepsán z TypeScriptu do Go.

    Ladislav Hagara | Komentářů: 0
    9.7. 17:00 | IT novinky

    Europarlament podpořil pozměněnou verzi výjimky známé jako „chat control 1.0“ umožňující firmám skenovat soukromou komunikaci na internetu kvůli ochraně dětí před zneužitím. Pozměňovací návrhy přijaté europoslanci však počítají s tím, že z výjimky bude vyřazena šifrovaná komunikace. Výjimka přestala platit začátkem dubna poté, co se Evropský parlament a Rada EU nedokázaly shodnout na jejím prodloužení. Rada následně přijala

    … více »
    Ladislav Hagara | Komentářů: 12
    9.7. 04:44 | Bezpečnostní upozornění

    Nejnovější X.Org X server 21.1.24 a Xwayland 24.1.13 řeší 2 bezpečnostní chyby.

    Ladislav Hagara | Komentářů: 0
    9.7. 04:22 | Komunita

    Clement "Clem" Lefebvre publikoval souhrn dění v Linux Mintu za červen 2026. Vypíchnuta je vylepšená podpora Waylandu. Už není považována za experimentální. V příští verzi Linux Mintu, plánována je na Vánoce, bude běh Cinnamonu plně podporován na X11 i Waylandu. V květnu na vývoj Linux Mintu přispělo 611 dárců celkovou částkou 19 612 dolarů. Dalších 2 326 patronů přispělo na Patreonu celkovou částkou 5 334 dolarů.

    Ladislav Hagara | Komentářů: 4
    9.7. 04:00 | Bezpečnostní upozornění

    V Linuxu v KVM byla nalezena a v upstreamu již byla opravena kritická zranitelnost Januscape aneb CVE-2026-53359. Root na hostovaném počítači (virtuální stroj) může obejít izolaci a získat plnou kontrolu nad hostitelským systémem (DoS útok nebo vzdálené spuštění kódu s právy roota). Na obou hlavních architekturách – Intel i AMD. Zranitelnost v Linuxu existovala téměř 16 let (od srpna 2010 do června 2026).

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (17%)
     (31%)
     (4%)
     (6%)
     (2%)
     (16%)
     (25%)
    Celkem 2101 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Změna typu existujících integerů v poli

    25.2.2020 09:33 Jirka | skóre: 25
    Změna typu existujících integerů v poli
    Přečteno: 756×
    Zdravím všechny,
    Mám např. uint32_t array[10000000] s existujícími obrazovými daty, se kterými provedu nějaké výpočty, nakonec všechny prvky v poli odmocním, takže se vejdou do 16bit prostoru a také je chci uložit pomocí fwrite jako 16bit raw.

    Dá se to nějak provést bez tvorby ještě jednoho pole uint16_t o stejné velikosti? Ideálně změnit typ už vytvořeného pole, tj. na stejných adresách se zachováním hodnot a to pak uložit. Nebo přesvědčit fwrite, aby ukládal jen posledních 16bitů z každého prvku a to ostatní ignoroval (tedy ani nevyplňoval nulama). Raspberry jedno velké pole ustojí, se dvěma už má občas problém.
    Díky.
    Dokud to funguje, nešťourej se v tom!...

    Řešení dotazu:


    Odpovědi

    Řešení 1× (Jirka (tazatel))
    25.2.2020 09:56 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Vytvořit si pomocné pole uint16_t temparr[] a ve smyčce do něj ukládat části původního pole a ty zapisovat?
    
    #define TA_LEN 1000;
    
    static inline void zkonvertuj_dalsi_cast_pole(uint16_ * temparr, uint32_t * array, size_t index, size_t TA_LEN)
    {
      ...
    }
    
    void foo(void)
    {
      FILE file;
      size_t index = 0;
      uint16_t temparr[TA_LEN];
      ...
      while(pole_jeste_neni_zpracovano)
      {
        zkonvertuj_dalsi_cast_pole(temparr, array, index, TA_LEN);
        fwrite(temparr, sizeof(temparr), 1, file);
        index += TA_LEN;
      }
      ...
    }
    V příkladu samozřejmě není ošetřená případná chyba fwrite() nebo stav kdy TA_LEN není soudělné s počtem prvků pole array[]
    Užívej dne – možná je tvůj poslední.
    25.2.2020 10:19 Jirka | skóre: 25
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Díky, dobrej nápad! :-)
    Přesná velikost pole je [12216864], to je dělitelné 32, takže bude stačit pole uint16_t [381777], to už by mělo projít.
    Dokud to funguje, nešťourej se v tom!...
    25.2.2020 12:48 debian+
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Co tak bez dalsieho pomocneho ukladat?
    uint32_t array[10000000];
    uint32_t *index;
    size_t i;
    
    for(index=array, i=0; i <= 10000000; i++, index++)
    {
    	fwrite(*((uint16_t) index), sizefof(uint16_t), 1, FD);
    }
    
    /* este raz a citatelnejsie */
    uint32_t array[10000000];
    uint32_t *index;
    uint16_t u16;
    size_t i;
    
    for(index=array, i=0; i <= 10000000; i++, index++)
    {
    	u16=(uint16_t) *index;
    	fwrite(u16, sizefof(uint16_t), 1, FD);
    }
    
    Ono takto definovane by sa vo funkcie malo vytvarat na zasobniku. A to nemusi az tak v tentokrat u Andruido prospievat. Nechces pripadne allokovat pre beh programu tuto pamet cez malloc.
    25.2.2020 13:00 debian+
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Na druhej strane, preco ukladat fwrite po 1 bajte, ked sa da naraz? Hm, to nove pomocne pole sa potom zide. Alebo to mozes skonvertovat v tom istom poli.
    25.2.2020 14:03 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Tipuju, že tohle bude násobně až řádově pomalejší oproti zápisu po blocích.
    Užívej dne – možná je tvůj poslední.
    25.2.2020 19:51 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli

    Ůůůfff. Tohle ale mlčky předpokládá Little Endian, kde se dá jenom tak přetypovat uint32_t* na uint16_t* a ty dolní byty tam budou. Na Big Endian tam bude všude nula (horní byty).

    25.2.2020 19:53 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli

    Ne, beru zpět, neumím číst. Pointer se tady nepřetypuje, takže je to OK.

    25.2.2020 19:45 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Dá se to nějak provést bez tvorby ještě jednoho pole uint16_t o stejné velikosti?

    Ano. Například nějak tahle (convert_in_place(...)):

    #include <errno.h>
    #include <fcntl.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    static const size_t SIZE = 100000;
    typedef uint16_t narrow_array_t[SIZE];
    typedef uint32_t wide_array_t[SIZE];
    typedef uint16_t (*narrow_array_ptr)[SIZE];
    typedef uint32_t (*wide_array_ptr)[SIZE];
    
    ////////////////////////////////////////////////////////////////////////////////
    static narrow_array_ptr convert_in_place(const wide_array_ptr wide_array) {
      const uint32_t *source = *wide_array;
      uint16_t *dest = (uint16_t*)source;
      const uint16_t *const end = dest + SIZE;
      while (dest < end) *dest++ = *source++;
      return realloc(wide_array, sizeof(narrow_array_t));  // free extra memory
      // return (narrow_array_ptr)wide_array;              // keep extra memory
    }
    ////////////////////////////////////////////////////////////////////////////////
    
    static int dump_array_to_file(const char *const file_name,
                                  const narrow_array_ptr narrow_array) {
      const int output = open(file_name,
                              O_WRONLY | O_CREAT | O_TRUNC,
                              S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
      if (output == -1) {
        fputs(strerror(errno), stderr);
        return EXIT_FAILURE;
      }
      int result = EXIT_SUCCESS;
      size_t to_write = sizeof(narrow_array_t);
      uint8_t *buffer = (uint8_t*)narrow_array;
      while (to_write) {
        const ssize_t written = write(output, buffer, to_write);
        if (written == -1) {
          result = EXIT_FAILURE;
          fputs(strerror(errno), stderr);
          break;
        }
        buffer += written;
        to_write -= written;
      }
      if (close(output) == -1) {
        fputs(strerror(errno), stderr);
        return EXIT_FAILURE;
      }
      return result;
    }
    
    int main() {
      // Allocate and populate an array of 32-bit integers.
      uint32_t (*const wide_array)[SIZE] = malloc(sizeof(wide_array_t));
      if (!wide_array) {
        fputs(strerror(errno), stderr);
        return EXIT_FAILURE;
      }
      for (size_t i = 0; i < SIZE; ++i) (*wide_array)[i] = i % 16384;
    
      // Compact 32-bit integers into 16-bit integers in-place.
      uint16_t (*const narrow_array)[SIZE] = convert_in_place(wide_array);
      
      // Write compacted array to standard output, just for fun.
      const uint16_t *const end = *narrow_array + SIZE;
      for (uint16_t *number = *narrow_array; number < end; ++number)
        printf("%d, ", *number);  // unchecked!
      putchar('\n');              // unchecked!
    
      // Write the compacted array into a binary file.
      int result = dump_array_to_file("/tmp/output", narrow_array);
      
      free(narrow_array);
      return result;
    }
    

    Pokud se nepletu, tento^^^ kód nezávisí na endianness, protože nedělá žádné podivné bitové operace. Tedy na BE vyrobí binární soubor v BE, na LE vyrobí binární soubor v LE. (A pokud se pletu, hned se mi bude někdo posmívat, takže dobře mi tak.)

    Nebo přesvědčit fwrite, aby ukládal jen posledních 16bitů z každého prvku a to ostatní ignoroval (tedy ani nevyplňoval nulama).

    Ano, tohle by taky šlo, ale musel by se ten fwrite() (nebo write()) volat SIZE-krát, vždycky na ty 2 byty, což by bylo celkem ošklivé a navíc by to bylo závislé na endianness, tj. muselo by se podle LE/BE správně určit, které 2 byty vypsat.

    25.2.2020 20:44 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Ergo
    uint16_t *tmp=(uint16_t*)array;
    for (i=0;i<10000000;i++,tmp++)
      *tmp=array[i];
    fwrite(array,10000000,sizeof(uint16_t),FD);
    
    Načo si tam písal tých ostatných 76 riadkov?
    25.2.2020 21:14 Jirka | skóre: 25
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Tak díky všem, hoši, to by stačilo, už to zbytečně komplikujete. :-D
    Dokud to funguje, nešťourej se v tom!...
    25.2.2020 21:37 debian+
    Rozbalit Rozbalit vše Re: Změna typu existujících integerů v poli
    Bud rad, ze sme nezacali pisat v ASM.

    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.