» »

[C++] Galerija kode

[C++] Galerija kode

OwcA ::

Da malo poživim dogajanje.

Ako ima kdo kakšno kvalitetno vsespolšno uporabno kodo oziroma trik naj jo pripne sem. Zavoljo preglednosti predlagam, da podajamo le povezave na datoteke (če rabite gostovanje, je simon@owca.info pravi naslov za vas ;)).

[Verjetno bom sem s časoma dopisal še kakšne tehnikalije]

V kolikor imate kakšne posebne želje glede licence pod katero ste svoje dosežke na ogled postavili, to seveda ovekovečite.

P.S. res dobre prispevke morebiti celo simbolično nagradimo 0:)
Otroška radovednost - gonilo napredka.
  • spremenilo: OwcA ()

OwcA ::

Nekdo mora biti prvi.

qndxp (Quick'n'Dirty XML Parser)



xmlparser.h
xmlelement.h

Kot že ime pove je zadevščina vsmerjena predvsem v hitrost obdelovanja XML-jev (dokument s 20,000 elementi in največje globine 3 (tu je večina elementov) prebavi v manj kot 1 s). V dobršni meri je to mogoče na račun predpostavke, da je vhod veljavnen XML dokument in ene za uporabo ne najbolj elegantne rešitve.
No, da ne bom preveč skromen, tudi koda je fenomenalna. 8-)

Testriano s prevajalnikom Intel C++ Compiler v8.0 in Dinkumware C++ knjižnico.

GPL licenca.

P.S. se je kdo kaj igral s const? Kaj pridobiš, če vse kar lahko določiš za konstanto?
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Vesoljc ::

varnost? kake pohitritve ni za pričakovati, saj se const preverja ob preverjanju (compile time).
Abnormal behavior of abnormal brain makes me normal...

OwcA ::

Ampak, ali se konstante ne shranjujejo drugam kot spremenljivke?
Otroška radovednost - gonilo napredka.

Vesoljc ::

kako misliš drugam? registri?

mogoče keyword const lahko pomaga prevjalniku ob optimizaciji, ampak ziher pa ne vem...
Abnormal behavior of abnormal brain makes me normal...

CCfly ::

const je samo syntax sugar, ki ti pomaga da že pri prevajanju odkriješ, kje si hotel spremeniti vrednost, ki je nisi smel. Da bi vrednosti prevajalnik kam drugam skladal pa prič slišim. Sicer pa lahko preizkusimo.
"My goodness, we forgot generics!" -- Danny Kalev

64202 ::

Hehe kewl, en minimini trik
#define EACH(_it, _cont) ::const_iterator _it = (_cont).begin(); _it != (_cont).end(); ++_it
#define EACH_MUTABLE(_it, _cont) ::iterator _it = (_cont).begin(); _it != (_cont).end(); ++_it


To gre potem tkole:
std::vector<std::string> vektorck;
for(std::vector<std::string> EACH(el, vektorck))
    std::cout << *el << std::endl;


std::map<int, std::map<std::string, std::string> > nekifejstzajebanga;
for(std::map<int, std::map<std::string, std::string> > EACH(i, nekifejstzajebanga))
    for(std::map<std::string, std::string> EACH(j, i->second))
        std::cout << i->first << " " << j->first << " " << j->second << std::endl;


Vsaj jaz tko kodiram, da imam to vsakih pet vrstic :)

OwcA ::

Ja, imata prav, zamešal sem s C (ako me spomin ne vara, celo ne prvič, si bo treba en "Ne pozabi" pildek nekam pripopat s pripisom "preden pametjuješ po ST" ;)). Skratka:
When you define a const in C, the compiler creates storage for it, so if you define more than one const with the same name in two different files (or put the definition in a header file), the linker will generate error messages about conflicts.

Iz Thinking in C++, 2nd edition, Volume 1
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Thomas ::

CONSTante kot PI, e ... itd morš definirat takoj na začetku. Ker če se PI naprimer spremeni, popraviš samo tisto vrstico, še enkrat skompiliraš, pa vse laufa!

Blebečem ... zanemari.

Sicer je pa razlika med dojemanjem variable in konstante pri programu ta, da je enkrat zadeva skozi opcodo dobavljena kot memorijska referenca, drugič pa kot data. Malenkostne razlike so.

OwcA ::

Sicer je pa razlika med dojemanjem variable in konstante pri programu ta, da je enkrat zadeva skozi opcodo dobavljena kot memorijska referenca, drugič pa kot data. Malenkostne razlike so.

To je veljalo v C, v C++ pa ne več.
int a = 4;
return a;

se prevede v:
mov       eax, 4  
mov       esp, ebp
pop       ebp     
ret

in
const int a = 4;
return a;

takisto v
mov       eax, 4  
mov       esp, ebp
pop       ebp     
ret

Uporabljen Intelov C++ Compiler v8, stikala FAs, O2.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Gundolf ::

V c++ ni takega direktnega pomena const. Si pa mislim da prevajalnik lahko z njo malo pomaga pri optimizacijah, le da na druge načine. Če recimo kličeš const metodo nekega razreda bo vedel, da se v uporabljenem objektu ne more stanje nič spremeniti in v pravih okoliščinah si bo znal s tem pomagati. Vsaj upam da je tako.

nevone ::

Konstantne spremenljivke (konstante) itak pogosto prerastejo v spremenljivke. ;)

o+ nevone
Either we will eat the Space or Space will eat us.

OwcA ::

Ena (izmed redkih) grda lastnost STL kontejnerjev je nekonsistentnost vračanja vsebine. Vsi asociativni kontejnerji namreč vrnejo par (implementiran kot std::pair) ključ-vrednost, kar jih naredi dokaj nedostopne dobrotam v <algorithm>. Tu prideta na pomoč pričujoča adapterja:
template <typename P>
	class strip_pair1st: public std::unary_function<P, typename P::first_type> 
{
	typedef typename P argument_type;
	typedef typename P::first_type result_type;
	const result_type &operator()(const argument_type &p) const 
	{
		return p.first;
	}
};

template <typename P>
	class strip_pair2nd : public std::unary_function<P, typename P::second_type> 
{
	typedef typename P argument_type;
	typedef typename P::second_type result_type;
	const result_type &operator()(const argument_type &p) const 
	{
		return p.second;
	}
};

Prvenstveno sta, kot že rečeno, namenjena podatkovni strukturi std::pair, delujeta pa seveda z vsakim objektom, ki definira ustrezeno infrastrukturo.

Izpolnjujeta zahtebe STL protokola Adaptable Unary Function.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

64202 ::

owca: jooo, pa tle je vec birokracije ko na nasih obcinah :D :D :D

Sem se spomnil se en trik, sicer dokaj temen koticek c++-sa :). Zelo uporabno za kako avtomatsko lockanje objektov ipd., seveda z uporabo bolj "pametnih" smart pointerjev, kot je v tej kodi:

#include <iostream>

struct Juhu {
        void a() { std::cout << "Juhu::a()\n"; }
        void b() { std::cout << "Juhu::b()\n"; }
};

struct Ovitek {
        Juhu *p;

        Ovitek(Juhu *p_): p(p_)
        { std::cout << "Ovitek::ctor\n"; }

        Juhu *operator -> () { return p; }

        ~Ovitek()
        { std::cout << "Ovitek::dtor\n"; }
};

template <class T, class W>
struct scoped_ptr {
        T *p;

        scoped_ptr(T *p_): p(p_) { }

        W operator -> ()
        { return W(p); }

        ~scoped_ptr() { delete p; }
};

int main()
{
        scoped_ptr<Juhu, Ovitek> juhu(new Juhu);

        juhu->a();
        juhu->b();

        return 0;
}


Izpis:
Ovitek::ctor
Juhu::a()
Ovitek::dtor
Ovitek::ctor
Juhu::b()
Ovitek::dtor

Thomas ::

type logaritem extended
   type number extended
   type counts integer
   type iterations integer
   type i integer

   ader=1;
   log2number=0;
   somehow get number;     // should be number > 1

   iterations=20;
  
   for (i=1;i<=iterations;i++) {
     counts=0;
     while (number>2) {
           counts++;
           number/=2;
     }
     number=number*number;
     log2number=log2number+counts*ader;
     ader/=2;
   }

OwcA ::

Skopirano iz teme C++ programirane v Open GL oz. Direct x, avtor SasoS
Evo moja stvaritev :D. Zadeva je spisana v C-ju, uporablja SDL knjižnico in je cross-platform - deluje tako v linuxu kot windowsih 8-). V sourcu sta priložena linux in mingw makefajla, načeloma bi se stvar kompajlala tudi v Visual Studiu ampak nisem šel delat projekta. Stvar mi je všeč ker je dokaj kompaktna (< 2000 vrstic) in še kar napredna :). Svet se naloži iz datoteke data.dat, source in programček ki tak file zgradi je v data poddirektoriju hkrati z vsemi modeli ki so v samplu. Kontrole so standard w s a d + miš za pogled, q je skok, f flashlight :D. S kurzorji (+home in end) se da en kvadrat in tisti koodrinatni sistem na sredini vrtet okoli vseh treh osi, g zriše še bound boxe od collision detectiona dočim je alt-enter fullscreen toggle. Koda je GPL tako da če kdo kaj pametnega pogrunta mora to objavit tu >:D. Še ena slikca...ja na stolpnico se da prit ;)



Linki:
Win32 binary (1 MB)
Source (15KB)
Otroška radovednost - gonilo napredka.

Mmm'Aah ::

Portable C funkcija, ki vrne trenutni datum v tekstovni obliki. Treba bi blo se upostevat casovni pas in zimsko/poletni premik ure. A se komu da to še poštelat? Sicer sem pa pisal direkt na prvo žogo in bi se dala stvar se ful zoptimizirat, da je manj vrstic...ampak tako je dokaj berljivo se mi zdi.

Sem pozabu kire fajle je treba #include-at. Na linux-u precekirajte "man time" v konzoli, na Winsih pa ne vem (uporabi Google;).

BTW: kako za vraga se vstavi eno kodo tle v post, brez da bi mi uničil tab-e in težil za HTML tag-e ko napišem "je manjse ali enako"???

char* IzpisiDatum()
{
	long totalSeconds=time(NULL), year=1970, month=1, day=1;
	int secPerYear = 31536000;
	int secPerDay = 86400;
	int addSeconds;
	char *date;
	
	while (1)
	{
		addSeconds = ((year%4) ? secPerYear : secPerYear+secPerDay);
		
		if (totalSeconds - addSeconds < 0) break;
		totalSeconds -= addSeconds;
		year++;
	}
	
	while (1)
	{
		if (month == 2)
			addSeconds = ((year%4) ? 28*secPerDay : 29*secPerDay);
		else if (month < = 7)
			addSeconds = (month%2 ? 31*secPerDay : 30*secPerDay);
		else
			addSeconds = (month%2 ? 30*secPerDay : 31*secPerDay);
			
		if (totalSeconds - addSeconds < 0) break;
		totalSeconds -= addSeconds;
		month++;
	}
	
	day = totalSeconds/secPerDay + 1;

	date = (char*)malloc(256);
	sprintf(date, "%i/%i/%i\0", day, month, year);
	return date;
}


[Edit: kodo daš med taga st.koda in /st.koda, znotraj oglatih oklepajev (da ti bo bolj jasno lahko klikneš na tem postu popravi in pogledaš) - Gundolf]

Zgodovina sprememb…

  • spremenil: Gundolf ()

Mmm'Aah ::

V par postih pod drugimi topici sem že omenil en moj projekt, ki zadeva portable zbirko classov za splošno kodiranje ter grafični vmesnik s podporo za skinnanje s slikicami. Mislim da je prav da to oznanim pod tem topicom.

Stvar se (zaenkrat) imenuje ShmanssyGUI in se uporablja kot knjižnica. Spisek classov, ki se trenutno nahajajo v zbirki je naslednji:

