Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Zelený je lopuch,
fotbal to je hra...

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: iuddtvz
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
bredy 22.8.2006 12:53  527
KdokolivJde o to, že GUI knihovna pracuje na nízké úrovni s WinAPI. Všude používám pimpl idiom abych windowsy zakryl. Tak mi přišlo divné psát střeva portu na něco, co vlastně portovatelné už je. CO se QT týče, tak po celonoční instalaci (a buildování) jsem jej nějak moc nerozchodil. Docela mi přijde jako kolos.

Co jsem se díval na X11, zatím jsem viděl jen otevírání oken a malování po oknech. Což o to, to by mi klidne vyhovovalo (Java si přece taky maluje všechno sama). Připomínám, že nepíšu aplikaci co si chce otevírát okénka a vyplňovat kontrolky, píšu knihovnu, nad kterou běží cosi, co si prostřednictvím jednotného interface otevírá okénka a vyplňuje kontrolky, a tahle knihovna to vlastně má malovat.
(a když bude problém s portováním, napíšu varianty pro různé linuxy).

Na KDevelop a podobně se podívám. Celkem mi nevadí, jestli to je pro KDE nebo něco jiného, na začátek to bude stačit.

Ty thready ... trochu se toho děsím, podívám se po google. Ale kdyby to vyšlo přeportovat, dost by to ulehčilo práci s některými věcmi (též pimpl idiom knihovna)
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 22.8.2006 12:39  526
Bredy [525]: Vyvojova prostredi urcite nejaka budou, z hlavy mi vyvstava KDevelop, jenze dost mozna bude hodne zamereni na vyvoje KDE veci (byt to urcite nebude tak, ze by jinak v nem vyvijet neslo). Pak pokud vim jsou nejaky C/C++ pluginy pro Eclipse, ale netusim, v jak pouzitelnym je to stavu. Mozna budes muset hledat sam, protoze konkretniho doporuceni by ses nejspis zvlast tady na Lopuchu tezko dockal, tady spis vetsina pojede ve vimu, mozna nekdo krom me i v emacsu, ale tim to asi skonci.
K stardandnimu vlakennimu API je afaik dokumentace v podobe manualovych stranek. Mohlo by Ti stacit dat vhodny dotaz na Googlu, z nej nacerpat zakladni predstavu a zbytek se docist tam. Ja bych musel sahnout do svejch slidu z prednasek, abych vedel, odkud se odpichnout, ale ty asi nejsou nikde verejne vystaveny.
Ad GUI - durazne nedoporucuju pracovat s tim na nizke urovni. Priznam se, ze nerozumim te namitce s portovanim knihovny na port, kazdopadne bych opravdu zvazoval QT nebo aspon GTK (byt ja radsi QT), je par dalsich tooliktu (Tk, FOX), ale ty jsou min rozsirene a treba zrovna to Tk je hrozne divny a hnusny (muj osobni nazor) a jet uplne bez nich a vsechno si delat pres xlib (ci jak se to jmenuje) je sebevrazda a vysledek bude od pohledu hnusnej (a navic nezvyklej). Fakt bych doporucil tenhle bod prehodnotit a vzit nejakej rozumnej existujici toolkit.
bredy 22.8.2006 12:23  525
LinuxRozhodl jsem se, že po zkouškách zkusím přepsat některé své knihovny do linuxu. Potřeboval bych

1) existuje nějaké vývojové prostředí, nebo aspoň UI debugger?
2) První na řadě je knihovna pro vlákna. Mám ji pro WinAPI, a budu ji portovat do Linuxu. Doporučite mi nějakou dokumentaci / knihovnu, jak s vláknama pracovat? (nechci žádnou nadstavbu, ideálně na nejnižší úrovni co to půjde).
3) GUI - už jsem si našel nějakou dokumentaci k X11, přesto, jestli o něčem víte, sem s tím (o QT nechci slyšet, přijde mi divné portovat knihovnu na port - spíš na nižší úrovni)

PS: Mám Mandraka.
makak makak 19.8.2006 09:43  524
dickjprecti si RFC 919, broadcasting pomoci 255.255.255.255 funguje pouze na jednu "podsit" a je mozne, ze v tvem pripade neni "server" a "klient" v jedne siti. Take ne kazda gateway "na ceste" paketu musi broadcasting podporovat, takze se ti to mozna nepovede vubec, nemas-li moznost jejich nastaveni ovlivnit.
bredy 18.8.2006 23:33  523
dickj1. Adresu broadcastu si musis zjistit, mam pocit, ze 255.255.255.255 ne vzdy funguje.
2. naopak myslim, ze neni treba nastavovat SO_BROADCAST, protoze to bez nej funguje taky.
3. nevim, jesltli v prvnim pripade je chybejici bind zamer nebo opomenuti pri prepisovani do lopuchu
4. stejne tak server by mel asi nejspis na zpravu pockat pomoci prikazu select, a pak ji teprve prijmout.
5. kdyz nefunguji broadcasty, je nekdy dobre nejprve posilat paket na primou adresu, a paklize dojde, hledat chybu v broadcastu. Nedojde-li, je chyba nekde jinde nez v broadcastu (chyba na nektere strane).
dickj 17.8.2006 21:08  522
win soketyAhoj... Mám následující problém :

Dělám aplikaci (jednoduchý chat) pro OS Windows. Její princip je, že se spustí dvě instance této aplikace (každá na jiném PC) a pomocí broadcastu si k sobě "najdou cestu" - styl klient-server.

Struktura kódu je následující:
KLIENT
int soc = socket(...); // nový socket
setsockopt(soc,..., SO_BROADCAST, ...); // povolit broadcast
"addr.s_addr = 255.255.255.255"; // symbolický zápis
"addr.s_port = 7"; // symbolický zápis
sendto(soc, ..., addr, ...); // posílám zprávu serveru

SERVER
int soc = socket(...); // nový socket
"addr.s_addr = INADDR_ANY"; // symbolický zápis
"addr.s_port = 7"; // symbolický zápis
bind(soc, ..., addr, ...);
recvfrom(soc, ..., addr, ...); // posílám zprávu serveru

Když aplikaci spustím, tak zpráva od klienta vůbec nepřijde na počítač, kde běží server.
Dokázal by mi někdo poradit, v čem by mohl být problém ?? Díky
fofrofronek fofrofronek 14.8.2006 12:00  521
OTmiluju automaticke prekladace:o)
http://wikipedia.infostar.cz/o/ob/object_file.html
fofrofronek fofrofronek 9.8.2006 21:58  520
Dik to vypada velmi chutne, zatim jsem objevil a vystacil si s utilitou z VC++ - ted si zaboha nevzpomenu na nazev :o)
bredy 9.8.2006 15:06  519
fofrofronekhttp://www.dependencywalker.com/
fofrofronek fofrofronek 7.8.2006 11:03  518
Nazdar, mam problem. Potrebuju nahradit ve windowsech dll knihovnu.
Dokazal by me nekdo nasmerovat na nejaky informace, jak zjistim, kolik funkci ta dll knihovna obsahuje a jak toho o ni zjistit co nejvic ?
diky.
huh huh 19.7.2006 17:34  517
anonym [516]: Objektově orientované programování v C++
anonym 19.7.2006 17:31  516
cau lidi, mam takovej problem, chci začít s programovíním v C++, ale nechci vrážet peníze do literatury, tudíž vás prosím jestli někdo nevíte kde by se na netu našly začátky programování v c++..moc díky
bredy 19.7.2006 07:55  515
Know How - MultipleInterfacesTen kdo programuje v Javě určité zná slovo interface. Programátor v C++ to slovo nezná, pokud ho tedy neslyšel v podobné souvislosti, ale v C++ jej jako příkaz nenalezneme. Nicméně i tam můžeme napsat, že interface je vlastně abstraktní třída, která neobsahuje implementaci žádné z funkcí, kterou deklaruje

 class IExampleIfc
 {
 public:
    virtual void fn1(...)=0;
    virtual void fn2(...)=0;
    ....
 };

(já nejčastěji označuji interface písmenem I)

Nedávno jsem řešil problem. Mám interface, který je obecným základem pro nějakou hierarchii tříd. To znamená, že existuje několik (desítek) potomků, kteří tento interface dědí a implementují jeho funkce. Potud by to nebyl žádný zádrhel. Modul o kterém mluvím je víceméně hotový a používá se v několika projektech. A tak jsem si jednoho dne sedl a řekl, že napíšu vizualizátor této struktury, tj, že si napíšu nějaký program, který vypisovat data objektů z nějaké kolekce, kde každý objekt je právě instancí třídy některého potomka.

Mno, co s tím, ideální by bylo, kdybych měl na interface funkci Draw, kterou pak budu volat na každý objekt a podle typu se ten který objekt nakreslí. Jenže na interface taková metoda není, musela by se tam dopsat. Jenže jak jsem řekl, modul je víceméně hotový a používá se v několika projektech, zasahovat do jeho základní části jen proto, abych uspokojil nároky jednoho programu je dost velká odvaha (a hloupost). Co teď s tím?

Mohl bych zjišťovat typ každého objektu a mít připravený obrovský switch, jenž by na základě typu vyvolal nějaké kreslení. Nejde to napsat lépe?

Ono by stačilo, kdyby součástí rozhraní byla funkce, která by mi umožnila vrátit něco obecného, z čeho bych poznal co mám dělat dál. Ideálně ukazatel na nějaké jiné rozhraní. Jenže to rozhraní sám modul nezná, muselo by to být nějaký univerzální rozhraní...

Teď trochu odskočíme do Windows a jeho COM+ objektů. Ti co programují v COM+ znají, že základní rozhraní (ze kterého se dědí celé COM+) se jmenuje IUnknown a má tři metody. AddRef, Release a QueryInterface. AddRef a Release nechme stranou, slouží jen k počítání referencí pro automatické uvolnění opuštěních objektu (jednoduchý GC). Zaměřme se na QueryInterface. Každý objekt COM+ tuto metodu má. Funkcí dodáme nějakou identifikaci rozhraní a výsledkem je ukazatel na to rozhraní. Už svítá?

Udělejme return k našemu problému. Jak to tedy udělat s tím Draw? Budu muset do základního rozhraní dopsat něco podobného jako QueryInterface. Na základě nějakého smluveného ID se budu moci dotázat na případná další rozhraní přístupné v objektu. Výchozí implementace přitom může vracet NULL. Budu-li tedy implementovat Draw, musím každého potomka ještě podědit a rozšířit o nějaké moje rozhraní, které bude obsahovat deklaraci Draw.


class Potomek10: IPredek
{
 // pisu jen proto, aby bylo vědět, jak potomek dědí základní rozhraní
}

class IMojeDrawRozhrani
{
  virtual void Draw(Graphics &g)=0;
}


class MujPotomek10: public Potomek10, public IMojeDrawRozhrani
{
 public:
   virtual void *QueryInterface(int id)
   {
     if (id==smluvene_id)
         return static_cast<IMojeDrawRozhrani *>(this);
     else
         return __super::QueryInterface(int id);
   }
   virtual void Draw(Graphics &g)
   {
    //malovani
   }
}

Ještě musím do základního interface doplnit ještě toto
virtual void *QueryInterface(int id) {return 0;}

Ano, rozhraní vracím jako void *. Pro konverzi na rozhraní pak musí použít reinterpret_cast Je to malý flíček na celé struktuře. Hezčí by bylo, kdyby to bylo něco obecnějšího. Kam ale chcete zobecnit rozhraní? A pomohl bych si nějak? Jediným efekt by byla změna přetypování z reinterpret_cast na static_cast. Ano, mohl bych taky použít dynamic_cast pro runtime kontrolu, zda-li objekt opravdu vrací to co chci (ale to mohu myslím teď taky - a navíc je to zbytečné, pokud by tomu tak nebylo, je to chyba kterou musím řešit na úrovni zdrojáků, né v době běhu).

Pokud budu chtít nakreslit objekt:
IPredek *p=container[x];
IMojeDrawRozhrani *r=reinterpret_cast<IMojeDrawRozhrani *>(p->QueryInterface(smluvene_id));
if (r) r->Draw(g);
else 
  DrawNeznamyObjekt(g); //objekt neznám, nemohu kreslit.


Celá operace má jednu podmínku. Má aplikace, která chce toto využít musí na počítku být schopná kontrolovat vznik objektů. Musí upravit tento vznik tak, aby vznikali rozšíření potomci (o rozhraní Draw), Znamená to pro každého potomka napsat další třídu a tu pak použít při new. Dobře napsané knihovny které například vytváří struktury při čtení z disku obsahují tzv. faktory třídy. Což jsou třídy, které pro každy typ objektu v souboru obsahují virtuální metodu, jejíž úkolem je podle typu vytvořit instanci. Aplikace pak samozřejmě tuto třídu dědí a implementuje si metody tak, aby vracely instance potomků těchto tříd.

Tak ať máme o čem mluvit....
bredy 19.7.2006 07:18  514
DRUH 5618No jo, ale co ty příklady mají dělat? Hrát nějaké hry (piškorky?, řešit sudoku?), nebo dělat něco praktického?

Podle mého názoru naučit se psát v C++ není problém, syntaxe C++ se dá naučit za pár hodin. Podívej se ale po google, určitě bys našel zajímavé programátorské problémy a jejich řešení. Začneš něčim jednoduchým (řazení, vyhledávání, stromy, grafy), pak třeba problémy prohledávání stavového prostoru (dámy na šachovnici, přelejvání kýblů. problém batohu, problém obchodního cestujícího). Ono se to nezdá, ale dobrý programátor není ten, který umí napsat krásně vypadající aplikaci se super UIčkem, která slouží jen ke konverzi MP3 na WAV a zpět (jenž stejně využívá standardní kodeky), ale ten, který umí napsat řešení nějakého obtížného problému (třeba unwrap UV souřadnic na 3D modelu), k čemuž často právě využije některý výše popsaný problém, který řešit umí.

Zaměřil bych se tedy na "domácí úlohy" tohoto typu a zkusil si něco napsat. Zkus třeba toto
druh_5618 Druh_5618 17.7.2006 12:02  513
Bredy Jakéhokoliv. Mohly by to být i typické "domácí úlohy" nebo příklady z knih.

Srovnej např.: Zadání: Konzole, jediný parametr je URL bez překlepu, soubor se uloží do aktuálního adresáře....
Versus: Kompletní zdrojáky WGETu se všemi jeho funkcemi a portovatelností.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt