Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.02.07
Prihlásený: 22.06.15
Príspevky: 90
Témy: 24
Bydlisko: Kosice
Príspevok NapísalOffline : 20.03.2008 10:42

potreboval by som v programe pouzit pole, ktoreho pocet prvkov nebude dopredu znamy, nastava ale problem, a to taky ze nemozem napisat nieco v zmysle array[1..x] of daco, chce to odo mna presnu hodnotu uz v deklaracnej casti...
pravdaze mohol by som tam hodit maximalnu moznu hodnotu ktora by mohla byt v programe pouzita, ale radsej by som chcel nieco efektivnejsie, co sa tyka vyuzitia pamate :)

rozmyslal som na niecim takym, ale netusim ako si to adresuje pamat, neviem to odsledovat, je nieco co by mi s tym mohlo pomoct? (pouzivam Free Pascal IDE) Tak tu je ten moj napad:
Kód:
var ...
    pole:array[1..65536] of ^integer;
begin ...
        for i:=1 to max do begin
             new(pole[i]);
             pole[i]^:=daco;
        end;
        ...
end.


Podla toho co si myslim by to malo zabrat pamat az ked do danej pozicie v poli priradim hodnotu, tzn ked bude hodnota premennej max napr. 100, tak v pamati bude adresovanych len sto hodnot typu integer, a nie 65536... ale to je len taka domnienka, neviem ako to v skutocnosti funguje :roll:


Offline

Užívateľ
Užívateľ
pole s dynamickym poctom prvkov v pascale

Registrovaný: 02.09.05
Prihlásený: 17.11.10
Príspevky: 154
Témy: 1
Príspevok NapísalOffline : 20.03.2008 16:16

Nie, pokial deklarujes pole pole:array[1..65536] of ^integer; , tak sa alokuje 65536 buniek typu ^integer.
Ak chces vytvorit dynamicke pole, deklaruje sa a pouziva nasledovne :
Kód:
type PPole = ^array [0..0] of integer;

var Pole : PPole;
      pocet_prvkov : integer;

begin
   pocet_prvkov := 1000;
   { alokovanie pola }
   GetMem(Pole, pocet_prvkov * SizeOf(integer));

   { priradenie hodnot }
   Pole^[0] := 10;
   Pole^[1] := 15;
   Pole^[999] := 15;

   { uvolnenie pamate pouzivanej dynamickym polom}
   FreeMem(Pole, pocet_prvkov * SizeOf(integer));
end.







_________________
Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.02.07
Prihlásený: 22.06.15
Príspevky: 90
Témy: 24
Bydlisko: Kosice
Príspevok Napísal autor témyOffline : 20.03.2008 21:58

no tak som to skusil, ale hned pri deklarovani toho typu mi vypise ze po "=" ocakava identifikator, takze mu pravdepodobne vadi ten "^" :(
robi to v Free Pascal IDE aj v TP 7.0...


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.02.07
Prihlásený: 22.06.15
Príspevky: 90
Témy: 24
Bydlisko: Kosice
Príspevok Napísal autor témyOffline : 22.03.2008 17:35

tak som trochu pozeral po strankach a na http://mircosoft.ic.cz/index2.htm som nasiel celkom podrobny clanok o dynamickych premennych a podobnych vecach, tu je to najdolzeitejsie, mozno sa to niekomu raz zide (skusal som to a vyzera to ze to funguje :)):

Dynamicka pole
Tyto datove struktury slouzi k ukladani datovych polozek, jejichz pocet sice
nezname pri psani programu, ale pozdeji ho za behu programu jeste pred
zacatkem ukladani dat nejakym zpusobem zjistime.
Oproti spojovemu seznamu se setri pameti (nepotrebujeme ukazatel v kazde
polozce) a dosahuje se rychlejsiho pristupu (prosty index pole misto
postupneho prochazeni spojoveho seznamu).
Dynamicka pole v podstate funguji jako obycejna staticka pole (var pole:
array[...] of ...), jenomze je alokujeme dynamicky (na hromade a ne v Data
segmentu) za chodu programu a pri pristupu k nim musime napsat znak ^ navic.

Jak na to:
1) Definujeme si "sablonu" pole:
type SablonaPole=array[Min..Max] of PozadovanyTypPrvku;
Je potreba, aby typ prvku odpovidal budoucimu dynamickemu poli. Cislo Min
(minimalni index pole) musi odpovidat skutecnemu pozadovanemu minimalnimu
indexu dynamickeho pole, cislo Max muze byt cokoli od Min vys.

2) Definujeme druhy pomocny typ - ukazatel na jiz definovanou sablonu:
type UkazatelNaSablonu=^SablonaPole;

3) Vypneme kontrolu rozsahu: bud direktivou {$R-} nebo nastavenim Options ->
-> Compiler -> Range checking. Bude to potreba, protoze prave to nam umozni
zapisovat do budouciho dynamickeho pole kamkoli, treba i za index Max, pokud
to SKUTECNA velikost alokovane pameti dovoli.

