TechBlog cikkei

Overloading operator =

Egyszer már próbáltam az ApocalypseKÖZÖS lakóitól segítséget kérni egy problémához, és akkor sikerrel jártam. Szóval most megpróbálom még egyszer.

Egy C++ programot írok, amiben mindenféle komplex számokkal számolok, és ehhez – többek között – egy külső függvénykönyvtár (nevezzük C-LAPACKnak) függvényeit és definícióit használom. A Lapackban létezik egy típusdefiníció a komplex számokra (nagyon egyszerű: egy struct, aminek van egy valós és egy képzetes tagja, mindkettő lebegőpontos szám), nyilván nekem is célszerű ezt használnom. Viszont a kód olvashatósága érdekében szeretném, ha a fordító érteni tudná a c = d jellegű rövidítéseket (ahol c egy ilyen komplex szám, d meg egy lebegőpontos kifejezés), vagyis, hogy ne kelljen se mindig kiírni, hogy c.r = d; c.i = 0, se ne kelljen erre külön valami c = assign_double(d); jellegű utasítást/makrót csinálni.

Ugyanez persze felmerült a szokásos négy alapműveletre is, ott sikerült is megcsinálnom az operator overloadingot pusztán a megfelelő eljárások deklarálásával. Azonban az operator =-t valamiért nem lehet "csak úgy" overloadingolni, mert olyankor egy error: '__CLPK_doublecomplex& operator=(__CLPK_doublecomplex&, double)' must be a nonstatic member function nevű hibát kapok.

A gugli erre azt írta, hogy ennek az a mélyebb oka, hogy az értékadás operátort csakis az osztálydefinícióban lehet megtenni valamiért. Ennek egyrészt vannak egész érthető okai is, másrészt viszont az is nyilvánvaló, hogy miért nem akarok belepiszkálni egy külső függvénykönyvtárba. (Arról nem is beszélve, hogy maga a Lapack nem C++, hanem szimpla C-kód – pontosabban a Lapack FORTRANban íródott és a C-Lapack egy wrapper hozzá –, vagyis nincsenek benne osztályok. Persze nyilván a structok ilyen értelemben osztályként is működnek, de akkor sem akarnék belenyúlni a Lapack headerekbe...)

Nem tudna valaki javasolni nekem valamit, hogy anélkül, hogy bele kéne piszkítanom a Lapack headerekbe, hogyan tudnám mégis megcsinálni, hogy a c = d jellegű értékadás működjön?

Tagek:
 
Utoljára módosította SAdam 2009.VIII.14 19:10-n; 4 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

Megtérés

A "milyen böngészőt használj" kérdés szerintem amíg létezik web, és léteznek konkurens cégek, mindig is egy alapkérdés lesz. Igazából a "milyen operációs rendszert használsz" kérdés után úgy tűnik (legalábbis számomra), hogy ez a második legjellemzőbb "hitkérdés" a számítógépbuzik körében. Én eddig a napig próbáltam tartani magam a jól megszokott, nagyon sok szempontból profi, ráadásul nyílt forráskódú (ezáltal valahogy számomra szimpatikusabb) böngészőhöz, a Firefoxhoz. Ma megtörtént a váltás (aminek minden normális jóslat szerint már rég meg kellett volna történnie, hiszen az Apple-t általában nem könnyű elverni a saját háza táján, és bizony tényleg számos olyan finomsága van az oprendszernek, ami a Firefoxba egyszerűen nincs átmentve).

Nem akarok ódákat zengeni a tegnap előtt megjelent Safari 4-ről. Egyrészt, mert sok ponton azért annyira még mindig nem jó, mint a Firefox 3 (hogy a legerősebb hiányosságot említsem: az Apple-nek nincs olyan webhelye, mint az addons.mozilla.com – nyilván nem a webhely maga hiányzik, hanem a szolgáltatás), másrészt, mert nem vagyok beépített marketinges, és ha már hitkérdés, én mégis inkább a Firefoxot szeretném vissza (még mindig tárolom a certificate-emet a Firefox D–Dayről).

Még az sem lett volna feltétlen meggyőző érv, hogy vannak oldalak, amiket a Firefox egyszerűen nem hoz be, míg a Safari némi workaround után igen (fontos, itt nem a Windowsos Firefoxról beszélek, az mindent behoz – a Mac OS alá fejlesztett cucc viszont elakad néhány olyan oldalnál, mint pl. a CIB Internetbank, akik valami agyament ötlettől vezérelve Java appletként csinálták meg az oldalukat, és ezt sajnos sikerült olyan "profira" megírniuk, hogy a Firefox egyszerűen nem nyitja meg).

Ami végül mégis az átállásra kényszerített, az az, hogy az alatt az idő alatt, amíg a Firefox elindul, azalatt a Safari elindul, behozza az egyik könyvjelzőmet, és azon belül még elnavigál egy következő linkre is. Na meg ez:

upload:TechBlog/sadam_firefox_vs_safari.gif

(A teszthez ezt az oldalt használtam.)

Tagek:
 
Utoljára módosította SAdam 2009.VI.11 13:39-n; 3 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

VGT RT PRLS LSJ

Véget ért az idei április elseje az ApocalypseKÖZÖSön. Bagoly búcsúzik.

Csupán az érdekesség kedvéért, a négy sor, amely az idei tréfáért felelős volt:

$text =~ s|(<.*?>)|&StoreRaw($1)|ge; $text =~ s|(&\S+;)|&StoreRaw($1)|ge; $text =~ s|[aáeéiíoóöőuúüűAÁEÉIÍOÓÖŐUÚÜŰ]||g; $text = uc($text);

Kis magyarázat:

  • Az első sor azért kellett, hogy a html kód érintetlen maradjon.
  • A második sor azért felel, hogy az sgml karakterkódokat ne érje ártalom.
  • A harmadik sor eltünteti a magánhangzókat.
  • A negyedik minden maradékot nagybetűssé tesz.

További jó mulatást!

Tagek:
 
Utoljára módosította UPi 2009.IV.01 23:21-n; 1 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

Hatodik érzék

Ezt a (jelenleg 350 dollárba kerülő) kütyüt frissen mutatták be. Ha lesz felesleges 350 dolcsim, veszek egyet:

http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html

Tagek:
 
Utoljára módosította SAdam 2009.IV.01 23:00-n; 0 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.

Algoritmus kerestetik

Olyan algoritmus kerestetik (a honorárium legyen mondjuk egy sör), amelyik lehetőleg gyorsan fut, és egy adott (véletlenszerűen generált) memóriaterületet átkódol úgy, hogy biztosan ne forduljon elő benne 0 értékű byte (és hogy az átkódolt adatból az eredetit egyértelműen vissza lehessen fejteni), mindezt minimális méretnövekedés mellett.

Ami eddig eszembe jutott az az, hogy a memóriaterületet felbontom 1415 byte-os* blokkokra, majd az így kapott (256 alapú számrendszerben) 1415 jegyű számokat átírom 255-alapú számrendszerbeli számokra, végül az így kapott szám mindegyik számjegyéhez hozzáadok 1-et. Így egy legfeljebb (256-alapú számrendszerben) 1416 jegyű számot kapok, ezt eltárolom egy 1416 byte-os blokkban, és készen vagyok. A visszafejtés nyilván egyértelmű, és így csak 1/1416-oddal nő meg az eredeti adatmennyiség, ami nem egy túl nagy növekedés.

Ha esetleg valaki tud arra jó algoritmust, hogy hogyan lehet egy nagyméretű számot az egyik számrendszerből a másikba konvertálni, már azzal is irtó sokat segítenétek. Köszi!


* Azért pont 1415-jegyű számok, mert az (n+1) alapú számrendszerben k helyiértéken összesen (n+1)k szám tárolható. Ha szeretném megtalálni azt a legnagyobb k-t, amire az n alapú számrendszerben biztosan elég (k+1) helyiértéket használnom az előbbi szám tárolására, akkor a nk+1 ≥ (n+1)k feltételnek eleget tevő legynagyobb k-t kell megadni. n = 255 esetén (hacsak el nem számoltam) kmax = 1415.
Tagek:
 
Utoljára módosította SAdam 2009.III.07 17:51-n; 8 hozzászólás
Bejegyzés módosítása | PermaLink
Szavazás letiltva.