[LUGOS] c++

Andraz Tori Andraz.tori1 at guest.arnes.si
Fri May 5 09:37:10 CEST 2006


On pet, 2006-05-05 at 09:06 +0200, Matevz Jekovec wrote:
> V C++ ne vemo, kolikšna je dolžina arraya, če ga kar od nekod dobimo, right?
> npr. Če imamo podano nek kazalec int*, ki kaže na array integerjev,
> vemo, da bo tam polje integerjev, ampak ne vemo, koliko dolgo. To je
> tudi razlog, zakaj se ponavadi, če se pošilja argument funkciji polje,
> vedno zraven pošilja tudi dolžino polja.
> Ampak, delete[] funkcija pa sprosti celotno vsebino polja.
> npr.
> int stevila[10]; //rezerviramo prostor za 10 integerjev
> delete[] stevila; //sprostimo prostor teh 10 integerjev
> 
> Kako je pa to potem znotraj rešeno? delete[] kakor koli že, mora
> ugotoviti, do kam lahko sprošča pomnilnik. Potem bi torej v standardni
> knjižnici lahko bila tudi kakšna funkcija, ki bi ti vrnila velikost
> polja - delete[] mora že nekako izvedeti. Bi zelo poenostavilo stvari na
> čase ...


Ni tako preprosto ... prvi in edini pametni nasvet je, da raje
uporabljaj STL in njegove podatkovne tipe, ki ti prihranijo _ogromno_
programiranja...

Naprej pa takole: new in malloc na heapu rezervirata bloke pomnilnika,
seveda za vsak blok natančno vesta kako velik je, indexirata pa ga po
kazalcu na prvi byte bloka. prav tako ne vesta kako velik je zares
array, temveč le koliko pomnilnika je bilo zanj alociranega ...
pomnilnik se namreč alocira granularno.

Medtem pa kazalci na arraye lahko kažejo an poljubne točke v arrayu, kar
pomeni, da je še tu problem. Poleg tega pa ni arrayom v C++ ni treba da
so allocirani na heapu saj so lahko tudi v data segmentu... 

no skratka miljon razlogov, zakaj C ne more niti  najmanj zanesljivo
vedeti kako dolg array je tisti na katerega kaže pointer.


In ravno zato imamo objektno programiranje in STL ... takšne stvari
potem postanejo mala malica

#include <vector>

use namespace std;

vector<int> seznam;

void main()
{
seznam.resize(1000);
seznam[30] = 2;

seznam.push_back(4);
seznam.push_back(6);

printf("Dolzina seznama: %i\n", seznam.size());
}

in izpisal bo 1002...

... tako nekako... potem pridejo še podatkovni tipi list pa map, ki so
prav tako zelo uporabni... skratka če uporabljaš C++ brez STLja je tako
kot če v avtu z avtomatskim menjalnikom vseeno menjaš prestave ročno.
saj deluje, samo to ni point.

bye
andraz






More information about the lugos-list mailing list