4) Deklarujeme prislusnou promennou - ukazatel:
var DynPole:UkazatelNaSablonu;
To mame zatim 4 "zbytecne zaplacane" byty (jeden ukazatel), ale vic uz jich,
na rozdil od spojovych seznamu, nebude.

5) Alokujeme pamet pro pole. Nejdriv si vypocitame, kolik ji budeme
potrebovat. Vezmeme velikost jednoho prvku (napr. pomoci sizeof(typ prvku))
a vynasobime ji pozadovanym poctem prvku (ktery uz v tomto okamziku znat
musime). Ted pomoci naseho ukazatele alokujeme dynamickou promennou prislusne
velikosti: Getmem(DynPole,velikost). Ukazatel DynPole sice je typovy, ale
procedura Getmem je univerzalni a jde pouzit i v tomto pripade. Kdybychom
pouzili New, alokovalo by se tak velke pole, jak jsme definovali v typu
SablonaPole, coz ale nechceme, ze jo, to by pak nebylo nic skutecne
dynamickeho.

6) A to je vsechno. Nyni mame pole, do ktereho muzeme ukladat prislusne
hodnoty jako do kazdeho jineho pole, jenom nesmime zapomenout na to, ze jdeme
pres ukazatel: DynPole^[index]:=hodnota apod.
Pozor na indexy. Je vypnuta kontrola rozsahu, takze ne abyste neco zapsali
mimo alokovane pole! Rozmery pole si musite celou dobu pamatovat.

7) Zruseni pole: Freemem(DynPole,velikost) (velikost stejna jako pri alokaci).


Offline

Užívateľ
Užívateľ
pole s dynamickym poctom prvkov v pascale

Registrovaný: 02.09.05
Prihlásený: 17.11.10
Príspevky: 154
Témy: 1
Príspevok NapísalOffline : 22.03.2008 21:29

Trochu som to upravil + odladil v pascali (Predosly priklad som pisal z hlavy).......V tejto podobe by to malo byt funkcne :

Kód:
type TPole = array [0..0] of byte;
     PPole = ^TPole;

var Pole : PPole;
    pocet_prvkov : integer;
    i : integer;

begin
   { pomocou direktivy R- vypneme range checking. Inak by sposobovalo problemy }
   {$R-}

   pocet_prvkov := 100;
   { alokovanie pola }

   GetMem(Pole, pocet_prvkov * SizeOf(integer));

   { priradenie hodnot }
   i := 0;
   Pole^[i] := 10;

   i := 10;
   Pole^[i] := 15;

   i := 20;
   Pole^[i] := 100;

   { uvolnenie pamate pouzivanej dynamickym polom}

   FreeMem(Pole, SizeOf(Pole^));
end.


P.S.: Vidim , ze si si nastudoval, to je fajn ! :)







_________________
Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison)
Odpovedať na tému [ Príspevkov: 5 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. VPS s velkym poctom ip /24

v Webhosting a servery

2

383

18.03.2018 0:34

Chris Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. neaka zvukovka s dynamickym zosilovacom

v Zvuk

0

514

11.10.2009 20:41

t-90 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Funkcie s premenlivým počtom parametrov v jazyku C

v Assembler, C, C++, Pascal, Java

2

510

11.05.2013 21:39

faraon Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako spraviť web s dynamickým menu?

v HTML, XHTML, XML, CSS

4

517

04.09.2014 13:56

walther Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Inštalácia Win8 problém s dynamickým diskom

v Operačné systémy Microsoft

6

480

07.11.2012 16:19

Fever Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Načítavanie prvkov

v JavaScript, VBScript, Ajax

8

467

31.05.2010 18:29

DARSON Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyber prvkov - POLIA

v PHP, ASP

5

496

23.04.2010 10:48

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zoradenie prvkov databazy

v PHP, ASP

1

853

05.11.2007 16:04

GoodWill Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Presun prvkov pola

v Assembler, C, C++, Pascal, Java

2

371

18.10.2012 1:51

Gregi555 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zlucenie prvkov pola

v PHP, ASP

3

403

23.03.2012 11:39

exoomer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. posuvanie prvkov v poli

v PHP, ASP

2

596

07.07.2009 12:23

tomast7 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Usporiadanie prvkov v poli

v Assembler, C, C++, Pascal, Java

4

485

13.04.2017 12:21

neutroN Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pascal - posun prvkov pola

v Assembler, C, C++, Pascal, Java

17

1049

22.10.2012 17:40

Gregi555 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problém s umiestnením prvkov

v HTML, XHTML, XML, CSS

6

373

17.04.2014 12:06

Snipo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problém pri načítaní prvkov cez ajax

v JavaScript, VBScript, Ajax

0

507

12.03.2012 13:31

blazej44800 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. MAzanie prvkov z poľa v jave

v Assembler, C, C++, Pascal, Java

5

1022

22.12.2010 11:55

Forty- Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra