Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
MrPabloz
Člen
Avatar
MrPabloz:10.1.2014 11:22

Zdravím vím, že k tomu je dobrý vector, ale tím to dělat nechcu, spíš bych potřeboval poradit jak na dynamické pole objektů, tedy náhradu za vector, tedy něco ve smyslu :

Objekt **objekt;//nevím jak tohle inicializovat např na velikost 2, a poté zvětšovat pomocí realloc
//nebo nějak v tomhle smyslu
*objekt = new Objekt("a");//objekt 1
*objekt = new Objekt("b");//objekt 2
Odpovědět
10.1.2014 11:22
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
coells
Tvůrce
Avatar
Odpovídá na MrPabloz
coells:10.1.2014 11:54

Priblizne takhle:

int count = 0;
int size = 2;
Object **dynarr = new Object*[size];

void add(Object *item)
{
  if (count == size)
  {
    int newsize = size * 2 + 1;
    Object **temp = new Object*[newsize];

    for (int i = 0; i < size; i++)
      temp[i] = dynarr[i];
    for (int i = size; i < newsize; i++)
      temp[i] = NULL;

    delete dynarr;
    dynarr = temp;
  }

  dynarr[count++] = item;
}
 
Nahoru Odpovědět
10.1.2014 11:54
Avatar
MrPabloz
Člen
Avatar
Odpovídá na coells
MrPabloz:10.1.2014 11:58

Díky tohle je přesně to co jsem ptořeboval, a ještě když jsme u toho nešlo by tohle :

if (count == size)
  {
    int newsize = size * 2 + 1;
    Object **temp = new Object*[newsize];

    for (int i = 0; i < size; i++)
      temp[i] = dynarr[i];
    for (int i = size; i < newsize; i++)
      temp[i] = NULL;

    delete dynarr;
    dynarr = temp;
  }

vyměnit za samotný realloc? ten přeci pole zvětší + tam budou ty samé hodnoty co v tom bývalém + místo navíc a pamět toho bývalého jakby "uvolní" ?

Nahoru Odpovědět
10.1.2014 11:58
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
coells
Tvůrce
Avatar
Odpovídá na MrPabloz
coells:10.1.2014 12:02

Urcite by slo pouzit realloc(), ale v tom pripade bych byl konzistentni a pouzival na to pole pouze malloc, free a realloc.

 
Nahoru Odpovědět
10.1.2014 12:02
Avatar
MrPabloz
Člen
Avatar
Odpovídá na coells
MrPabloz:10.1.2014 12:03

Jo takhle, už to chápu, sem si to spletl c C :( Děkuju moc za rady a vysvětlení teda :)

Nahoru Odpovědět
10.1.2014 12:03
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:10.1.2014 12:39

Můžu se ještě zeptat jak se dostat k atributu jednoho objektu v tom poli objektů ?

//zkoušel jsem
dynarr[i]->atributX;

//EDIT : prosím o smazani tohoto příspěvku, visualko už mi to konečně povolilo, bylo to co sem vepsal do ukázky :D

Editováno 10.1.2014 12:41
Nahoru Odpovědět
10.1.2014 12:39
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:10.1.2014 20:11

Tak nakonec mám problem nějak s tím ještě, ono mi to sice uloží do toho, ale když pak chcu vypsat jednotlivé prvky toho pole dvojtého, tak mi to vypíše bláboly, ne ten záznam jeden :/ nebude někde chyba nebo tak?

for(int i=0 ; i<count ; i++)
        {
            cout << dynarr[i]->GID <<","<<dynarr[i]->GName<<","<<dynarr[i]->GDescription<<","<<dynarr[i]->GPrice<<","<<dynarr[i]->GNoItems << endl;
        }
Nahoru Odpovědět
10.1.2014 20:11
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
MrPabloz
Člen
Avatar
MrPabloz:11.1.2014 19:58

Dovoluji si jen upozornit, že pokud by to někdo někdy vyhledal tady, tak ve fci add() napsané výše je jedna menší chyba. Proto tu dávám opravný kod :)