SG_String
SG_ArrayList
SG_LinkedList
SG_CursorList
SG_Bitmap
SG_Texture
SG_Layout
SG_Window
SG_Label
SG_Button
SG_CheckButton
SG_CheckGroup
SG_ScrollBar
SG_TextBox
SG_ListBox
SG_ComboBox
SG_ExtendFrame
SG_SockServer
SG_SockClient


V enem drugem topicu mi je Gundolf dal mislit in sem stvar še malo preuredil, filtriral kodo, zbrisal nepotrebne stvari itd. Zdaj se lahko knjižnico skompajla na dva načina in za dva stila uporabe. Za osnovni sistem, ki kreira glavno okno in obravnava dogodke se lahko izbere SDL ali GLUT. Tako lahko zdaj zadevo prevedem v dve različni knjižnici:

libShmanssyGUI - programi s to knjižnico morajo linkat še GL, GLU, GLUT (in pthread v Win OSu). Grafika se osvežuje konstantno. Znotraj programa se lahko uporablja tudi OpenGL klice za risanje 3D grafike (kmalu nameravam nardit kontrolo SG_GLView. Primerno za igre, in zahtevnejše grafične aplikacije.

libShmanssyGUI_SDL - programi s to knjižnico morajo linkat še SDL. Delajo tudi na švoh mašinah brez OpenGL podpore. Grafika se osvežuje ob dogodkih. Primerno za simple programčke.

V obeh primerih je sintaksa uporabe čisto enaka. Končni uporabnik prazaprav ne vidi razlike v kodi. Porihtal sem tudi glavne initializacijske funkcije tako da je vzpostavitev zdaj dosti bolj preprosta:

SG_Init(argc, argv);
SG_CreateMainWindow(SG_WINDOWED/SG_FULLSCREEN, sirina, visina, bpp);

na koncu pa samo:
SG_CleanUp();

Tu sta sliki iz dveh programov, ki jih trenutno delam s ShmanssyGUI:

To je programček za delat kurzorje. Skinnal sem ga v MacOSX izgled:
kajjstvem

To je pa ena igrica. Z njo testiram vse kar se tiče ShmanssyGUIja (socket utilities, zahtevne grafične operacije: prozornost, večanje/manjšanje slikic, real-time alpha-blending, 32-bitni BMPji):
kajjstvem


Trenutno nimam še napisanega nobeneda helpa ali dokumentacije kako se funkcije SG-ja uporablja, ampak so itak tako preproste za zaštekat, da mislim da nihčne ne bi smel imeti problema. Najprej bi rad vedel če koga sploh zanima da bi to uporabljal, da pol spišem eno kratko dokumentacijo in dam stvar na kakšen server da jo lahko dol poberete.

Zgodovina sprememb…

  • zavaroval slike: Gundolf ()

CCfly ::

Mogoče bi lahko prvo source kodo dal na server.
"My goodness, we forgot generics!" -- Danny Kalev

noraguta ::

tale ShmanssyGUI kontrole najbržda niso windowless ? ali pač ?
Pust' ot pobyedy k pobyedye vyedyot!

Mmm'Aah ::

Source kodo za ShmanssyGUI sem dal na server. Tu je link:
ShmanssyGUI - source

V ZIP paketu so headerji, source datoteke, ter standardne slikice in font v direktoriju "gfxStandard". Te standardne slikice se rabijo za nekatere kontrole (puščice na scroll-barih), font pa je potreben ne v SDL načinu (kmalu bom prestavil na SDL_ttf knjižnico, ki podpira tudi fonte) in ga zloadamo v kodi z ukazom:

SG_LoadFont("gfxStandard/font.sgf")

Kodo je treba prevest v statično knjižnico. Kateri bazni sistem želimo izbrati (SDL ali OPENGL) je določeno z #define ukazom na začetku datoteke "ShmanssyGUI.h" in sicer:

#define SG_BASE SG_SDL
ala
#define SG_BASE SG_OPENGL

Ko želimo v programu uporabiti knjižnico, potrebujemo le eno "header" datoteko:
#include "ShmanssyGUI.h"

Linkati pa je treba naslednje zadeve:

SDLmain.lib, SDL.lib, ShmanssyGUI.lib (za SDL bazo)
opengl32.lib, glu32.lib, glut32.lib, ShmanssyGUI.lib (za OpenGL bazo)

Če želimo uporabljati SG_SockServer ali SG_SockClient na Windows sistemu, je treba linkat še wsock32.dll, ter pthreadVC1.dll. Kako se poštima druge potrebne knjižnice (sdl, glut, pthread) piše na naslednjih straneh:
libSDL.org
GLUT setup tutorial
POSIX Threads Win32

OPOMBA!: Trenutno imam malo probleme z nekaterimi tipi BMP slik v OpenGL načinu na Windows platformah, zato ne se čudit če se kakšna slikica pod omenjenimi pogoji ne bo prikazala.

Mmm'Aah ::

ja, da odgovorim še noraguti:

Ko govoriš o windowless kontorlah se nekako ne morem znebit občutka da imaš v mislih MFC ali kaj podobnega. Vse kontrole v ShmanssyGUI-ju sem sam spisal in delujejo v nekem kvazi window managerju, ki sem ga tudi jaz spisal, tako da to nima nič veze z običajnimi windows kontrolami ali kakršnimikoli drugimi standardnimi OS kontrolami.

Vse kar v SG programih izvira iz operacijskega sistema je le osnovno okno, ki se odpre na začetku, ter sporočila o dogodkih, ki jih program prejema od operacijskega sistema. Vse drugo je le narisano notri v osnovnem oknu in tako urejeno, da zgleda kot neke "prave" kontrole. SG ni le neka maska za operacijski sistem, ampak je nekakšen "mini window manager" znotraj enega okna. Ne vem kako bi bolj nazorno to opisal...če si želiš razjasnit za kaj se gre downloadaj kodo pa si poglej;)

