NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: menenie velkosti 2d pola

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
alex
Člen
Avatar
alex:28.11.2015 20:14

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
Tvůrce
Avatar
Odpovídá na alex
Tomáš Brůna:28.11.2015 20:51

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
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Tomáš Brůna:28.11.2015 20:57

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

Nahoru Odpovědět
28.11.2015 20:57
Vi veri universum vivus vici
Avatar
Odpovídá na alex
Neaktivní uživatel:28.11.2015 23:51

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Tomáš Brůna
Neaktivní uživatel:29.11.2015 0:08

Ale vzdyt mas pravdu :) ono to skutecne nejde . Neaktivní uživatel 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
Neaktivní uživatelský účet
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
tomisoka:29.11.2015 7:23

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
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:29.11.2015 8:18

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
29.11.2015 8:18
Neaktivní uživatelský účet
Avatar
Odpovídá na tomisoka
Neaktivní uživatel:29.11.2015 15:14

:) 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
Neaktivní uživatelský účet
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.