abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 18:44 | Nová verze

    Byl vydán Mozilla Firefox 125.0.1, první verze z nové řady 125. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vypíchnout lze podporu kodeku AV1 v Encrypted Media Extensions (EME). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 125.0.1 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    dnes 16:44 | Nová verze

    Valkey, tj. svobodný fork již nesvobodného Redisu, byl vydán v první stabilní verzi 7.2.5.

    Ladislav Hagara | Komentářů: 0
    dnes 15:11 | IT novinky

    Společnost Espressif Systems oznámila, že rodinu SoC ESP32 brzy rozšíří o ESP32-H4 s IEEE 802.15.4 a Bluetooth 5.4 (LE) s podporou protokolů Thread 1.3, Zigbee 3.0 a Bluetooth Mesh 1.1.

    Ladislav Hagara | Komentářů: 2
    dnes 13:11 | Zajímavý software

    Kevin Bentley zveřejnil na GitHubu zdrojové kódy počítačové hry Descent 3 z roku 1999: "Někdo se nedávno zeptal, zda budou zveřejněny zdrojové kódy Descent 3. Oslovil jsem svého bývalého šéfa (Matt Toschlog) z Outrage Entertainment a ten mi to povolil. Budu pracovat na tom, aby se to znovu rozběhlo a hledám spolusprávce." [Hacker News]

    Ladislav Hagara | Komentářů: 0
    dnes 04:33 | Bezpečnostní upozornění

    Byla vydána verze 0.81 telnet a ssh klienta PuTTY. Opravena je kritická bezpečnostní chyba CVE-2024-31497 obsažena ve verzích 0.68 až 0.80. Používáte-li klíč ECDSA NIST P521 a použili jste jej v PuTTY nebo Pageantu, považujte jej za kompromitovaný.

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

    Hra MineClone2 postavena nad voxelovým herním enginem Minetest byla přejmenována na VoxeLibre.

    Ladislav Hagara | Komentářů: 0
    včera 19:11 | IT novinky

    Společnosti Avast Software s.r.o. byla pravomocně uložena pokuta ve výši 351 milionů Kč. Tu uložil Úřad pro ochranu osobních údajů za neoprávněné zpracování osobních údajů uživatelů jejího antivirového programu Avast a jeho rozšíření internetových prohlížečů (Browser Extensions), k čemuž docházelo prokazatelně po část roku 2019.

    … více »
    Ladislav Hagara | Komentářů: 8
    včera 15:55 | Zajímavý článek

    Bylo vydáno do češtiny přeložené číslo 714 týdeníku WeeklyOSM přinášející zprávy ze světa OpenStreetMap.

    Ladislav Hagara | Komentářů: 0
    včera 15:44 | Pozvánky

    V sobotu 20. dubna lze navštívit Maker Faire Jihlava, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    včera 14:44 | Zajímavý software

    Knihovna pro potlačení šumu RNNoise byla vydána ve verzi 0.2. Kvalitu potlačení lze vyzkoušet na webovém demu.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (61%)
     (13%)
     (2%)
     (24%)
    Celkem 435 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Ukazatele v C, pole doublu

    25.12.2010 21:56 Preston Pigglesworth
    Ukazatele v C, pole doublu
    Přečteno: 372×
    Přílohy:
    Dobry den, nevim si rady z nasledujicim problemem v C. Z knihovny lapack mam funkci pro reseni soustavy linearnich rovnic _dgesv, volam ji presne podle prikladu z http://software.intel.com/sites/products/documentation/hpc/mkl/lapack/mkl_lapack_examples/dgesv_ex.c.htm

    Napsal jsem mensi program na jeji odzkouseni, viz priloha lapack2.c -- funguje OK

    Kdyz ji ale pouzivam tam kde ji potrebuju, tak jsou vysledky pokazde spatne, krome prvniho prvku. Napada me chyba v ukazatelich, ale podle clanku, co jsem procital tady i jinde, by to melo byt v poradku.Zkousel jsem i zapisovat do souboru jednotlive sekvence vypoctu.. vsechno je v poradku dokud nedojde na _dgesv. Ta sice spravne zapise vysledk do vstupniho pole B, ale s naprosto spatnymi cisly! Zkopiroval jsem obsah souboru B.txt a S.txt do zkouseciho programu a obdrzel jsem spravny vysledek.[overeny GNU/octave]

    Muzete mi prosim vysvetlit, jaky je z pohledu te funkce rozdil v tom jestli ji dam odkaz pole, pevne dane velikosti s na pevno naplnenymi cisly, nebo odkaz dynamicky alokovane pole?


    Řešení dotazu:


    Odpovědi

    25.12.2010 22:33 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Nezkoumal jsem to nijak podrobně, ale problém by mohl být spíš v těch ostatních parametrech, které nejsou pointery na double. V jedné ukázce totiž u všech předáváte pointery na int, zatímco v druhé pointery na long.
    25.12.2010 22:56 Dr. Eddy | skóre: 9 | blog: glog | České Budějovice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    no, kdyz uz nejsou srozumitelne nazvy promennych, tak bys aspon ten kod mohl okomentovat. aspon nejak zhruba, abychom vedeli, co se kde deje. A velmi prakticke by bylo napsat, co je ktera promenna (vstupni / vystupni data, ridici promenne atd.).
    25.12.2010 23:46 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    dgesv je subroutina na reseni soustavy rovnic A*X=b , pritom pri volani dgesv( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ) je A predstavovano pomoci pole a. b je na VSTUPU predstavovano pomoci pole b. Na VYSTUPU se reseni X zapisuje do pole b! [Myslim, ze takovy komentar tam nekdeje]. n je pocet radku a sloupcu ctvercove matice A. nrhs=1 - pocet pravych stran ,lda=ldb=n ipiv jsou koeficienty z LU rozkladu, info je navratova hodnota 0= spravne ukonceni
    25.12.2010 22:58 luky
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Po letmom pohlade na oba programy som si vsimol jeden rozdiel vo funkciach LVP_solveGE() (zo suboru LVP_solver1.c) a funkciou LVP_solveG() (zo suboru lapack2.c). V jednom su lokalne premenne typu long int a v druhom int. Mozno to bude v tom.
    25.12.2010 23:35 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Příloha:
    Dekuji za reakce, omlouvam se, ze sem vas zmatl tema ukazkama, zkousel jsem, jestli nemuze byt problem v tom, ze fortranovsky integer odpovida Cckovskemu long int.. V tomto problem neni, je to osetreno pres lapacke.h

    Funkce dgesv( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ) da spravny vysledek pokazde, kdyz jsou pole a a b zavedeny jako double a[121]={...}; double b[11]={...};

    Kdyz se ale snazim ty pole zavest dynamicky, tak to pokazde vypocita uplne nesmysly

    Zjednodusil jsem ukazku,jak to jen slo.. kdyz nahradim volani LVP_solveGE(n,S,B); za LVP_solveGE(n,as,bs); tak se dostavi spravny vysledek.

    P.S.Omlouvam se, ze to vypada tak neprehledne, ale to je proste vypocet..Resp. to je neco, co "proste musi byt" v C, i kdyz je to v C zbytecne, spis az nevhodne

    26.12.2010 00:52 Dr. Eddy | skóre: 9 | blog: glog | České Budějovice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Funkce dgesv( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ) da spravny vysledek pokazde, kdyz jsou pole a a b zavedeny jako double a[121]={...}; double b[11]={...}; Kdyz se ale snazim ty pole zavest dynamicky, tak to pokazde vypocita uplne nesmysly
    To bude ten problem, protoze je rozdil mezi dynamicky a staticky alokovanym polem. Funkce totiz ocekava staticke pole, ktere by melo byt alokovane jako souvisly blok v pameti, zatimco dynamicky alokovane pole velikosti [n][m] je n poli velikosti m ruzne po pameti. Takze by asi bylo vhnodne ty matice definovat jako jednorozmerne pole a program prepsat.
    26.12.2010 01:05 Dr. Eddy | skóre: 9 | blog: glog | České Budějovice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    jo, pardon, blbe koukam a pak blbe kecam... jsem uz unaveny...
    26.12.2010 10:54 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu

    Dost by pomohlo, kdyby ta ukázka šla přeložit bez spousty souborů, které vy máte, ale my se o jejich obsahu můžeme jen dohadovat. Pro začátek např. zkuste alokovat dynamicky pole se stejným obsahem jako mají as a bs a zavolat funkci na ně. Pokud bude výsledek stejný jako u staticky alokovaného (což je více než pravděpodobné), problém je jinde, než kde se ho snažíte hledat.

    Ještě mne napadá: nikde nekontrolujete návratové hodnoty malloc(), nemůže být problém v tom, že selže alokace? Jak velká je ta vaše matice?

    26.12.2010 11:46 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Příloha:
    Upravil jsem solver1.c tak aby ho bylo mozne spustit bez tech veci okolo, kompiluju to pomoci gcc LVP_solver1.c lapack_LINUX.a lapacke.a blas_LINUX.a tmglib_LINUX.a libgfortran.so.3.0.0 Dal bych jsem i ty knihovny, ale maji dohromady 30MB.

    Pro začátek např. zkuste alokovat dynamicky pole se stejným obsahem jako mají as a bs a zavolat funkci na ně.

    To ted jsem prave vyzkousel pomoci tech statickych poli as, bs. prekopiroval jsem jejich obsah do B a S (pred tim, nez sem volal _dgesv) pomoci for (i=0; i<n; i++) { *(B + i) =bs[i]; } for (i=0; i<n*n; i++) { *(S + i) =as[i]; } Vysledek je kupodivu v poradku!

    O to vic tomu ted ale nerozumim, protoze ty cisla v tech statickych polich as, bs jsem ziskal primo z tohoto programu tim, ze jsem to pole ihned po naplneni for cykly zapsal to textoveho souboru

    26.12.2010 13:57 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Vypada to, ze problem je nekde v tom plneni matic ( ////FILL MATRIX // ) : kdyz jsem presunul

    for (i=0; i<n; i++) { *(B + i) =bs[i]; } for (i=0; i<n*n; i++) { *(S + i) =as[i]; } Pred vsechno to naplnovani, tak to zase vyhodilo spatny vysledek..

    jeste jsem za kazde to plneni matice napsal jeji vypis pomoci for (i=0; i<n; i++) {printf("%20.20f \n",*(B+i) ); } ... vsechno je v poradku,vstupy do _dgesv jsou stejne, jako v pripade pouziti statickeho pole
    26.12.2010 23:00 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu

    Hodnoty ve statických polích nejsou úplně stejné jako ty počítané, vypadá to, že jsou zaokrouhlené na šest desetinných míst. A pokud místo zkopírování statického pole dám

      for (i=0; i<n; i++) {
        B[i] = 1E-6 * lround(1E6 * B[i]);
      }
      for (i=0; i<n; i++) {
        for (j=0; j<n; j++) {
          S[i+j*n] = 1E-6 * lround(1E6 * S[i+j*n]);
        }
      }
    

    dostanu stejné výsledky jako se statickým polem. Takže můj tip je, že celý problém je v (ne)stabilitě té soustavy, tj. že i malá změna v koeficientech nebo pravé straně může způsobit (relativně) velkou změnu řešení. Ale nechce se mi počítat vlastní čísla, abych si to ověřil.

    27.12.2010 12:29 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Dekuji vsem za pomoc! S tim zaokrouhlovanim mate pravdu, _dgesv pocita spravne. Nakonec jsem nasel chybu ve spatnem umisteni jedne zavorky pri plneni matice S, vzniklo to behem kopirovani z matlabovskeho prototypu. Protoze me ale v minulosti jeden vypocet pocital nesmysly diky ukazatelum, podezrival jsem spatno spravu pameti, za to se omlouvam.. Kazdopadne jeste jednou: diky za pomoc!
    26.12.2010 09:46 Preston Pigglesworth
    Rozbalit Rozbalit vše Re: Ukazatele v C, pole doublu
    Jeste jsem zkousel pouzit jinou knihovnu (intel MKL), vysledek stale stejne spatny, takze knihovnou to neni.

    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.