Mmm'Aah ::

Sem še malo predelal SG. Popravil sem napako, ki je povzročala težave z BMP slikami. Trenutno imam samo malo težav z dolgim tekstom v TextBox-u. Stvari sem tudi malo bolj avtomatiziral tako da ni treba več klicat SG_Init in SG_CleanUp funkcij. Vse kar zdaj programček potrebuje je:

#include "ShmanssyGUI.h"

int main(int argc, char **argv)
{
SG_CreateMainWindow(SG_WINDOWED ali SG_FULLSCREEN, sirina, visina, bitsPerPixel);

[ostala koda]
}

Kodo lahko poberete na prejšnjem linku...če sploh koga zanima....

Nerdor ::

Mmm'Ah: dej ti to še bolj natančno opiši kako se nastavi vsaj "Hello World" SG! Ker jest nikjer ne najdem "ShmanssyGUI.lib" v tistem zipu! Imam VS.Net2003 (academic ed.) pred seboj. Imam nastavljena SDL in OpenGL Lib-e. Kako zdej integriram "ShmanssyGUI.h" !?
... for lifetime!

Jebiveter ::

Mmm'Aah: Ja, dej napisi en README kako skompajlat library, da se ga da potem dinamicno linkat, da lahko koncno skompajlam netshooterja :)
Certainty of death. Small chance of success. What are we waiting for?

64202 ::

Samo ugibam - nardis nov projekt s tipom DLL, dodas surs fajle notri in stisnes build? (ob predpostavki, da imas include pa lib dir. za sdl/... postimane)
I am NaN, I am a free man!

Mmm'Aah ::

ok, prvo bi prosil če si poberet dol source še enkrat, ker prej ko sem vso kodo dokončno urejal da je lepa za videt sem zaje... par stvari in ni delal pravilno TextBox, pa tipkovnica v OGL načinu. Zdej sem stestiral vse in bi moglo delat. Vseeno je podpora za tipkovnico še bolj bedna, zato se ne da napisat vse znakov itd. Moram preštudirt encodinge in jih nekako implementat not. Tle je še enkrat link, da ne boste iskali po prejšnjih postih:

ShmanssyGUI source

