Dynamická alokace paměti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamická alokace paměti – C / C++ – Fórum – Programujte.comDynamická alokace paměti – C / C++ – Fórum – Programujte.com

 

birkof0
Newbie
28. 2. 2007   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
You will be assimilated. Resistance is futile.
zacatecnik0
Super člen
28. 2. 2007   #2
-
0
-

calloc

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Jura
~ Anonymní uživatel
637 příspěvků
28. 2. 2007   #3
-
0
-

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

Nahlásit jako SPAM
IP: ...–
birkof0
Newbie
28. 2. 2007   #4
-
0
-

Ano st::vector to je on, mého srdce šampion.

Nahlásit jako SPAM
IP: ...–
You will be assimilated. Resistance is futile.
Peter D.0
Expert
1. 3. 2007   #5
-
0
-

a čo tak si spraviť vlastnu triedu v podobe prepojeneho zoznamu ? :)

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Matěj Pácha0
Super člen
1. 3. 2007   #6
-
0
-

CLI:



int velikost1 = 5;
int velikost2 = 10;
array<int,1>^ pole = gcnew array<int,1>(velikost1);
pole->Resize(pole,velikost2);

Nahlásit jako SPAM
IP: ...–
Ajem tíčr, andrgraund tíčr!
birkof0
Newbie
1. 3. 2007   #7
-
0
-

Vector má velmi mnoho pěkných vlastností, pro moje použití je naprosto perfektní.

Nahlásit jako SPAM
IP: ...–
You will be assimilated. Resistance is futile.
Mirek Braho0
Stálý člen
18. 4. 2007   #8
-
0
-

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

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
18. 4. 2007   #9
-
0
-

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;
}
}

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
20. 4. 2007   #10
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
20. 4. 2007   #11
-
0
-

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

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 4. 2007   #12
-
0
-

bez pola by nevznikol vektor.. vektor je nadstavbou pola.. dalsia vec je ze vektor je zalezistost STL kniznice a C++, kdezto pole je proste pole.. zaklad.. bez pola by neboli ani retazce, ani string..

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Carda 240
Duch
28. 5. 2009   #13
-
0
-

Neví nekdo jak dinamicky alokovat dvourozměrné pole??

char jmeno[ ][ ];

potřebujeu nacíst bud jenom 1 závorku.
nebo kazdou zvlášť

Nahlásit jako SPAM
IP: 93.99.44.–
Programátor v jazyku Java, PHP. (SQL)
KIIV
~ Moderátor
+43
God of flame
28. 5. 2009   #14
-
0
-

To Carda 24 : nejdriv alokujes prvni rozmer jako pole ukazatelu
a pak pro kazdou polozku udelas dalsi alokaci pro druhy rozmer..

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dannyk0
Věrný člen
28. 5. 2009   #15
-
0
-

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.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 87 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý