IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

Diskuze: Zvětšování pole během spuštěného programu

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

Aktivity
Avatar
Kubas129
Člen
Avatar
Kubas129:2.12.2018 19:00

Ahoj, mám dotaz dá se dynamické pole postupně zvětšovat během zapnutého programu?
Díky

 
Odpovědět
2.12.2018 19:00
Avatar
Jirka
Člen
Avatar
Odpovídá na Kubas129
Jirka:2.12.2018 19:19

Ahoj,

můžeš použít vektor<> ze standartní knihovny. Tedy pokud programuješ v C++.

Nahoru Odpovědět
2.12.2018 19:19
Kdo nic nedělá, nic nezkazí.
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Kubas129
DarkCoder:2.12.2018 19:30

Samozřejmě že ano. Využíváš funkci realloc() ze standardní knihovny stdlib.h.

Prototyp funkce je:
void *realloc(void *ptr, size_t size);

kde:

ptr je ukazatel na blok paměti dříve alokovaný pomocí malloc() nebo calloc(). Pokud je NULL, je alokován nový blok a funkce na něj vrací ukazatel.

size je nová velikost pole. Pokud je 0 a ptr ukazuje na existující blok paměti, je tento blok paměti uvolněn a funkce vrací NULL.

Funkce vrací ukazatel na nově alokovaný blok paměti. Při selhání vrací NULL.

Př:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
        char *str;

        // Alokace pameti
        str = (char *)malloc(10);
        strcpy(str, "ITnetwork");
        puts(str);

        /* Realokovani pameti */
        str = (char *)realloc(str, 15);
        strcat(str, ".cz");
        puts(str);

        free(str);

        return(0);
}
Nahoru Odpovědět
2.12.2018 19:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jirka
Člen
Avatar
Odpovídá na Kubas129
Jirka:2.12.2018 19:40

Něco jako:

#include <vector>

using namespace std;

int main(void) {
vector<string> mujVektor;

atd.
}
Editováno 2.12.2018 19:41
Nahoru Odpovědět
2.12.2018 19:40
Kdo nic nedělá, nic nezkazí.
Avatar
Kubas129
Člen
Avatar
Kubas129:2.12.2018 19:44

Vektory máme zakázaný :( ale díky za tip s tím realloc jdu to s ním zkusit :-)

 
Nahoru Odpovědět
2.12.2018 19:44
Avatar
Caster
Člen
Avatar
Caster:4.12.2018 2:04

Proč zvětšovat pole, když můžeš rovnou alokovat několik GB paměti pomocí VirtualAlloc viz příklad pro načtení celého TXT souboru do paměti pro jeho další zpracování:

//* Alokujeme pamět pro celý soubor *//
        static const SIZE_T giga = 1024 * 1024 * 1024;
        static const SIZE_T size = 5 * giga;
        ptr = static_cast<BYTE*>(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
        bsrc = ptr;
 
Nahoru Odpovědět
4.12.2018 2:04
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 6 zpráv z 6.