játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5462
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2523

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2192
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1654
syam:    1491
Frissebbek | Korábbi postok
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] > 30 < [35] [40] [45] [50] [55] [60] [65] [70] [75] [80] [85] [90] [95] [100] [105] [110] [115] [120] [125] [130] [135] [140] [141]
Pretender - Törzstag | 2498 hsz       Online status #167197   2011.10.20 07:00 GMT+1 óra  
Kód:
//header
typedef std::map<T,K> _map;
static _map map;

//cpp
Class::_map Class::map;

Class::~Class()
{
    map.Clear();
    _map().swap(map);
}

Mégis, a return 0 előtt van egy _CrtDumpMemoryLeaks, és 24 byte memory leaket ír. Miért? + Mi a megoldás? Vagy simán nincs megoldás, és ez így rendben van, mert a program lefutása után úgy is felszabadul a memória?

   
Joga - Törzstag | 1791 hsz       Online status #167147   2011.10.19 14:48 GMT+1 óra  
Ha a tagoknál fontos az inicializáció sorrendje, akkor ne használj initialization list-et, hanem konstruktorban inicializálj, kb ezt mondja a szöveg

Initialization list esetén a sorrend nem garantált
(ಠ ›ಠ) Stewie!

   
zeller - Törzstag | 478 hsz       Online status #167139   2011.10.19 11:55 GMT+1 óra  
Olvasgatom a c++ lite faq-ot es a ctor init listakhoz irta ezt:
Bottom line is to use common sense: if it's cheaper, better, faster, etc. to not use them, then by all means, don't use them. This might happen when your class has two constructors that need to initialize the this object's data members in different orders.
Miert lesz ez nem jo?

   
Pretender - Törzstag | 2498 hsz       Online status #166680   2011.10.13 06:11 GMT+1 óra  
Na igen... és ki beszélt itt biciklizésről? Nem azt mondtam, h ne kérdezz, de mindezt nagyon jól elmondja egy rakat könyv. Gondolom... én c#-ot tanultam először, de onnantól szinte mind1, csak a szintaktika más.

   
zeller - Törzstag | 478 hsz       Online status #166675   2011.10.12 21:35 GMT+1 óra  
De programozasi nyelvek szintaktikajat, szemantikajat es know-how-jat mar igen... Gyakorlassal egybekotve persze.

   
KILLER_RICSI - Tag | 8 hsz       Online status #166674   2011.10.12 20:59 GMT+1 óra  
Srácok, köszi a tanácsokat...

Könyvből sem tanult meg még senki biciklizni...

   
Pretender - Törzstag | 2498 hsz       Online status #166584   2011.10.11 20:44 GMT+1 óra  
Ja, lehet, hogy én is félreértettem
Érdemes tanulni egy kis OOP-t, és c++t

   
Asylum - Törzstag | 5462 hsz       Online status #166583   2011.10.11 20:28 GMT+1 óra  
Én még a kérdést se értem, csak sejtem mire gondolsz (a Map osztályból elérni egy main-ben deklarált tömböt?).
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Pretender - Törzstag | 2498 hsz       Online status #166582   2011.10.11 19:45 GMT+1 óra  
Kód:
Robotok* GetRobot(const int& p_Id)
{
    return robot[p_Id];
}

?

szerk.:
ajánlok valami alapokkal foglalkozó c++ könyvet

   
KILLER_RICSI - Tag | 8 hsz       Online status #166581   2011.10.11 19:42 GMT+1 óra  
Sziasztok!


Adott a következő példányosítás a main-ben:

Kód:
Robotok **robot = new Robotok*[n];
for(int i = 0; i < n; i++)
{
robot[i] = new Robotok();
}


Azt szeretném megoldani, hogy a Map osztály egyik metódusából tudjak hivatkozni a robotok osztály robot[ i ] valamelyik példányára.
Ehhez meg kellene adnom egy bemeneti paramétert a Map osztály adott metódusában, amit nem tudok.
Ugyan így kimeneti paramétert is tudnom kellene adni, ha változtatok valamit adott robot[ i ] példányon.

Tudna valaki segíteni? (Igen, beraktam kód-blokkba a kódot, hogy rendesen megjelenjen. - HG)

Köszi!

Üdv: Ricsi

Ezt a hozzászólást HomeGnome módosította (2011.10.11 21:23 GMT+1 óra, ---)

   
KILLER_RICSI - Tag | 8 hsz       Online status #166580   2011.10.11 19:36 GMT+1 óra  
Köszi!

   
Asylum - Törzstag | 5462 hsz       Online status #166487   2011.10.09 15:13 GMT+1 óra  
Kód:
class Map
{
private:
    int** tomb;
    int width, height;

public:
    Map() {
        tomb = NULL;
        width = height = 0;
    }

    ~Map() {
        // TODO: törölni a résztömböket
        delete [] tomb;
    }

    void resize(int w, int h)
    {
        // TODO: ha létezik már akkor töröld
        tomb = new int*[w];

        for( int i = 0; i < w; ++i )
            tomb[i] = new int[h];
    }
};
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
KILLER_RICSI - Tag | 8 hsz       Online status #166485   2011.10.09 14:54 GMT+1 óra  
Sikerült megint elakadnom....



A problémám most az, hogy nem tudok létrehozni dinamikus helyfoglalású tömböt a Map osztályban

Elgondolásom szerint a főprogramban adnám meg a 2D-s tömb méretét 2 változóval (x, y).
A Map osztályban két metódus segítségével állítanám be a tömb méretét (main-ból adnám át a két értéket, setx, sety).

A Map header file-ában pedig deklarálnom kell a matrix tömböt.
És itt jön a probléma, mert nem tudom előre a méretét, így nem tudom megadni....
Gondolom, hogy itt valami általános formulát kellene használni, amellyel jelzem, hogy lesz egy ilyen nevű tömb....

(Metóduson belül nem hozhatom létre a tömböt, mert az csak a metódus lefutásáig van életben.)

Tudna valaki segíteni?

Köszönöm!

Üdv: Ricsi

   
KILLER_RICSI - Tag | 8 hsz       Online status #166480   2011.10.09 13:58 GMT+1 óra  
Köszönöm, köszönöm!

Készülnek a robotok... ))


Üdv: Ricsi

   
gaborlabor - Moderátor | 4449 hsz       Online status #166479   2011.10.09 13:45 GMT+1 óra  
Robotok *robotok = new Robotok[n];
n a darabszám.
felszabadításnál delete[] robotok;

(amúgy a Robotok típust átnevezném Robot-ra.)

   
borsi - Tag | 180 hsz       Online status #166478   2011.10.09 13:44 GMT+1 óra  
pl
Kód:
Robotok **robot = new Robotok*[n];
for(int i = 0; i < n; i++)
{
robot[i] = new Robotok();
}


Ennél a megoldásnál még figyelni kell arra, hogy a delete [] robot; leakel, először végig kell menni a tömbön és egyenként fel kell szabadítani a Robotok objektumokat.

Kód:
for(int i = 0; i < n; i++)
{
      delete robot[i];
}
delete [] robot;

Ezt a hozzászólást borsi módosította (2011.10.09 14:03 GMT+1 óra, ---)

   
KILLER_RICSI - Tag | 8 hsz       Online status #166477   2011.10.09 13:37 GMT+1 óra  
Sziasztok!


Lenne a következő foglalás:


Robotok *robot1 = new Robotok;
Robotok *robot2 = new Robotok;
...
...
...
Robotok *robotn = new Robotok;


Így létre tudom hozni a sorszámozott robot pédányokat.
A kérdésem az lenne, hogy a létrehozást tudom-e tömbként megtenni?
Az lenne a cél, hogy ciklussal hozzam létre a robotokat - dinamukusan megadott mennyiségben.
Valahogy így gondoltam:

Robotok *robot[n] = new Robotok;

Persze ez nem működik.

Van valakinek ötlete?

Köszi!

Üdv: Ricsi

   
Asylum - Törzstag | 5462 hsz       Online status #166406   2011.10.07 22:37 GMT+1 óra  
Idézet
borsi :
találj ki olyan problémát, amihez optimális adatszerkezet a list<map<string, vector<int>>>...



Ismered a mondást: aki nem érti az tanitja...
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
borsi - Tag | 180 hsz       Online status #166395   2011.10.07 21:26 GMT+1 óra  
Ja hát 'az egyetem' javára legyen írva, hogy 2. félév elején végig vettük, melyik stl konténer milyen adatszerkezetet használ (nagyjából), ezeknek mik az erősségeik, gyengéik. A számonkérés mondjuk vicces volt, pl találj ki olyan problémát, amihez optimális adatszerkezet a list<map<string, vector<int>>>...

   
Joga - Törzstag | 1791 hsz       Online status #166392   2011.10.07 20:52 GMT+1 óra  
proof88: Igen, úgy vannak implementálva

szerk.: Illetve a láncolt lista sszem kétszeresen láncolt, fejelemes
(ಠ ›ಠ) Stewie!

   
proof88 - Törzstag | 530 hsz       Online status #166391   2011.10.07 20:51 GMT+1 óra  
én nem tudom, hogy hogy vannak a háttérben implementálva a vector és list osztályok, de ha a vector dinamikus tömbként, a list meg láncolt listaként, akkor az mindent elmond a különbségekről.
   
dvorgaz - Törzstag | 576 hsz       Online status #166385   2011.10.07 19:08 GMT+1 óra  
Pl. ha a közepébe akarsz új elemet berakni.
   
Pretender - Törzstag | 2498 hsz       Online status #166384   2011.10.07 18:45 GMT+1 óra  
nekem mindenre elég a vector (meg néha a map, pl. content managernél). Miben jobb a list?

   
Joga - Törzstag | 1791 hsz       Online status #166383   2011.10.07 18:44 GMT+1 óra  
én meg mindenre a legmegfelelőbb adatszerkezetet
(ಠ ›ಠ) Stewie!

   
Pretender - Törzstag | 2498 hsz       Online status #166381   2011.10.07 18:13 GMT+1 óra  
én meg vectort

   
Seeting - Törzstag | 2306 hsz       Online status #166369   2011.10.07 13:53 GMT+1 óra  
Dejó hogy én mindenre mapot használok
   
Asylum - Törzstag | 5462 hsz       Online status #166354   2011.10.07 08:06 GMT+1 óra  
De van jelentosege mert esetenkent orakig pocsolsz mire rajossz hogy mitol van. Ezert is erdemes sajatot irni / kerulni az ilyen statikus valtozokat + {}-be tenni a programot.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
zeller - Törzstag | 478 hsz       Online status #166353   2011.10.07 06:46 GMT+1 óra  
Aha. Szoval igazabol ennek semmi jelentosege sincsen, egy nagyobb program futasa kozben nem okoz memory leaket csak ugy a list meg az xtree hasznalata

   
Asylum - Törzstag | 5462 hsz       Online status #166334   2011.10.06 19:38 GMT+1 óra  
Azert mert az elsö esetben a dump után fut le az li destruktora.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
zeller - Törzstag | 478 hsz       Online status #166323   2011.10.06 17:49 GMT+1 óra  
Ez nekem magas. Mi az, hogy valojaban nem? Es akkor miert dumpol. Es az anonimusz blokkban miert nem?

   
Asylum - Törzstag | 5462 hsz       Online status #166321   2011.10.06 17:01 GMT+1 óra  
Kód:
// igy igen (valojaban nem, de ki fogja dumpolni)
int main()
{
    std::list<int> li;

   // ...
}


// igy nem
int main()
{
    {
        std::list<int> li;
    }

    // ...
}
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
zeller - Törzstag | 478 hsz       Online status #166313   2011.10.06 15:28 GMT+1 óra  
Ezt most nem ertem. Mikor hagy leaket? Mindig?

   
Asylum - Törzstag | 5462 hsz       Online status #166311   2011.10.06 15:03 GMT+1 óra  
A vector oke de pl. a list es az xtree (set, map, stb.) memory leaket hagy maga utan, erre erdemes szamitani.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
proof88 - Törzstag | 530 hsz       Online status #166302   2011.10.06 13:23 GMT+1 óra  
Pretender - Törzstag | 2498 hsz       Online status #166301   2011.10.06 13:12 GMT+1 óra  
[OFF]
Azért fikázom, mert egyelőre röhejes dolgokat tanulunk, de egy szóval sem állítottam, hogy ez mindörökre így lesz. Sőt, vizsgaidőszakban sírni fog a szám, hogy jajj de nehéz!
[/OFF]


Akkor ezentúl ígérem, próbálok tagfüggvényt írni Én mindenesetre minden tagfüggvényt (és metódust) ha van visszatérési értéke, ha csak void, "UpperCamelCase"-ben írok (nem is tudtam, hogy így hívják)

   
proof88 - Törzstag | 530 hsz       Online status #166300   2011.10.06 13:04 GMT+1 óra  
MethodName()

na most ha beléd akarnék kötni, márpedig nem tudom észrevetted-e hogy folyton beléd kötök a fórumon, mert fikázod az IK-t, és az egészből sörözés lesz, mert amúgy kíváncsi lennék melyik suhanc vagy a sok közül

Szóval, nálam az a szabály, hogy csak a void tagfüggvények kezdődnek nagybetűvel, azaz ahogy írtad a MethodName-et, UpperCamelCase. De ha van visszatérési értéke, akkor methodName lesz, azaz lowerCamelCase.

A másik, hogy eredetileg csak a virtuális tagfüggvényeket nevezzük metódusoknak. Szóval nem minden tagfüggvény metódus, de minden metódus tagfüggvény. Persze ma már sokan, többek között én is, minden tagfüggvényre a metódus szót használom. Pedig elég értelmetlen az a kifejezés, hogy "virtuális metódus", mivel a metódus eleve azt jelenti h virtuális tagfüggvény, na de érted amit mondok. Mióta ezt olvastam, azóta kioktatom az embereket és próbálom szabályszerűen használni én is.

PR00F voltam, sziasztok!
   
Pretender - Törzstag | 2498 hsz       Online status #166295   2011.10.06 11:45 GMT+1 óra  
Igen, azt tudom, hogy nem 1-el növeli... nekem is amúgy duplázás rémlik, alapból viszont mintha 4-ről indulna, nem 2-ről, de ez igazából lényegtelen. Nézegettem az std::vector-t a c++ reference-ben, itt (is) írják, hogy mi mit csinál.

   
lezli01 - Tag | 190 hsz       Online status #166294   2011.10.06 11:42 GMT+1 óra  
Azt nem tudom, hogy resize-nál pontosan annyit foglal-e le a vektor, de ha egy üres vectorba push__back()-elsz és már nincs hely, akkor nem egyel fogja növelni a méretet, hanem ha jól rémlik duplázza, de a size() ettől függetlenül a rendes értéket adja vissza! A reserve ad rá módot, hogy a vektor valóban akkora legyen mint a size()-ban visszaadott érték!
   
Pretender - Törzstag | 2498 hsz       Online status #166284   2011.10.06 10:21 GMT+1 óra  
Ezt a névkonvenciót szoktam meg, ennyi. (mellesleg ez egy viszonylag hivatalos dolog, nem én találtam ki, de elég kényelmes, és egységes... meg pl. a visual assist x-ben is van egy ilyen lehetőség, hogy "Insert _ after m and shift" )
Kód:
m_Member
p_Parameter
MethodName()
CONSTANT
localVariable

   
proof88 - Törzstag | 530 hsz       Online status #166283   2011.10.06 09:56 GMT+1 óra  
miért kell ilyen buzi alsóvonás karaktert használni, ha egyébként is nagybetűvel folytatod? :s�r
   
Pretender - Törzstag | 2498 hsz       Online status #166280   2011.10.06 09:21 GMT+1 óra  
@lezli01: az eredmény ugyan az, mert:
@zeller: true

ha a resize-nak paraméterként nagyobb számot adunk meg, mint a jelenlegi méret, akkor meghív annyi insertet a default constructorral, amennyit mi megadtunk neki. Ezért mivel arra "rá" new-olok, így memóriaszemét lesz belőle, amit nem szabadítottam fel. Van a resize-nak 2. paramétere, ahol meg lehet adni, hogy mit inserteljen, oda próbáltam 0-t (nullt) írni, de az sem segített. Így végül is marad a push_back a for ciklusban

   
zeller - Törzstag | 478 hsz       Online status #166279   2011.10.06 09:17 GMT+1 óra  
Aha, ja. A resize meghivja a default ctort, ha nagyobbra csinalod, es az igy letrehozott objektum fog elmaszni a memoryleakbe, ha az elemet new-val felulirod. True?

   
lezli01 - Tag | 190 hsz       Online status #166278   2011.10.06 09:14 GMT+1 óra  
Próbáld ezt iniciáláskor:

Kód:
m_Meshes.resize(m_NumMeshes);
m_Meshes.reserve( m_Meshes.size() );
m_Meshes[i] = new Mesh(m_Device, name);
   