int count = 0;
int size = 2;
Object **dynarr = new Object*[size];

void add(Object *item)
{
  if (count == size)
  {
    int newsize = size * 2 + 1;
    Object **temp = new Object*[newsize];

    for (int i = 0; i < size; i++)
      temp[i] = dynarr[i];
    for (int i = size; i < newsize; i++)
      temp[i] = NULL;
    size=newsize;//tohle tu nebylo, neboli se neaktualizovalo velikost pole :)
    delete dynarr;
    dynarr = temp;
  }

  dynarr[count++] = item;
}
Nahoru Odpovědět
11.1.2014 19:58
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na MrPabloz
Lukáš Hruda:12.1.2014 15:02

Co to přesně vypisuje a co by to mělo vypisovat? Možná by bylo dobré sem dát celý kód včetně té třídy. Jenom bych podotknul, že zvětšovat pole přidání každého prvku je poněkud neefektivní, lepší je velikost třeba zdvojnásobit nebo přidat určitý počet prvků a když se zaplní tak zopakovat.

 
Nahoru Odpovědět
12.1.2014 15:02
Avatar
Odpovídá na MrPabloz
Zdeněk Pavlátka:12.1.2014 15:14

realloc() se v takovém případě použít nedá, nezavolá totiž destruktory objektů. S objekty umí pracovat jen new a delete.

Nahoru Odpovědět
12.1.2014 15:14
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Hruda:12.1.2014 16:09

On by ale reallocoval pouze pole pointerů, na těch žádný destruktor volat nemusí.

 
Nahoru Odpovědět
12.1.2014 16:09
Avatar
Odpovídá na MrPabloz
Adam "Nero" Chudomel:12.1.2014 17:59

destruktory nedestruktory mě to funguje :D

Nahoru Odpovědět
12.1.2014 17:59
Nihil est, aut totum licet consistere
Avatar
MrPabloz
Člen
Avatar
MrPabloz:12.1.2014 19:10

Ale ne, já vím že ten realloc nejde, jak říkám spletl jsem si c a c++ dynamická pole:D jsem si akorát neuvědomil že realloc se nepoužívá s new a delete ale malloc a free ;)

Editováno 12.1.2014 19:10
Nahoru Odpovědět
12.1.2014 19:10
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
vitamin
Člen
Avatar
Odpovídá na MrPabloz
vitamin:12.1.2014 20:05

malloc, realloc a free mozes pouzivat aj v c++. Len si treba uvedomit ze rozne allocatory su vecsinou nekompatibilne, takze ked alokujes cez malloc/realloc, uvolnovat musis cez free, ked allokujes cez new, tak dealokujes cez delete. Dalsi rozdiel je ze funkcie malloc/realloc len alokuju pamet, neinicialiuju ju(nevolaju constructory, ninicializuju vptr...) a free len uvolnuje pamet(nevola destructory). Destructory mozes manualne volat ako ine metody. Na zavolanie konstruktoru mozes pouzit placement new.

#include <iostream>


struct MenoTriedy{
        static int g_i;
        int i;
        MenoTriedy():i(++g_i){std::cout << "create: " << i << '\n';}
        virtual ~MenoTriedy(){std::cout << "destroy: " << i << '\n';}
};

int MenoTriedy::g_i = 0;

int main(){
        size_t size = 2;
        MenoTriedy* ptr = (MenoTriedy*)malloc(sizeof(MenoTriedy) * size);
        new(ptr) MenoTriedy();
        new(ptr+1) MenoTriedy();

        size += 2;
        ptr = (MenoTriedy*)realloc(ptr, sizeof(MenoTriedy) * size);
        new(ptr+2) MenoTriedy();
        new(ptr+3) MenoTriedy();

        for(size_t i = 0; i < size; ++i)
                ptr[i].~MenoTriedy();

        return 0;
}

Na implementaciu vectora sa da dobre pouzit malloc/realloc.

 
Nahoru Odpovědět
12.1.2014 20:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.