Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Koriscenje velikih nizova i matrica u Turbo Pascalu

[es] :: Art of Programming :: Koriscenje velikih nizova i matrica u Turbo Pascalu

[ Pregleda: 5434 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

pirgos_madden
Pirgos Madden
Pirot

Član broj: 16752
Poruke: 322
*.ptt.yu.

Jabber: Programing
Sajt: www.pirot-mafia.co.sr


Profil

icon Koriscenje velikih nizova i matrica u Turbo Pascalu23.03.2005. u 18:55 - pre 232 meseci
Ovako naisao sam na to da mi u nekim slucajevima Turbo Pascal 7.0 javlja gresku
Code:

Error 96: Too many variables.


ili kad koristim recimo nesto drugo (dvodimenzionu matricu recimo)
Code:

Error 22: Structure too large.


Naravno to se desava kada stavim velike brojeve kao dimenzije niza i plus kao elemente stavim longint-ove, kao npr:
Code:

var niz:array [1..16000] of longint;


Medjutim u nekom kodicu sam nasao sledecu deklaraciju:
Code:

type
niz = array [1..16000] of longint;
pniz = ^niz;


i kada se posle deklarise niz ovog tipa:
Code:

var nesto:pniz;


to radi bez problema ali opet postoji neka granica (sad otprilike duplo veca).

Moze li neko ovo da mi objasni malo bolje, dakle sta je zapravo ta kvacica ^, i kako se moze postici da to radi za recimo dvodimenzioni niz (jer na pomenuti nacin radi samo za jednodimenzioni)? Ima li neki kompajler za Pascal koji ima vise granice?
Hvala!
-I srusise se nasi divni snovi !!!
-NATO is bombing Serbia, a Yugoslavian republic, to stop the Serbs from forcing ethnic Albanians from Kosovo. Serb supporters sock it to NATO, U.S. Web sites. Magis says NATO headquarters won't launch an electronic counterstrike. "We want to show we're more civilized," he says. "We believe in freedom of speech." NATO is even discussing the possibility of hosting Serbian information on the Web so the Serbs can share their views.
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu23.03.2005. u 19:31 - pre 232 meseci
Koliko znam TP 7 na stack-u moze da pravi promenljive velicine maximalno 64k i zato ne mozes da pravis vece nizove. Na heap-u moze da alocira dosta memorije, a kada deklarises neki tip kao:
Code:

type
  niz = array [1..16000] of longint;
  pniz = ^niz;

ne mozes da napises nesto kao
Code:

var
  N: PNiz;
begin
  N[0]^ := 1;
  N[1]^ := 2;
end;

jer nisi rezervisao memoriju za promenljivu N. Ona je u ovom slucaju pointer i moras da alociras memoriju u kojoj ce se nalaziti podaci koji su smesteni u N. Ta memorija ce biti alocirana na heap-u.
Code:

var
  N: PNiz;
begin
  New(N);
  N[0]^ := 1;
  N[1]^ := 2;
  Dispose(N);
end;

Bitno je da posle New pozoves i Dispose kako bi oslobodio zauzetu memoriu i sprecio memory leak.

Nisam bas siguran da je ovo 100% tacno jer nisam godinama koristio TP.
 
Odgovor na temu

pirgos_madden
Pirgos Madden
Pirot

Član broj: 16752
Poruke: 322
*.ptt.yu.

Jabber: Programing
Sajt: www.pirot-mafia.co.sr


Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu23.03.2005. u 21:18 - pre 232 meseci
Sta je zapravo heap? Kakve veze ima sa stekom? Jer ona kvacica ^ ustvari ukazuje da ne smesta to cudo u stek nego na heap? A sto se tice tog New i Dispose, u kodu je na pocetku stavljena procedura:

Code:

procedure InitData;
begin
getmem(niz1, sizeof(p));
getmem(niz2, sizeof(p));
end;


koja najverovatnije radi to o cemu pricas, niz1, niz2, p su deklarisane kao:

Code:

type p=array[1..16383] of longint;
     pp=^p;

var niz1,niz2: pp;


Jos pomoci?
-I srusise se nasi divni snovi !!!
-NATO is bombing Serbia, a Yugoslavian republic, to stop the Serbs from forcing ethnic Albanians from Kosovo. Serb supporters sock it to NATO, U.S. Web sites. Magis says NATO headquarters won't launch an electronic counterstrike. "We want to show we're more civilized," he says. "We believe in freedom of speech." NATO is even discussing the possibility of hosting Serbian information on the Web so the Serbs can share their views.
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu24.03.2005. u 09:02 - pre 232 meseci
Heap je mesto gde se alociraju dinamicke promenljive, a to su pinteri. Dinamicke strukture podataka koje se cesto koriste su liste, cesto hash tabele itd...
Dok je stack rezervisan za staticke promenljive.
E sad....tebi se sve promenljive koje deklarises na "standardni" nacin alociraju na stacku, a ukoliko ih deklarises sa ^ dobijas pointer (pokazivac) na taj objekat i to se alocira heapu.

Sto se tice ove getmem, nisam siguran tacno sta radi, ali sigurno ne radi new i dispose.

Pazi imas recimo : var p:^objekat;

e sad pointer p se napravi na heapu i on bi trebao da sadrzi memorijsku lokaciju objekta.
Ali on trenutno sadrzi neko djubre sve dok ti njemu ne uradis new(p) cime postizes da se taj objekat zapravo "formira" na heapu i tek onda imas pristup njemu sa p^.
Recimo da ti vise ne treba taj objekat, ti bi mogao samo da uradis p:=nil (nil je nulta vrednost za pokazivace), ali time bi samo izbrisao memorijsku lokaciju objekta iz pokazivaca a objekat bi ostao negde na heapu i kulirao bi. To ocigledno moze dovesti do bacanja memorije. Zato na kraju rada sa pokazivacem treba uraditi dispose(p) a to uprvo cisti objekat sa heapa.
Nadam se da si me nesto razumeo.
Preporucujem da procitas nesto vise o pointerima da bi ti bilo jasnije. Ima toga u svakoj knjizi.
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

pirgos_madden
Pirgos Madden
Pirot

Član broj: 16752
Poruke: 322
*.ptt.yu.

Jabber: Programing
Sajt: www.pirot-mafia.co.sr


Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu24.03.2005. u 10:16 - pre 232 meseci
Jos nesto, u C/C++ - u recimo kad imas pokazivace imas posebno "obracanje" adresi i podatku na toj adresi sa onim *p i &p (recimo) a ovde kad uradis ono new() mozes da se obracas "direktno" sa
Code:

niz^[1]
niz^[2] 
niz^[3]
.........

dakle ne zanima te na neki nacin adresa jel da (ili i do nje moze da se dodje)?
I jos nesto, niko ne pominje drugi deo mog pitanja na pocetku, kolike su granice na tom heap-u - kako mogu da budzim recimo matrice sa jedno [1..1000,1..1000] ?
-I srusise se nasi divni snovi !!!
-NATO is bombing Serbia, a Yugoslavian republic, to stop the Serbs from forcing ethnic Albanians from Kosovo. Serb supporters sock it to NATO, U.S. Web sites. Magis says NATO headquarters won't launch an electronic counterstrike. "We want to show we're more civilized," he says. "We believe in freedom of speech." NATO is even discussing the possibility of hosting Serbian information on the Web so the Serbs can share their views.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu24.03.2005. u 12:05 - pre 232 meseci
Prvo, nisam siguran koliko uopste poznajes pointere. TurboPascal je DOS program, prema tome za njega vaze ogranicenja DOS programa. Ako neki niz deklarises izvan procedure/funkcije, taj niz se nalazi na DATA segmentu; ako ga deklarises unutar procedure/funkcije nalazi se na STACK segmentu; i ako deklarises samo pointer na niz, posle alociranja sa new(), niz se nalazi na HEAP-u. Dakle, imas ovako:
1) CODE segment. U ovom segmentu jedini podaci koji se mogu naci su untyped constants (nisu varijable). Velicina je ogranicena.
2) DATA segment. Sve globalne varijable se nalaze ovde, velicina je takodje ogranicena.
3) STACK segment. Sve varijable deklarisanje u funkcijama i procedurama su tu. STACK je takodje ogranicen, i on raste odozgo nadole, to jest kako se popunjava, SP registar se primice DATA segment-u.
4) HEAP...nije segment. HEAP nije ogranicen, to jest granica mu je kolicina raspolozivog RAM-a. HEAP se ne popunjava redom, to jest kako alociras memoriju na njemu, tako se 'otkidaju parcici' RAM-a za tvoj program; izmedju su komadi za druge programe (recimo). Dobro, DOS je jedini multitasking imao preko TSR (Terminate and Stay Resident) programa, ali to je druga prica.
Kako mozes da zauzmes 1 MB heap-a iz tvog programa? U malim komadima: alociras onaj niz gore 20 puta (znaci imas 20 nizova) i to je to. Pravilo kod alociranja na Heap-u je da ti sistem GARANTOVANO vraca kompaktan blok memorije za jedan poziv new() ili getmem(), ali ukupno gledano, za vise poziva new(), memorija je razbacana po RAM-u. To i ne treba da te brine. Jedino, osiguraj oslobadjanje memorije, zato sto nisam siguran da li ubijanje programa oslobadja njemu pripadajucu heap memoriju automatski. Cak se secam nekih losih primera, i to se zvalo zagadjivanje memorije; sistem pocne da se gusi u stesnjenom RAM-u.

Rajko
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu24.03.2005. u 21:45 - pre 232 meseci
Da, pascal ne oslobadja kao recimo javin garbage collector alocirane promenljive na heapu posle zavrsetka rada programa.
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

RooTeR
Rajko Nenadov
nema ga
Detelinara, NS

Član broj: 2386
Poruke: 385
*.neobee.net.



Profil

icon Re: Koriscenje velikih nizova i matrica u Turbo Pascalu25.03.2005. u 14:14 - pre 232 meseci
Sad se ti Nemanja palish kako znash Java-u :)
a u stvari nemash pojma ( shalim se bre :) hihihi

Use the force (chitaj FreePascal) Luke ... :)
Na takmichenju sutra (26.03.2005) ce se koristiti FreePascal (bar ce tako biti u NS-u, a pretpostavljam i u drugim mestima:)
mmmmmm.. aahhhhhh..
e, nije sex nego serem!
 
Odgovor na temu

[es] :: Art of Programming :: Koriscenje velikih nizova i matrica u Turbo Pascalu

[ Pregleda: 5434 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.