Pretender - Törzstag | 2498 hsz       Online status #166276   2011.10.06 08:49 GMT+1 óra  
Fura...
van egy vectorom Mesh-ből (std::vector<Mesh*> ), ez az m_Meshes. Néztem, hogy memory leak van, gondoltam kiderítem, hogy mi a fene... Most már semmit nem csinálok, de 56 byte még így is marad..
Betöltéskor ennyi:
Kód:
m_Meshes.resize(m_NumMeshes);
m_Meshes[i] = new Mesh(m_Device, name);

A végén pedig
Kód:
for (int i = 0; i != m_Meshes.size(); i++)
{
    delete m_Meshes[i];
    m_Meshes[i] = 0;
}
m_Meshes.clear();
std::vector<Mesh*>().swap(m_Meshes);

A Mesh osztály konstruktora és destruktora ennyi:
Kód:
Mesh::Mesh(IDirect3DDevice9 *p_Device, const std::string &p_Name)
{
    m_Device = p_Device;
    m_Name = p_Name;

    m_NumVertices = 0;
    m_NumTriangles = 0;

    m_VertexBuffer = 0;
    m_IndexBuffer = 0;
    m_SizeInBytes = 0;
}

Mesh::~Mesh()
{
    //release index buffer
    if (m_IndexBuffer)
        m_IndexBuffer->Release();
    m_IndexBuffer = 0;

    //release vertex buffer
    if (m_VertexBuffer)
        m_VertexBuffer->Release();
    m_VertexBuffer = 0;
}

De a destruktorban a Release meg sem hívódik, mert null-ok (ugyanis csak a konstruktort hívom meg jelenleg...)

Hol a hiba?

szerk.:
Ja, és ezt kapom a legvégén (a return 0 előtt van)
Kód:
Detected memory leaks!
Dumping objects ->
{165} normal block at 0x003F81C0, 56 bytes long.
Data: <            mesh> 20 DA 16 00 00 00 00 00 CD CD CD CD 6D 65 73 68
Object dump complete.


szerk.2.: (megoldás)
áhá! a resize, meg az i-edik elem new-olása együtt nem jó ötlet. Tééényleg

   
JagdTiger - Tag | 6 hsz       Online status #166255   2011.10.05 15:07 GMT+1 óra  
Végülis vektorra le van implementálva, ennyi erővel mátrixra is simán lehet

   
Joga - Törzstag | 1791 hsz       Online status #166253   2011.10.05 14:33 GMT+1 óra  
Ilyesmire jól jöhet am egy 2D-s tömb osztály. biztonságosabb, szebb, meg minden
(ಠ ›ಠ) Stewie!

   
Asylum - Törzstag | 5462 hsz       Online status #166223   2011.10.05 08:13 GMT+1 óra  
Nagyon nem ugyanaz a ketto.

Kód:
int[i][j] egy memoriaterulet
int** szet van  (lehet) szorva
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
HomeGnome - Szerkesztő | 2919 hsz       Online status #166222   2011.10.05 07:57 GMT+1 óra  
Nem igazán értem ezt a bűvészkedést, de n dimenziós tömbnél honnan tudná a fordító, hogy mekkora egy "sorhossz"? Na mind1, nekem ez magas.

Klikk, a JF.hu bulvárlap.
Klikk #6 WIP: 30% (Kuz, sade, ramoryan...)
   
zeller - Törzstag | 478 hsz       Online status #166219   2011.10.05 07:49 GMT+1 óra  
HG: gyk, igen.
Ha *(i+3) ==i[3], akkor elvarom, hogy a 2D analogia fennalljon. Ill az nD is. Na jo, ez nem teljesen vag egybe a felvetett problemaval...

Na altatas kozben rajottem. A memoriafoglalas linearis...

Ezt a hozzászólást zeller módosította (2011.10.05 08:18 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #166218   2011.10.05 07:46 GMT+1 óra  
@HG: szerintem arra gondolt, hogy egy 2d-s tömböt lehet így is írni:
Kód:
int** tomb = new int[x][y];

és akkor máris "mutatóra mutató mutató"

   
Frissebbek | Korábbi postok
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] > 30 < [35] [40] [45] [50] [55] [60] [65] [70] [75] [80] [85] [90] [95] [100] [105] [110] [115] [120] [125] [130] [135] [140] [141]