Js sm dozdej kompilal stvar samo kot statičen library tako da ne vem še kako se obnaša kot dinamičen lib, ma verjetno je enako. Edino ne vem, če je mogoče za dinamičen lib treba linkat vse potrebne stvari že ko prevajaš knjižnico, ker za statičen lib se ga samo prevede, pol se pa v programu v katerem ga uporabljaš linka ostale potrebne stvari. Poskusil sem prevajat na Mac-u v XCode, na Linux-u v Anjuti in na Winsih v Visual C++. Pri vse treh je blo treba samo izbrat static library projekt, zmetat not source in stisnit Build.

Ker je verjetno večina Windows uporabnikov bom tukaj napisal postopek, kako se nardi eno "Hello world!" aplikacijo (potem ko je library že skompilan v SDL načinu):

- Odpreš Visual C++
- Nardiš nov prazen projekt tipa Win32 application
- V mapo kjer si ustvaril projekt skopiras mapo "gfxStandard" vključno z njeno vsebino
- Slediš navodilom na strani www.libsdl.org, kakšne so nastavitve za prevajat SDL aplikacije
- Greš pod Project -> Settings in na Link jezičku na konec vrstice dodaš: "SDLmain.lib SDL.lib ShmanssyGUI.lib"
- Greš pod Options... (sem pozabil točno kje se nahaja) in v Include folders jezičku dodaš Headers mapo, ter v Library folders dodaš mapo kjer je narjen ShmanssyGUI.lib
- Nardiš novo datoteko main.cpp
- Napišeš sledečo kodo:

#include "ShmanssyGUI.h"

int main(int argc, char **argv)
{
//naredimo glavno okno
int sirina = 400, visina = 300;
SG_CreateMainWindow("Window Title", SG_WINDOWED, sirina, visina, 32);
//nalozimo osnovni font
SG_LoadFont("gfxStandard/font.sgf");

//naredimo nov SG_Label
SG_Label *lblHello = new SG_Label();
//nastavimo velikost in pozicijo (po visini na sredi, po sirini cez celo okno)
lblHello->SetBounds(0, visina/2, sirina, 20);
//izključimo avtomatsko velikost(default=vkljuceno)
lblHello->SetAutoSize(false);
//nastavimo sredinsko poravnavo
lblHello->SetHAlign(SG_ALIGN_CENTER);
//nastavimo tekst
lblHello->SetText("Hello World!");
//nastavimo barvo teksta
lblHello->SetTextColor(255,255,255);

//pozenemo glavni cikel
SG_EventLoop();
}

ShmanssyGUI ima vedno izpise v konzolo (printf) če je kaj narobe. Če želite te izpise v primeru težav videti, kreirajete Win32 Console Application namesto prej navedenega tipa projekta. Ponavadi je problem v tem, da gfxStandard ni na pravem mestu in zato ne najde font.sgf datoteke, pol pa nikjer ni teksta.

Čimprej se bom lotil postavit en "official" page za ShmanssyGUI kjer bo dokumentacija in vzorčni programčki.

Nerdor ::

Ne morem zbuildat ShmanssyGUI.lib (kot statičen lib), ker mi ne najde
<pthread.h>
. Kje dobiti ta header !? Imam pa VS.Net 2003
... for lifetime!

64202 ::

POSIX threadi so to, mas link zgoraj. Dokumentacija[tm] je pa na stran na www.unix.org, pa se je treba malo preklikat, je pa pod System Interfaces s funkcijami pthread_*

Aja, pa bistvena prednost pthreadov pred win32 threadi so poleg portabilnosti predvsem condition variables.
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[java] naloge za vajo

Oddelek: Programiranje
7916 (602) Yacked2
»

vector::iterator problemi, brisanje podatkov iz vektorja

Oddelek: Programiranje
8663 (514) mn
»

[C++] prevajalnik hoce konstruktor za strukturo

Oddelek: Programiranje
181915 (1619) Tr0n
»

[c++] & Win32 API?

Oddelek: Programiranje
131403 (1208) 64202
»

[Python] GePARD

Oddelek: Programiranje
161364 (1197) OwcA

Več podobnih tem