Avatar
alex
Člen
Avatar
alex:

Ahoj

zacinam sa ucit Ccko a prisli na radu polia . Snazim sa dynamicky vytvorit a menit velkost pola. Napriklad ked vytvorim pole

int **pole;

Ako mozem dynamicky menit jeho velkost? Realny priklad = mam databazu s informaciami o veku a poctu detoch uzivatela

75 4
55 2
20 0

a chcem nahazdat tieto informacie do 2d pola.

skusal som dynamicky zvacsit pole tj

index = 1;
while ( nacitanie )
{
 if (index = 1 ){
 arr=(int *) malloc ( index * sizeof ( int ));
index++;
}else{

 arr=realloc ( arr , index * sizeof ( int ));
index++
}

}

ale nenapadol ma sposob akym alkovoat "druhu dimenziu" pola , ako ju dynamicky vytvorit a pre kazde zvacsenie pola - prvej dimenzie

Poradi mi niekto?

Dakujem za odpovede.

 
Odpovědět 28.11.2015 20:14
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na alex
Tomáš Brůna:

Ahoj, v C sice nedělám, ale myslím že velikost klasického 2d pole za běhu programu měnit nejde. Ale jak říkám ruku do ohně bych za to nedal :).

Nahoru Odpovědět 28.11.2015 20:51
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Tomáš Brůna
Tomáš Brůna:

to mě nikdo nemůže zastavit abych nepsal kraviny? :D

Nahoru Odpovědět 28.11.2015 20:57
Lepší být šprt než blbec :)
Avatar
Posix
Člen
Avatar
Odpovídá na alex
Posix:

Nejprve musíš alokovat paměť pro pole ukazatelů a až pak pole intů. Takže zhruba tak nějak:

index = 0;
while (nacitanie)
{
    if (index == 0)
    {
        arr = (int**)malloc(index * sizeof(int*));
    }
    else
    {
        arr = (int**)realloc(arr, index * sizeof(int*));
    }
    arr[index] = (int*)malloc(2 * sizeof(int)); // 2 pro věk a počet dětí
    index++;
}

Jen bych chtěl připomenout, že není dobré pro každý nový prvek realokovat. Raději naalokuj víc paměti a pamatuj si tuto hodnotu. Až nebudeš mít místo, tak zase naalokuješ víc místa, například 2x aktuální velikosti.

Nahoru Odpovědět 28.11.2015 23:51
Proč to dělat jednoduše, když to jde složitě.
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Tomáš Brůna
Taskkill:

Ale vzdyt mas pravdu :) ono to skutecne nejde . Posix zapomnel jsi mu rict to nejdulezitejsi, aby po tom, co takhle alocuje prostor, ten prostor zase uklidil. Takze to Alex: az skoncis s pouzivanim toho pole (nebo klidne az na konci programu), nezapomen zavolat funkci free() ... ta bere jedinej parametr - jmeno toho tveho dynamicky tvoreneho pole, tady je to "arr" .. takze free(arr) .. pokud to neudelas, bude ti unikat pamet - a to nechces :)

 
Nahoru Odpovědět 29.11.2015 0:08
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Taskkill
tomisoka:

Když už o tom zmiňuješ tak by jsi taky mohl zmínit, že musí dealokovat i arr[0], arr[1]...

 
Nahoru Odpovědět 29.11.2015 7:23
Avatar
Posix
Člen
Avatar
Odpovídá na Taskkill
Posix:

Na to jsem jaksi zapomněl. Já dělám už jen v C#, kde se to neřeší nebo něco jednoduššího v C++, kde už se o paměť taky nemusím skoro starat :)

Nahoru Odpovědět  +1 29.11.2015 8:18
Proč to dělat jednoduše, když to jde složitě.
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na tomisoka
Taskkill:

:) priznavam ... jen jsem to proletel a do kodu jsem se mu podival jen abych zahlidl malloc a promennou arr ...

 
Nahoru Odpovědět 29.11.2015 15:14
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 8 zpráv z 8.