|
Ha minősítve van az osztály nevével akkor nem. Én inkább arra gondolok, hogy valahol van egy ilyen:
Kód: A a;
a.instances[0] = 5; // error 'instances' is private
|
|
|
Idézet Asylum :
Biztos vagy te benne, hogy arra dobja a hibaüzenetet? Nem azért dobja mert valahol hivatkozol rá? (és nem az osztályon belül).
Végül is a C++ .cpp fájljaiban "osztályon kívüli" hivatkozások vannak, nem?
(Úgy értem, minden tag (member) elé ki kell írni az osztály nevét: Nem lehet, hogy emiatt van probléma?)
|
|
|
Biztos vagy te benne, hogy arra dobja a hibaüzenetet? Nem azért dobja mert valahol hivatkozol rá? (és nem az osztályon belül).
|
|
|
Idézet Asylum :
Nem az volt az első, és milyen fordítót használsz mert nálam gcc-vel is és vcc-vel is megy.
Úgy értem, én azt próbáltam először, amúgy GCC-t, de nem hiszem, hogy ez számítana...
|
|
|
Egyébként, ha a header-ben olyat csinálok, hogy:
Kód: private :
static const int INSTANCES = 2;
static MapMenu instances[INSTANCES];
Akkor nem (erre) dob hibaüzenetet.
|
|
|
Nem az volt az első, és milyen fordítót használsz mert nálam gcc-vel is és vcc-vel is megy.
|
|
|
Idézet Asylum :
És így?
Kód: MapMenu MapMenu::instances[MapMenu::INSTANCES];
Ez volt az első változat. 
(Amúgy a hibaüzenetből kiderül, hogy nem ez a baja.)
Idézet Asylum :
Jagged tömbre meg... az átlagos megoldás (de ezt csak függvény törzsében).
Kód: int masik[] = { 5, 6, 7, 8 };
memcpy(egyik, masik, 4 * sizeof(int));
Ilyen "sátáni" technikákhoz nem akarok fordulni, az OOP keretein belül gondoltam.
|
|
|
És így?
Kód: MapMenu MapMenu::instances[MapMenu::INSTANCES];
Jagged tömbre meg... az átlagos megoldás (de ezt csak függvény törzsében).
Kód: int masik[] = { 5, 6, 7, 8 };
memcpy(egyik, masik, 4 * sizeof(int));
|
|
|
Idézet Asylum :
Konstans változó csakis deklarációkor kaphat értéket. (amit te csinálsz az már definíció, konstans változóra értelmetlen).
Más esetekben teljesen jól működik a dolog, itt is "csak" a láthatósággal van gond.
(Ha a header-ben adok neki értéket, akkor is ugyanez a nyomora.)
Idézet Asylum :
Jagged tömböt ha jól tudom nem lehet ilyennel inicializálni. (mindig az járjon a fejedben, hogy a deklarációkor való kezdőérték adásnál a copy konstruktor fut le).
Az tiszta, hogy jagged tömbnél ezt nem lehet használni, a kérdés inkább arra vonatkozott, hogy mit kéne helyette használni: new-val létrehozni dinamikus tömböket, vagy létrehozni (változóként) több sima tömböt, majd létrehozni egy olyan tömböt, ami ezeket tartalmazza, stb...
|
|
|
Milyen érdekes bugokat fedezel fel
Konstans változó csakis deklarációkor kaphat értéket. (amit te csinálsz az már definíció, konstans változóra értelmetlen).
Jagged tömböt ha jól tudom nem lehet ilyennel inicializálni. (mindig az járjon a fejedben, hogy a deklarációkor való kezdőérték adásnál a copy konstruktor fut le).
|
|
|
Na, megint sikerült belefutnom két érdekes dologba...
Az egyik:
MapMenu.h
Kód: private :
static const int INSTANCES;
static MapMenu instances[];
MapMenu.cpp
Kód: const int MapMenu::INSTANCES = 2;
MapMenu MapMenu::instances[INSTANCES];
hiba:
‘const int GraphicsLib::MapMenu::INSTANCES’ is private
A másik egy kérdés: C++-ban hogyan lehet legrövidebben inicializálni egy "jagged" tömböt?
Valami olyasmi kéne, mint a sima tömböknél:
Kód: int array[] = {1, 2, 3};
szerk: Persze lehet vector vagy bármi más, a lényeg a rövid inicializálás...
Ezt a hozzászólást bit.0x8000 módosította (2010.03.24 01:14 GMT+1 óra, ---)
|
|
|
Ez upcast.
Érdekes egyébként eddig fel se tünt, hogy ez nem megy. Úgy látszik a ?: operátor mindkét ágának kasztolhatónak kell lenni a másikra.
|
|
|
Idézet proof88 :
Most lehet hülyeséget írok, de:
Kód: struct A { };
struct B : A { };
struct C : A { };
A *a;
B *b;
C *c;
a = condition ? (A*)b : (A*)c;
Akkor ketten írtunk hülyeséget, mert én is így oldottam meg. 
(Igazából elég az egyiket kasztolni.)
Csak hát szerintem elég randa megoldás "kézzel" downcast-elni objektumokat...
szerk: Vagy ezt upcast-nek hívják?
Ezt a hozzászólást bit.0x8000 módosította (2010.03.22 19:54 GMT+1 óra, ---)
|
|
|
Most lehet hülyeséget írok, de:
Kód: struct A { };
struct B : A { };
struct C : A { };
A *a;
B *b;
C *c;
a = condition ? (A*)b : (A*)c;
|
|
|
Az alábbi probléma már több nyelven is előjött, most épp C++-ban. Tehát:
Kód: double a;
int b;
float c;
a = condition ? b : c;
Ez, nem meglepő módon, működik, hála az implicit cast-nek. Viszont az alábbira hibát dob a fordító:
Kód: struct A { };
struct B : A { };
struct C : A { };
A *a;
B *b;
C *c;
a = condition ? b : c;
...pedig szerintem ez is "értelmes" eset.
Ennek a működésnek lehet valami oka, vagy egyszerűen csak hiányosság?
|
|
|
Idézet Seeting :
Létezik valamilyen standard grafikai lib amivel ilyen alap dolgokat lehet rajzolni? kör, négyzet, ilyesmi... 2D
ezeket konnyen megcsinalhatod te is, ha nem sebessegkritikus a cucc akkor egyszeru algoritmusokkal is konnyen leimplementalhato (ha mar eljutottal odaig, hogy pixelenkent tudsz rajzolni a kepernyore)
de kulonfele alakzatokat tudsz rajzolni pl. az SDL_gfx csomaggal, ami nem meglepo modon az SDL-t hasznalja
|
|
|
Seeting: alap gdi32.dll-ben benne vannak ezek, amihez van borland delphiben is .pas header fájl. De elég csak a Windows.pas-t usesolni hozzá.
|
|
|
Csak egy megjegyzés: ha ilyen compiler warningot kaptok, hogy /GS cannot protect parameters ... akkor az azért lehet mert ki van kapcsolva az optimalizálás (/O2).
|
|
|
"és figyelj oda hogy a beállitás UTÁN töröld le" - nyilvan, viszont amikor ugy csinaltam, h set render target, utana torles, azutan occlusion boxok rajzolasa, az ugy szinten nem volt jo. Csak ugy mukodokepes a dolog, ha az occlusionos marhasag utan torlom, majd azutan reset to backbuffer
|
|
|
A glut biztosan nem, hiszen nem is rajzolásra való (de pár dolgot tud pl. utah teapot, gömb, kocka, kúp stb - de 2D-s dolgokat nem).
A GDI jó választás lehet szerintem is.
|
|
|
És ez megy borland fordítóval is?
|
|
|
sima GDI is tud szerintem (vagy linux alatt az X).
|
|
|
Nekem olyan kell, mint amilyen a pascal-hoz volt. A glut az egy openGL-es cucc, nem akarom ezért belefordítani az ogl-t.
|
|
|
|
Létezik valamilyen standard grafikai lib amivel ilyen alap dolgokat lehet rajzolni? kör, négyzet, ilyesmi... 2D
|
|
|
Egyrészt a backbuffert inkább igy kérd el:
Kód: LPDIRECT3DSURFACE9 backbuffer = NULL
device->GetRenderTarget(0, &backbuffer);
// cucc
device->SetRenderTarget(0, backbuffer);
// végsö rajz
backbuffer->Release();
Másrészt mindig mikor uj rendertargetet állitasz be érdemes letörölni azt és a zbuffert is (és figyelj oda hogy a beállitás UTÁN töröld le).
|
|
|
No kerem szepen. Multkoriban csinaltam az occlusion culling-ot, viszont eszrevettem egy kis bugot. A hajoknal egy-egy boxot rajzolok ki az occlusion teszt resznel. Valahogy igy nez ki pseudo kodban:
Kód: - set rendertarget (0,nev)
- entities listan vegigmegyunk:
- ha az i-edik entitiy nem latszik, akkor megyunk a kovetkezore a listaban (elozetes vfc teszt)
- a beepitett dx-es algoval szamolom, hogy latszik-e az adott entity, majd fogom es beallitom ezt neki (a lathatosagot)
- reset to backbuffer
- entities lista ismet:
- ha latszik az i-edik entity, kirajzolom a rendes mesht.
Ami a kepen lathato az az urhajo egyik box-a. Fogalmam sincs, hogy hogyan kerult oda, nem is igazan mozog egyutt rendesen a kameraval, szoval eleg bizonytalan volt megtalalni:

set render target egyertelmu.
Kód: for (DWORD i = 0; i < entities.size(); i++)
{
//ha mar a vfc azt mondta, hogy nem latszik...
if (entities[i]->GetOCulled())
continue;
occlusion->GetQuery()->Issue(D3DISSUE_BEGIN);
entities[i]->SetCamera(camera);
//CSAK a box-okat rajzolom ki
entities[i]->DrawOcclusion();
occlusion->GetQuery()->Issue(D3DISSUE_END);
DWORD pixelsVisible = 0;
while (occlusion->GetQuery()->GetData((void*)&pixelsVisible, sizeof(DWORD), D3DGETDATA_FLUSH) == S_FALSE);
//a dx-es mutyur elvegzi helyettem a lenyeget
if (pixelsVisible == 0)
entities[i]->SetOCulled(true);
else
entities[i]->SetOCulled(false);
}
a reset to back buffer pedig igy nez ki:
Kód: IDirect3DSurface9* bb;
app->GetDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &bb);
app->GetDevice()->SetRenderTarget(0, bb);
bb->Release();
Ja meg talan ami meg itt erdekes lehet az a box-ok kirajzolasa:
Kód: GetGame()->GetDevice()->SetTransform(D3DTS_WORLD, (D3DXMATRIX*)world.m);
GetGame()->GetDevice()->SetTransform(D3DTS_VIEW, (D3DXMATRIX*)camera->GetView().m);
GetGame()->GetDevice()->SetTransform(D3DTS_PROJECTION, (D3DXMATRIX*)camera->GetProjection().m);
occlusionModel->GetMesh()->DrawSubset(0);
Eddig akarmit probaltam mindig ott volt az a kis ize (es mindig a backbuffer szinevel, ezert is vettem eszre alig)
De nem is igazan ertem, hogy ha a render targetbe rajzolom csak ki a boxokat, akkor hogy latszodhat?...
szerk.:
Erdekes: ha az occlusion teszt resz elott es a backbufferre valo reseteles elott tolok egy ilyet, hogy:
Kód: game->GetDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(128,128,128), 1.0f, 0.0f);
akkor megszunik a problema. Na most ez nekem eleg is lenne, de megsem..  (na ezt megaszontam'  Tudni szeretnem, hogy mi ez a bug
Ezt a hozzászólást Pretender módosította (2010.03.14 16:31 GMT+1 óra, ---)
|
|
|
Idézet bit.0x8000 :
Idézet Seeting :
gvim + g++
Tessék. Kész a fejlesztő környezeted 
És érdekes módon ebben a környezetben is írtak használható programokat...
en jelen pillanatban is vimben (nem gvim, bar az ugyanaz, olyan meg nincs hogy vim++  ) irom a PACC-ra keszulo jatekomat, meg ugy altalaban mindent (munka, stb)
zsenialis szovegszerkeszto, fenyeveket ver minden masra amit ismerek 
buildhez raszoktam a CMake-re, jo kis tool, nem is kell mellejuk mas
MOD: amugy ha 'fullextras' IDE kell, akkor erdemes megnezni a Qt Creatort, egesz jo kis cucc, bele van integralva a Qt designer, meg van vim-modja is, bar sajna teljesen hasznalhatatlan a valodi vimhez kepest
a KDevelop meg borzalom
Ezt a hozzászólást glezmen módosította (2010.03.13 13:06 GMT+1 óra, ---)
|
|
|
|
hát nem akarlak megbántani, de seet itt jóval öregebb motoros, mint te
|
|
|
"Pffff. Ezt meg se hallottam.
...
Most elmegyek és hozok egy kis szentelt vizet ellened. XD"
Az öreg motorosokon az sem fog...
Písz
|
|
|
btw, mi is vimet és g++ -t használunk renges munkahelyi fejlesztőkörnyezetként. mondjuk amit használunk linux disztrót, abban semmi ablakkezelő nincs,ez is igaz
|
|
|
Pffff. Ezt meg se hallottam.
...
Most elmegyek és hozok egy kis szentelt vizet ellened. XD
|
|
|
Idézet Seeting :
Bizonyítsd be, hogy a GTA IV-et nem ezzel a környezettel írták! 
Ha ebben írták volna, akkor jó lenne...
|
|
|
Bizonyítsd be, hogy a GTA IV-et nem ezzel a környezettel írták!
|
|
|
Idézet Seeting :
Kimondta hogy nem? Bizonyítsd be, hogy én nem ezzel dolgozom...
Miért tenném?
|
|
|
Kimondta hogy nem? Bizonyítsd be, hogy én nem ezzel dolgozom...
|
|
|
Idézet Seeting :
gvim + g++
Tessék. Kész a fejlesztő környezeted 
És érdekes módon ebben a környezetben is írtak használható programokat...
|
|
|
gvim + g++
Tessék. Kész a fejlesztő környezeted
|
|
|
Idézet MaximumViolence :
ha mar code::blocks,mondjatok mar linuxra egy ertelmes ide-t.code::blocks-nal szebb,jobb letezik?
Vim ?
|
|
|
az meg szornyubb
|
|
|
|
ha mar code::blocks,mondjatok mar linuxra egy ertelmes ide-t.code::blocks-nal szebb,jobb letezik?
|
|
|
Nah a megoldás triviálisabb mint a void*.
Azt elfelejtette emliteni a kolléga, hogy code::blocks-ot használ, ami úgylátszik butább mint az átlag és az örökölt template memberre igy kell hivatkozni:
Kód: this->_x;
|
|
|
Oké de akkor mire dobja a hibát?
Most soronként könyörögjem ki?  Vagy gyere msn-re.
|
|
|
a number mutatójával csak az első paramétert írom ki, amit simán a gettel elérek, mivel már az ősosztályban definiálva van
|
|
|
Statikus és dinamikus típus apám; dinamikus kötés, polimorfizmus.
A Number-ben hol van definiálva getx() meg gety()? (már ha igy irod ki, egyébként még mindig nem irtad be azt a kódrészletet amire a hibát irja).
|
|
|
Kód: Number<int> my_number;
my_number.set( 31415 );
Pair<int> my_pair;
my_pair.setx( 10 );
my_pair.sety( 20 );
Number<int> *numptr = &my_pair;
...
Innentől már csak kiírogatom a különböző értékeket
|
|
|
Nálam továbbra is tökéletesen müködik.
Legalábbis ez a kód amit most beirtál.
Hogyan példányosítod?
|
|
|
jó bocs, na tegyük fel, hogy ott van, rosszul másoltam be, de viszont arra van tipped hogy miért nem megy template-el, ha inttel megy?
|
|