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 22:00 | Komunita

Portál Stack Overflow po roce opět vyzpovídal své uživatele, jedná se především o vývojáře softwaru, a zveřejnil (podcast) detailní výsledky průzkumu. Průzkumu se letos zúčastnilo více než 64 tisíc vývojářů. Jejich nejmilovanější platformou je linuxový desktop. Ten je také druhou nejpoužívanější platformou vývojářů.

Ladislav Hagara | Komentářů: 0
24.3. 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
24.3. 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ářů: 38
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
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (14%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 932 hlasů
 Komentářů: 72, poslední 1.3. 11:16
    Rozcestník

    Dotaz: Pointer k multidim. array ako parameter pre funkciu (C++)

    26.10.2010 00:33 PeterS. | skóre: 10
    Pointer k multidim. array ako parameter pre funkciu (C++)
    Přečteno: 430×

    Ahoj
    toto je otázka ktorá suvisí s mojimi predošlými dvoma otázkami, snažím sa na nete najisť nejaký návod ale nejako mi to nejde.
    Mám array, povedzme image_ar[width][height][4], pričom výška a šírka (obrázka) nie je pevne daná, záleží od obrázka ktorý programu predhodím.
    Potrebujem tento array dať ako parameter funkcii - ale ako pointer - aby sa zmeny urobené vo vnútri funkcie odrazili aj v main.

    našiel som napríklad tento príklad:

       // three dimensions with pointer
       void function(int (*a)[20][30]);
       int array[10][20][30];
       function(array);


    ale jednak mi nie je jasné, ako to urobiť, keže ja vopred prvý a druhý rozmer array nepoznám a potom neviem ako by som mal s daným array pracovať. Čítať pozície a vkladať do pozícií...

    Takže ešte raz prosím o pomoc a navedenie

    vďaka


    Odpovědi

    26.10.2010 05:04 zulu
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    toto je otázka ktorá suvisí s mojimi predošlými dvoma otázkami
    Podle nich bych řekl, že žádné šaškování s polem nepotřebuješ a, jak ti Messa napsal hned v první odpovědi, vystačíš s funkcemi CImg.
    #include "cimg/cimg.h"
    #include "cimg/examples/img/CImg_demo.h"
    
    using namespace cimg_library;
    
    void func(CImg<unsigned char> &img, int x, int y)
    {
      img(x,y) ^= 255;
    }
    
    int main()
    {
      CImg<unsigned char> image(data_foot,200,200,1,3,false);
      CImgDisplay disp(image);
      while (!disp.is_closed()) {
        disp.wait();
        if (disp.button()) {
          func(image, disp.mouse_x(), disp.mouse_y());
          disp = image;
        }
      }
      return 0;
    }
    26.10.2010 08:16 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    No cimg umožnuje prave ukladanie iba integerov 0-255, ja si RGB hodnoty vytiahnem, aplikujem gamu a konvertujem na rozsah 0-1 - a povedzme po dalších operáciach sa tieto môžu dostať do rozsahu povedzme na -0.5 - 1.5. Takže potrebujem aj ten Cimg obrázok - ako zdroj dat, ale pracovné dáta by boli v tejto multidimenzionalnej array... a na konci by sa zase konvertovali do rozsahu 0-255 a uložili ako obrazok...
    26.10.2010 10:46 zulu
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Fajn, tak třeba takhle:
    class mydata
    {
      float *data;
      unsigned dimx, dimy, dimz;
    public:
      mydata(unsigned dx, unsigned dy, unsigned dz)
      {
        dimx = dx; dimy = dy; dimz = dz;
        data = new float[dimx * dimy * dimz];
      }
      ~mydata()
      {
        delete[] data;
      }
      float& operator()(unsigned x, unsigned y, unsigned z)
      {
        return data[y*dimx + x*dimz + z]; // toto je teda asi to, na co ses ptal
      }
    };
    
    void func(mydata &d)
    {
      float a = d(0,0,0);
      d(0,0,0) = a;
    }
    
    int main()
    {
      unsigned sirka = 10, vyska = 10;
      mydata d(sirka, vyska, 4);
      func(d);
    }
    27.10.2010 08:36 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    Takže nakoniec som sa rozhodol že to skusim s týmto kódom, vyzerá že to funguje, ale mám otázku ku 'unsigned sirka = 10, vyska = 10' - dobre tomu rozumiem, že výška a šírka môže byť iba do 255?
    Ked som do func dal toto:

    void func(mydata &d)
    { 
     d(500,10,5)=0.6;        // treti parameter akceptovalo 5 ????
     cout << d(500,10,5); 
     } 

    int main()
    {
     unsigned sirka = 1000, vyska = 10; // unsigned vs 1000 ????
     mydata d(sirka, vyska, 4);
    ... }


    tak nerozumiem prečo to funguje, vid komentáre pri kode...

    Keby si sa mi vedel ku tomu vyjadriť - aby som nezačal stavať ten program na niečom čo nepracuje korektne a aby som nemusel neskôr to komplikovane meniť....


    Inak, nemal by sa tam niekde vyskytovať takéto niečo: 'x+sirka*y+sirka*vyska*z'. Máš tam nejaké vzorce ale celkom nerozumiem čo majú robiť...

    27.10.2010 09:03 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    A proč by to fungovat nemělo? Když si nezkontrolujete meze sám, nikdo to za vás neudělá. Ale stejně pořád nechápu, proč tak zarputile trváte na použití pole pro něco, k čemu se vůbec nehodí (reprezentace pixelu). Pokud se chcete C++ opravdu naučit, bez struktur a tříd to nepůjde.

    Inak, nemal by sa tam niekde vyskytovať takéto niečo: 'x+sirka*y+sirka*vyska*z'. Máš tam nejaké vzorce ale celkom nerozumiem čo majú robiť...

    Ano, ten index prvku počítaný jako y*dimx + x*dimz + z je samozřejmě nesmysl, buď by tam mělo být x*dimy*dimz + y*dimz + z (po řádcích) nebo y*dimx*dimz + x*dimz + z (po sloupcích). To, co navrhujete vy, by sice fungovalo také, ale považoval bych za vhodnější, aby hodnoty jednoho pixelu byly pohromadě (pokud už tedy z nějakého důvodu trváte na reprezentaci složek pixelu polem).

    27.10.2010 09:45 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    ako som už povedal - možno ste to prehliadli - C++ sa venujem týžden, jediný iný jazyk ktorý poznám je python a aj ten tak na strednej úrovní. Triedam proste nerozumiem, určite by bolo dobre ich ovládať a raz možno budem, ale teraz potrebujem niečo čo budem mať plne pod kontrolou a budem tomu rozumieť. Ten váš navrh som vybral preto že mu aspon tak na 30 % rozumiem. Dokonca by som ho chcel zmodifikovať takto:

    {
    if (x >= dimx) {
    cout << "Out of scope: x >= dimx" << "\n";
    exit (1) ;}
    else if (y >= dimy) {
    cout << "Out of scope: y >= dimy" << "\n";
    exit (1) ;}
    else if (z >= dimz) {
    cout << "Out of scope: z >= dimz" << "\n";
    exit (1) ;}
    return data[x*dimy*dimz + y*dimz + z];
    }

    Skusim isť zatiaľ touto cestou... a dufam že sa už konečne dostanem ku tomu čo ma zaujíma - práca s obrázkami....

    27.10.2010 10:01 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    Jen pro pořádek: to není můj návrh. :-)

    A technická poznámka: chybová hlášení patří na chybový výstup (std::cerr), ne na standardní (std::cout).

    27.10.2010 10:26 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    cerr som upravil, inak technická otázka, hodnoty pre stlpce/riadky/"vrstvy" ak je veľkost definovaná ako 10 su v rozmedzi 1-10. Nie 0-9, správne? Ale v "data" sa ukladajú od nuly, teda tento posledný riadok som upravil tiež:

      {
    if (x > dimx || x == 0) {
    cerr << "Out of scope: x = " <<< "\n";
    exit (1) ;}
    else if (y > dimy || y == 0) {
    cerr << "Out of scope: y = " << y << "\n";
    exit (1) ;}
    else if (z > dimz || z == 0) {
    cerr << "Out of scope: z = " <<< "\n";
    exit (1) ;}
    return data[x*dimy*dimz + y*dimz + z-1]; // tu som pridal -1 !
    }

    Vyzera to správne?
    27.10.2010 10:33 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    To samozřejmě záleží na tom, co přesně má znamenat x a y. Pokud to je od nuly do w-1 a h-1, pak je to v pořádku, pokud ne, musíte tu jedničku odečíst. Co se "z souřadnice", tedy barevných složek pixelu, týká, k tomu už jsem své řekl tolikrát, že mne to už opravdu nebaví opakovat.
    27.10.2010 10:54 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    ta "-1" sa netýka špecificky z-tka. Ide oto že ak data ma veľkosť x*y*z, tak pixel uplne prvý pixel v prvej farbe ( 1,1,1 ) ukladá svoju hodnotu do data[0] (bez ohľadu na vzorec), a pixel x,y,z ukladá svoju hodnotu do poslednej pozície v data a to je práve data[x*y*z-1].

    Len sa snažím pochopiť ako celá ta schéma pracuje. Co je triviálne pre vás nie je triviálne aj pre mna.

    A FAKT som vdačný za pomoc...
    26.10.2010 13:11 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    To nepůjde, neznámý může být pouze jeden rozměr pole, a to ten první. Jinak by volaná funkce nevěděla, jak adresovat jednotlivé prvky pole, protože k tomu potřebuje znát všechny rozměry kromě prvního.

    Jednou možností je předat to takto:

      void fce(float (*a)[4], unsigned w, unsigned h)
    

    a ve funkci index pole a dopočítávat. Případně si rozmyslete, jestli nebude lepší si na to rovnou nenapsat třídu, např. nějak takto (při reprezentaci po řádcích):

    struct pixel {
      float r;
      float g;
      float b;
      float a;
    };
    
    class image {
    protected:
      pixel* data;
    
    public:
      unsigned width;
      unsigned height;
    
      image(unsigned w, unsigned h);
      ~image() { delete [] data; }
    
      pixel*& operator [](unsigned y) { return (data + y*width); }
    };
    
    image::image(unsigned w, unsigned h)
      : width(w), height(h)
    {
      data = new pixel[w*h];
    }
    
    26.10.2010 13:12 Sten
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Jednoduše předejte referenci (je to C++, tak žádný pointer!) na trojdimenzionální pole:
    void function(int*** &a)
    Samozřejmě musíte potom ještě nějak funkci předat rozměry.

    Pokud byste to ale chtěl opravdu C++, tak si to pole obalíte nějakým objektem, které bude spravovat rozměry i alokace:
    #include <boost/noncopyable.hpp>
    #include <boost/scoped_array.hpp>
    #include <stdexcept>
    
    
    class Image
        : private boost::noncopyable
    {
    public:
        Image(const std::size_t width,
              const std::size_t height)
            : width(width)
            , height(height)
            , data(new int[width * height * 4])
        {}
    
    
        class Line;
    
    
        class Pixel
        {
        public:
            Pixel(Line &line,
                  const std::size_t column)
                : line(line)
                , column(column)
            {}
    
    
            int& operator [](const std::size_t color)
            {
                if (color >= 4) {
                    throw std::range_error("color >= 4");
                }
                return this->line.image[(this->line.line * this->line.image.width + this->column)
                        * 4 + color];
            }
    
    
            Line &line;
            const std::size_t column;
        };
    
    
    
        class Line
        {
        public:
            Line(Image &image,
                 const std::size_t line)
                : image(image)
                , line(line)
            {}
    
    
            Pixel operator [](const std::size_t column)
            {
                if (column >= this->image.width) {
                    throw std::range_error("column >= image.width");
                }
                return Pixel(*this, column);
            }
    
    
            Image ℑ
            const std::size_t line;
        };
    
    
        Line operator [](const std::size_t line)
        {
            if (line >= this->image.height) {
                throw std::range_error("line >= image.height");
            }
            return Line(*this, line);
        }
    
    
        const std::size_t width;
        const std::size_t height;
    
    protected:
        boost::scoped_array<int> data;
    };
    
    26.10.2010 15:16 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Pozor, konstrukce "int*** &a" není reference na třírozměrné pole. I třírozměrné pole je pořád jen posloupnost za sebou narovnaných hodnot. To, co jste napsal vy, je reference na pointer na pointer na pointer na int.
    26.10.2010 16:04 Sten
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Ano, samozřejmě je nutné to potom správně převést pomocí reinterpret_cast podle konstantních parametrů, které by měla funkce dostat (nebo se někde jinde dozvědět):
    void funkce(int ***&a,
                const std::size_t width,
                const std::size_t height,
                const std::size_t x,
                const std::size_t y)
    {
        int (&image)[width][height][4] = *reinterpret_cast<int(*)[width][height][4]>(a);
        ·
        ·
        ·
    }
    
    26.10.2010 16:08 Sten
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Koukám, že mi tam chybí v tom reinterpret_cast ampersand, má tam být
    *reinterpret_cast<int(*)[width][height][4]>(&a);
    26.10.2010 16:33 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Když už to chcete tak jako tak castovat, tak je jedno, na co je to vlastně pointer. Já chtěl jen upozornit, že třírozměrné pole je v podstatě zase jako pointer na typ samotný, ne pointer na pointer (na pointer).
    26.10.2010 14:21 PeterS. | skóre: 10
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)

    diky za odpovede, tie navrhovane riešenia sú pre mna príliš komplikované, rozhodol som sa že to budem riešiť styrmi jednodimenzionálnymi arrayami a funkcii posuniem aj x*y rozmery obrázka a nejako si s tým poradím. Asi tak nejako (pre jednu array):

    void populate (float* aaa, int img_size) {
    }

    float * ar_R;        
    ar_R = new float[w_img_size];        
    populate (&ar_R[0],img_size);    // w_img_size je velkost array

    V každom prípade vďaka za ochotu...

    26.10.2010 15:17 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Ve výsledku vlastně děláte totéž co my. Rozdíl je v tom, že vy budete muset tu "špinavou práci" s počítáním indexu dělat při každém použití znovu, zatímco u našich "příliš komplikovaných" řešení si ji uděláme jednou zvlášť a pak už to jen používáme.
    26.10.2010 15:19 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Ještě bych dodal, že rozdíl poznáte hlavně v okamžiku, kdy se z nějakého důvodu rozhodnete formát dat změnit - my si to opravíme na jednom místě, vy to budete muset udělat všude, kde tu datovou strukturu používáte.
    26.10.2010 15:22 zulu
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Komplikované to není, jen jsi to nepochopil. Data obrázku 3x3:
    A1,A2,A3
    B1,B2,B3
    C1,C2,C3
    prostě vypadají takhle:
    A1,A2,A3,B1,B2,B3,C1,C2,C3
    A ty jen musíš přepočítat souřadnice na pozici v tom poli. Navíc tady už máš kód, se kterým nemusíš nic dělat a stačí ho obšlehnout.
    Saljack avatar 26.10.2010 20:25 Saljack | skóre: 28 | blog: Saljack | Praha
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Na tohle už bych si vyrobil objekt (strukturu), kam budeš moct všechno ukládat a budeš si z toho také ty data brát.
    Sex, Drugs & Rock´n Roll.
    27.10.2010 21:45 mato
    Rozbalit Rozbalit vše Re: Pointer k multidim. array ako parameter pre funkciu (C++)
    Příloha:
    caf,
    osobne by som sa tiez priklonil k rieseniu, ze by si predaval fcii pointer na strukturu, ktora v sebe obsahuje potrebne data (pole + suradnice).
    v prilohe som poslal kod, ako by som vytvaral dynamicke pole ja. m3d_action simuluje tvoj dotaz ako fcii predat maticu na menenie
    dalo by sa to robit viacerymi sposobmi, toto je len ukazka

    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.