Nevíte někdo jak, pokud to tedy jde, dynamicky změnit velikost pole? Při vytváření pole nevím jak bude nakonec velké, proto bych potřeboval pole s indexem 1 a postupně ho zvětšovat či zmenšovat.
Dik
Fórum › C / C++
Dynamická alokace paměti
![](img/forum_vlakno_help_vyreseno.png)
calloc
birkof píše:#
# Nevíte někdo jak, pokud to tedy jde, dynamicky změnit velikost pole? Při vytváření pole nevím jak bude nakonec velké, proto bych potřeboval pole s indexem 1 a postupně ho zvětšovat či zmenšovat.#
#Dik
Reseni je samozrejme nekolik, zalezi na jazyku(C/C++). V C++ doporucuju zapomenout na pole(samozrejme mysleno jako nadsazka) a sahnout po vectoru. Staci jej vytvorit a pak uz jen pridavat prvky, o ic se nemusis starat, vector to zvladne sam.
#include <vector>
using namespace std;
vector<int> pole;
for(i=0; i < 10000; ++i)
pole.push_back(i);
Nebo tradicne v C++ s pouzitim new []/delete [].
int * pole = new int[1];
...
// zvetseni
int *nove_pole = new int[velikostnoveho pole]; // alokovat nove ople o potrebne velikosti
memcpy(nove_pole, pole, sizeof(int)*pocet_prvku_ve_starem_poli); // zkopirovat
delete [] pole; // smazat stare
pole = nove_pole; // pole bude ukazovat na nove aloovanz blok pameti
Nebo neco pro zastance klasickeho cecka:
#include <stlib.h>
int pocet = 1;
int *pole = malloc(sizeof(int)*pocet);
// realokace
pole = realloc(pole, novy_pocet*sizeof(int));
pocet = novy_pocet; // je potreba si pamatovat novou velikost, kvuli dalsimu pridavani
CLI:
int velikost1 = 5;
int velikost2 = 10;
array<int,1>^ pole = gcnew array<int,1>(velikost1);
pole->Resize(pole,velikost2);
Přesně tohle ted řeším, ale trochu něčím jiným, polem ukazatelů na pole. tedy ........ char **t. Jen nevím jak přesně to používat. Poradí mi někdo? Vypsáním názorného kódu ? Když bych třeba chtěl do prvních 2 prvků vepsat větu, a pak ty 2 věty (každá v jednom prvku pole) vypsat pomocí cout >>
Dík
nechapem trosku dotaz ale:
pre C. Funkcia insert alokuje miesto na halde pre dany text, tym padom jeho rozsah platnosti je vecsi ako len v danej funkcii.
void insert(char** array, int index, const char* insert_text)
{
char* text;
int size;
size = strlen(insert_text);
text = (char*)malloc( (size + 1)*sizeof(char) );
memcpy(text, insert_text, size);
array[index] = text;
}
void clean(char** array, int size)
{
int i;
for(i = 0; i < size; i++) {
free(array[i]);
}
}
#define POLE_SIZE 2
int main()
{
char* pole[POLE_SIZE];
int i;
insert(pole, 0, "slovo 1");
insert(pole, 1, "slovo 2");
for(i = 0; i < POLE_SIZE; i++) {
printf("text je:%s\n", pole[i]);
}
clean(pole, POLE_SIZE);
return 0;
}
pre C++. Treba davat pozor na rozsah platnosti, nakolko "slovo 1" a "slovo 2" su alokovane na zasobniku
int main()
{
vector<char*> pole;
pole.push_back("slovo 1");
pole.push_back("slovo 2");
for(vector<char*>::iterator i = pole.begin(); i != pole.end(); i++) {
cout << "text je:" << *i << endl;
}
}
Ak sa nechces trapit z rozsahom platnosti, pouzi string a mas pokoj
int main()
{
vector<string> pole;
pole.push_back("slovo 1");
pole.push_back("slovo 2");
for(vector<string>::iterator i = pole.begin(); i != pole.end(); i++) {
cout << "text je:" << *i << endl;
}
}
Tak jsem tu zas. Narazil jsem na problém který přeseně koresponduje s tim dynamickym polem.
Jak udělam, abych ze souboru načítal znak po znaku (getc) a ty ukládal do nějakého pole? Samozřejmě předem nevím jak to pole bude dlouhé, tak by se po každém načtení zvětšilo o ten 1 znak až do EOF. Musí to přece jít bez toho mezi kopírování (jak mi někdo psatl strcopy bla bla). A pokud možno, jestli se to dělá přes ukazatele, šlo by to s new a delete? malloc a realloc mi nic neříká, zatím se učím jen C++ a samotný C moc neznam.
Díkes
Asi to udělam pomocí vektorů, uměj toho opradu hodně. Ale lidi, když si tak čtu reference vektoru, proč teda existuje pole ? Vždyť vektor je to samý, ale víc použitelnější. Dejte mi někdo příklad, kdy je výhodnější použít pole místo vektoru a kdy naopak, a proč. Díky
No s temi poli.Ona je nejlepsi praxe ta, ze se vytvori nejake pole o urcite velikosti a pri zapisu se kontroluje, jestli se presahlo nebo ne.Pokud ano, tak se poli zvestsi jednou tolik a puvodni data se prekopiruji.
Konkretne pri cteni souboru je lepsi pouzit fseek funkci. Pomoci te se posunes na konec souboru
fseek(handle_na_soubor, 0, SEEK_END);
Pak si zjistis pozici v souboru
long size = ftell(handle_na_soubor);
A nakonec si vytvoris pole o velikosti toho souboru
char *pole = new char[size];
A pak uz si s tim muzes delat co chces.
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Dynamická alokace paměti — založil
SFML - Dynamická alokace paměti — založil Kenvelo
Dynamicka alokace pameti pole — založil jmeno
Dynamicka alokace pameti - Heap overflow — založil Milos
Moderátoři diskuze