pascal.205asterix,
-> #203, eagle> type pok=žinteger;
> function bezveze:pok;
>
> a ne može:
>
> function nemoguca:žinteger;
Da pa naravno :) da prethodno mora da se deklariše
pokazivač :). Mislio sam da li je moguća konstrukcija
tipa:
Type pokazivac=^clan;
clan=record
...
end;
Function nemoguca (...) ;
Begin
...
node^.levi:=nemoguca (...) ;
...
End.
pascal.206zokalezic,
Hi
Sledeći program bi trebalo da preuzme int 21 i da odradi neki posao,
međutim ovako napisan iz cuga zaglupi mašinu. E sad ako promenim
interapt koji preuzima ( stavim bilo koji <> 21 ) onda radi bez problema.
Zna li neko zašto ?
{$B-,F-,R-,S-}
{$M 1024,0,0}
Program test;
Uses dos,rezid;
Var r:Registers;
Old:Procedure;
Procedure New;Interrupt;
Begin
Inline($9c);
Old;
End;
Begin
Swapvectors;
GetIntVec($21,@Old);
SetIntVec($21,@New);
Keep(0);
End.
pascal.207pedjak,
-> #201, asterix> Da li funkcija u Pascal-u može da vrati pokazivač ?
Može.
pascal.208eagle,
-> #206, zokalezic> Sledeći program bi trebalo da preuzme int 21 i da odradi neki
> posao, međutim ovako napisan iz cuga zaglupi mašinu. E sad ako
> promenim
U Tp-u nije baš onako jednostavno uraditi tako nešto.
Proceduri koju si sklonio sa tog vektora je u najvećem broju
slučajeva važan sadržaj registara, pa pre njenog poziva
moraš ubaciti niz instrukcija u asembleru za skidanje sa steka
sadržaja registara_pre poziva tvoje procedure.
Zameni redove:
inline($9C);
old;
procedurom DoOldInt iz poruke 8.191
pascal.210niklaus,
-> #196, paki(:> Kako da u Paskalu deklarišem static promenljivu?
Pošto očekuješ nešto više od jednostavnog odgovora, predložiću
ti nešto wadikalnije za pascal - rad sa stekom, jer to u stvari radi
i C kompajler. Jedan od uslova da se stek na ovaj način bezbedno i
isravno koristi, je da non-stop obraćaš pažnju na to da li neki "asm"
segment koji primenjuješ za svaki PUSH ima i odgovarajući POP na kraju
datog segmenta. Kako izgleda da programiraš u TP 4Win-u, i to tek od
skora, "asm" sigurno ne koristiš. Mada će ti to biti dobra vežba za
vežbanje "asm"-a i koncentrisanja na "sitnice" tipa PUSH&POP, štednja
Code Segmenti (korišćenjem manje globalnih promenljivih)...
(:niklaus:)
PS Kako nemam nameru da koristim TPW (BPW), očekujem 32-bitni Pascal
kompajler... (:
pascal.211niklaus,
-> #205, asterix(:> Function nemoguca (...) ;
(:> Begin
(:> ...
(:> nodež.levi:=nemoguca (...) ;
(:> ...
(:> End.
Misliš li na rekurzione funkcije, koje se služe pokazivačima?
I to je moguće! Primer je sastavljanje Hafmanovog stabla, kod mnogih
algoritama za kompresiju.
(:niklaus:)
PS (za neupućene)
Hafman (Huffman) stablo - binarno drvo koje se sastavlja na
osnovu učestanosti pojavljivanja različitih karaktera u fajlu,
koga analiziramo (a posle (de)kompresujemo). Ako da se šeta-
mo kroz stablo dobijamo skraćeni kod za svaki od karaktera.
Ako se iz roditeljskog stabla "skreće" u "levog" potomka,
sledeći bit za reprezentaciju nekog karaktera će biti "1",
a ako se "skreće" u desnog sledeći bit je "0".
(ovo "1" i "0", naravno, nije dogma (; )
pascal.209niklaus,
-> #194, bearboy(:> Elem, evo programa ALI - juzer interfejs i nije neki (nema ga
(:> ;) sve dugmice cete morati da pohvatate (ima ih oko desetak).
(:> Ova verzija konkretno sluzi za testiranje 32bitnog CRC-a. Ako
(:> pokrenete program bez parametara, reci ce vam sta treba da se
(:> upise.
Nema sira? (;
(;niklaus;)
pascal.212paki,
-> #210, niklaus> skora, "asm" sigurno ne koristiš. Mada će ti to biti dobra vežba za
> vežbanje "asm"-a i koncentrisanja na "sitnice" tipa PUSH&POP, štednja
> Code Segmenti (korišćenjem manje globalnih promenljivih)...
Dobra ideja, ali ne verujem da ću je upotrebiti, bar ne u skorije
vreme (već mi je dovoljno mučenje ovaj Windows ;). Možda kad se
malo uhodam, pa kad dođe red i na optimizaciju programa... Thanx.
pascal.213sbrk,
Dal' ima neko sve primere iz knjige TP6 - Kompletan vodič od O'Briena (Mikro
Knjiga) na disketi? Knjigu sam kupio od Mikro Knjige odavno, a sada nemaju
source na disketi.
pascal.214ndragan,
-> #210, niklaus/ ti nešto wadikalnije za pascal -
Predložio bih da se dvostvuko v piše kao w, a jednostvuko kao v, ne zato
što tako tveba, nego da možemo da napišemo dvostvuko gde zaista jeste
tako, naprimer u reči 'watiti' (vvatiti) i slično.
pascal.215drpr,
Haj,
za sve one koji ne znaju c a želeli su da vide kako radi
fejdovanje boja na ekranu u text režimu imaju fajl prikačen uz
poruku. Fajl je u originalu napisao user Klisa a ja sam ga
preveo i ostavio komentare tako da sad i vi možete da vidite
kako se menjaju nijanse u paleti boja i da se sa tim poigravate
:))
cope
fade.zippascal.216asterix,
Jedno skoro teorijsko pitanje :)
U jednom trenutku u toku programa, poziva se rekurzivna funkcija
koja može praktično da ide u dubinu rekurzivnosti dokle god veličina
stack-a dozvoljava. Prekid rekurzivnosti se dešava proverom uslova
koji je vezan za lokalnu promenljivu procedure koja zove rekurzivnu
funkciju.
Pitanje :
Da li je sa stanovišta izvršavanja i racionalnog korišćenja stack-a
bolje taj parametar prenositi iz jednog stepena rekurzije u drugi
kao argument funckije (čime bi se možda dobilo na brzini izvršavanja)
ili je bolje jednostavno koristiti taj parametar kad god je potrebno
njegovim dohvatanjem tamo gde se nalazi (što bi svakako uzrokovalo
koliko ja shvatam skakutanje po memoriji tamo-vamo ;) obzirom da bi
on za rekurzivnu funkciju bio vidljiv, odnosno dostupan po oblasti
važenja ?
pascal.217.bale.,
-> #216, asterix> Da li je sa stanovišta izvršavanja i racionalnog korišćenja stack-a
> bolje taj parametar prenositi iz jednog stepena rekurzije u drugi
> kao argument funckije (čime bi se možda dobilo na brzini izvršavanja)
> ili je bolje jednostavno koristiti taj parametar kad god je potrebno
> njegovim dohvatanjem tamo gde se nalazi (što bi svakako uzrokovalo
> koliko ja shvatam skakutanje po memoriji tamo-vamo ;) obzirom da bi
> on za rekurzivnu funkciju bio vidljiv, odnosno dostupan po oblasti
> važenja ?
Svaka funkcija sa sobom vuče tzv. pristupnu listu, pokazivače na
nelokalne promenljive. Ako tu promenljivu prenosiš kao argument
rekurzivne funkcije, povećaćeš kôd za pripremu argumenata funkcije, a
i više potrošiti prostora na steku, što znači usporenje. U drugom
slučaju, funkcija nasleđuje pristupnu listu od procedure koja je
statički obuhvata, tj. jedan isti pokazivač na tu promenljivu za bilo
koju dubinu rekurzije. Dakle, ako ne buncam u 4:39 ujutro, bolje bi
bilo da tu promenljivu dohvataš kao nelokalnu.
pascal.218vvelisavljev,
žemu služe ovi kompajler prekidači u TP7 ?
$P: Open String Parameters Switch
$T: Type-Checked Pointers Switch
Ono što piše u helpu mi nije baš najjasnije. :(
pascal.219vvelisavljev,
Funkcija function Pos(Substr: String; S: String): Byte;
je imala u ranijim verzijama Tubo Pascala jedan bag koji je bio veoma
koristan. Ako je Substr = '' funkcija je, u ranijim verzijama, vraćala 1
što je bilo veoma zgodno kod raznih pretraživanja. U Turbo Pascalu 7.0
ova funkcija vraća 0 ako je Substr='' tako da moj program više ne radi
onako kako je radio sa TP 6.0 :((
Ima li neko elegantnije rešenje od "rešenja" da napravim svoju
funkciju POS?
pascal.220eagle,
-> #219, vvelisavljev> Funkcija function Pos(Substr: String; S: String): Byte;
> je imala u ranijim verzijama Tubo Pascala jedan bag koji je bio
> veoma koristan. Ako je Substr = '' funkcija je, u ranijim
> verzijama, vraćala 1 što je bilo veoma zgodno kod raznih
> Ima li neko elegantnije rešenje od "rešenja" da napravim svoju
> funkciju POS?
Napišeš funkciju MyPos:
function mypos(s1,s2:string):byte;
begin
if s1='' then mypos:=1
else mypos:=pos(s1,s2);
end;
I zameniš svako pos u tvom programu sa mypos...
Zar postoji nešto elegantnije? :)
pascal.222.bale.,
-> #218, vvelisavljev> $T: Type-Checked Pointers Switch
Ovo je valjda za proveru tipova podataka na koje pokazuju
pokazivači, pri dodelama, poređenju i sl.
pascal.221.bale.,
-> #217, .bale.Hm, sada nije 5 ujutro, a kad sam video šta sam napisao, reko' bolje
da ponovim, malo jasnije :) Ono što sam napisao za prenošenje te
promenljive kao parametra, stoji. A kad iz neke funkcije koristiš
nelokalnu promenljivu, koja je definisana u nekoj funkciji/proceduri
koja ovu pomenutu statički obuhvata, posao povezivanja se obavlja pri
samom prevođenju. Naime, nije potrebno da podatke o toj promenljivoj
stavljaš na stek, već su sve informacije u samom kodu, a to su: broj
"skokova" po pristupnoj listi, od *statičke* dubine ugnježdenja
pomenute rekurzivne funkcije (dakle, prirodan broj) do *statičke*
dubine ugnježdenja funkcije/procedure u kojoj je pomenuta promenljiva
definisana (isto prirodan broj); i ofset unutar prostora na steku u
kome su smeštene lokalne promenljive funkcije/procedure u kojoj je
pomenuta promenljiva definisana (kako drugačije da objasnim, ako ne
kucam ove kobasice? ;-) Dakle, kompajler obraćanje toj nelokalnoj
promenljivoj prevodi kao niz skokova (ali nezavisan od dubine
rekurzije) preko pokazivača i na kraju jedno indeksno adresiranje.
Dakle, za slučaj paskala, u kome je opseg važenja statički, to tako
izgleda, otprilike. Na steku se nalaze, u tzv. aktivacionom zapisu,
samo lokalne promenljive _aktivacije_ funkcije/procudure, njeni
argumenti i mesto za rezultat, malo prostora za rad, a za vraćanje
kontrole pozivajućoj funkciji/proceduri se koristi ista pristupna
lista koja se koristi za nelokalne promenljive. Ovo poslednje je isto u
aktivacionom zapisu, mada postoje poboljšanja za pristup nelokalnim
promenljivama (objasniću ako te interesuje), tako da je, u svakom
slučaju, bolje da tu promenljivu dohvataš sa strane.
pascal.223janko,
-> #221, .bale.> lista koja se koristi za nelokalne promenljive. Ovo
> poslednje je isto u aktivacionom zapisu, mada postoje
> poboljšanja za pristup nelokalnim promenljivama (objasniću
> ako te interesuje), tako da je, u svakom slučaju, bolje da
> tu promenljivu dohvataš sa strane.
Mož' da bidne, al' ne mora da znači. Kompajleri su prilično
pametni, pa umeju da prepoznaju da li funkcija pristupa
nelokalnim promenljivama, pa ako uopšte ne pristupa, fino,
unutar aktivacionog zapisa uopšte ne ubacuju pristupnu vezu do
više funkcije, niti generišu kod koji to treba da obezbedi. U
tom slučaju, i ako je kritična promenljiva jednake veličine kao
pointer, ne može se primetiti ni promena u potrošnji memorije
na steku, a, čak, u zavisnosti od implementacije, može da se
dobije u brzini. žesto je višestruko pristupanje nelokalnoj
promeljivoj operacija koja troši više računarskog vremena od
jednog kopiranja i, posle, pristupa lokalnoj promenljivoj. To
zavisi od implementacije, kvaliteta optimizacije koda same
funkcije, i, naravno, procesora (na 80x86 su neke optimizacije
nemoguće zbog premalog broja registara).
Odgovor je, dakle: Zavisi od toga šta radiš. Ako je
potencijalna nelokalna promenljiva jedna jedina takva u
funkciji, i ako nije velika, onda je isplativo i da se prenosi
kao parametar funkcije. Ako je funkcija takva da treba da menja
nelokalnu promenljivu, onda, potencijalna nelokalna mora da
bude nelokalna. Ako je potencijalna nelokalna takva, da će
kopiranja potrošiti više vremena nego rad sa njom (oko ovoga
se, u praksi, ne vredi zamajavati), ili, da će se previše
angažovati prokleto mali stek na 80x86 procesorima, (vrlo bitno
ograničenje, na to treba paziti uvek) i onda je preporučljivo
da nelokalna ostane nelokalna.
pascal.224fole,
Da li se neko bavi Paradox Engine-om za TP (BP)?
pascal.225.bale.,
-> #223, jankoAl' ga razradi! :)
pascal.226asterix,
-> #221, .bale.> promenljivama (objasniću ako te interesuje), tako da je, u svakom
Interesuje me :)
pascal.227predragd,
-> #224, fole> Da li se neko bavi Paradox Engine-om za TP (BP)?
Bavim se.
Peđa.
pascal.228.bale.,
-> #226, asterix>> promenljivama (objasniću ako te interesuje), tako da je, u svakom
>
> Interesuje me :)
OK, daklem. Da prvo kažem da sam napravio greščicu kada sam (ako se
dobro sećam) napisao da se u paskalu (u standardnoj implementaciji)
poklapaju kontrolna veza i pristupna veza nelokalnim promenljivama.
To važi u jezicima sa dinamičkim opsegom važenja (na primer, lisp), u
paskalu ne.
Najbolje da dâm primer, ne vredi da pišem onolike kobasice.
Na primer, dat je program sledeće strukture:
A
def: a, x
B
...
endB
C
def: x
D
...
x, a
...
endD
E
...
a, v
D
...
endE
endC
endA
Kada se pristup nelokalnim promenljivama vrši preko pristupnih veza,
pri prevođenju se može saznati, na primer, da će se u funkciji E pod
imenom "a" podrazumevati promenljiva "a" definisana u A, dva nivoa
iznad (jedan skok preko pristupnih veza, tj. jednostruke liste
pokazivača, jer prvi u listi pokazuje na jedan statički nivo iznad),
sa tim-i-tim ofsetom. Ukoliko se unutar E poziva funkcija D, to će se
prevoditi tako da se izračuna broj potrebnih skokova niz pristupne
veze (broj skokova = nivo E - nivo D + 1 = 1), pa se generiše kôd
koji se "spusti" taj broj puta niz pristupne veze i tamo gde se
zaustavi, to je aktivacioni zapis na koji će pokazivati pristupna
veza u aktivacionom zapisu funkcije D (tačnije, pokazivaće na sledeći
pokazivač u listi, a koji se nalazi u tom aktivacionom zapisu), a u
kodu za D je već definisan pristup nelokalnim promenljivama, kao u
opisanom slučaju (E, a). Ukoliko se šalju funkcije kao parametri, i
njihove pristupne veze moraju da se šalju.
Drugi način je pomoću tzv. displeja. Displej predstavlja niz
pokazivača na najsvežije aktivacione zapise na pojedinim statičkim
nivoima ugnježdavanja. Na primer, ako je E na nivou 3, displej[1]
i displej[2] će pokazivati na poslednje aktivacije funkcija na
nivoima 1 i 2, redom, a koje statički obuhvataju E (ne može a da
ne obuhvataju).
Algoritam ažuriranja sadržaja displeja je sledeći:
Kada se aktivira funkcija na statičkom nivou ugnježdavanja "i",
radi se sledeće:
1) Sačuva se stara vrednost displej[i] u aktivacionom zapisu,
2) U displej[i] se smešta adresa novog (najsvežijeg) aktivacionog
zapisa.
Pri povratku se sačuvana vrednost vraća u displej[i].
To je to, valjda nisam negde pobrljavio :)
pascal.229kenza,
Hi!
Zna li neko kako da odredim gde mi pocinje heap?
Treba mi u stvari da odredim da li mi pokazivac pokazuje na heap.
Program mi javlja run time error 204-invalid pointer operation,
help kaze da je to zato sto radim dispose od nil-a ili sto ide dispose
pokazivaca koji ne pokazuje na heap.prvo nije , kako da saznam da li pokazivac
pokazuje na heap?
Hvala & cu
pascal.230eagle,
-> #229, kenza> Zna li neko kako da odredim gde mi pocinje heap?
> Treba mi u stvari da odredim da li mi pokazivac pokazuje na
> heap. Program mi javlja run time error 204-invalid pointer
> operation, help kaze da je to zato sto radim dispose od nil-a
> ili sto ide dispose pokazivaca koji ne pokazuje na heap.prvo
> nije , kako da saznam da li pokazivac pokazuje na heap?
Uđeš u editor , ukucaš "heap" , pritisneš Ctrl-F1 i eto... ;)
Dakle, imaš promenljive:
Heaporg - pointer na početak heap-a
Heapend - pointer na kraj heap-a
Heapptr - pointer na vrh heap-a
Gore pomenuta poruka se javlja kada pointer ne pokazuje na
lokaciju između početka i vrha heap-a, što se lako utvrđuje:
if seg(pž)*16 + ofs(pž) in
Šseg(heaporgž)*16 + ofs(heaporgž) .. seg(heapptrž)*16 + ofs(heapptrž)Ć
then Jeste;
Btw, zašto ti ovo treba? :)
pascal.231valhala,
-> #190, a.kircanski>###### I sta je IRQ? (znam da je interrupt request number, al
>###### sta znaci)
pascal.232kenza,
-> #230, eagle(;> if seg(pC)*16 + ofs(pC) in
(;> Sseg(heaporgC)*16 + ofs(heaporgC) .. seg(heapptrC)*16 +
(;> ofs(heapptrC)C then Jeste;
....................
(;> Btw, zasto ti ovo treba? :)
Pisem neki program koji koristi TOT
(TechnoJock'sObjectToolkit) za menije , maske i uopste
user-interface.I onda se javlja error 204 kada dva puta za
redom pozovem istu masku za unos?! Ako pozovem tu masku samo
jednom , sve je o.k., isto je sve u redu ako pozovem neki
drugi deo tot-a izmedju 2 poziva "problematicne" maske.
Hvala ti puno ;)
pascal.233peca.st,
-> #232, kenza!-> Pisem neki program koji koristi TOT
Ma TOT je i inače prilično bagovit,
pogotovu po pitanju hot-keya. Bez veze što su
uradili tako puno dobrih stvari, ali dosta površno
i izgleda bez testiranja.
Peđa.
pascal.234niklaus,
-> #232, kenza(:> Pisem neki program koji koristi TOT
(:> (TechnoJock'sObjectToolkit) za menije , maske i uopste
(:> user-interface.I onda se javlja error 204 kada dva puta za
(:> redom pozovem istu masku za unos?! Ako pozovem tu masku samo
(:> jednom , sve je o.k., isto je sve u redu ako pozovem neki
(:> drugi deo tot-a izmedju 2 poziva "problematicne" maske.
Ako ti eagle ništa ne kaže, ja kažem sledeće:
"Probaj sa dummy procedurom, onaj fazon begin end;"
Ajd' probaj, lako je...
(:niklaus:)
pascal.235drpr,
Danas sam nešto muljao oko pascala i naiđoh u O'Brien-ovom
vodiču na funkciju PORT ali nigde ne nađoh da li je ona zamena
za IN/OUT u asembleru ili šta je? U On line helpu pascala ne
piše ništa o ovoj fj-i a TP je kompajlira bez problema pa ide
pitanje zna li neko o ovome ponešto?
cope
pascal.236bole,
Hi ljudi, evo ja napisah jedan prg. A to je Modul Player zvani BOMP (BOlex
Modul Player)
bomp.arjpascal.237eagle,
-> #235, drpr> Danas sam nešto muljao oko pascala i naiđoh u O'Brien-ovom
> vodiču na funkciju PORT ali nigde ne nađoh da li je ona zamena
> za IN/OUT u asembleru ili šta je? U On line helpu pascala ne
> piše ništa o ovoj fj-i a TP je kompajlira bez problema pa ide
> pitanje zna li neko o ovome ponešto?
To ti se ovako radi: Napišeš jednostavan programčić tipa
begin
portŠ1Ć:=portŠ2Ć;
end.
prevedeš ga, i pogledaš .exe nekim disassemblerom (ili debugom).
Parče koda za ovaj red programa izgleda ovako:
IN AL,02
OUT 01,AL
Btw, TP kompajler tretira port kao niz, ne kao funkciju.
Dakle:
y:=portŠxĆ je zamena za IN
portŠxĆ:=y je zamena za OUT
pascal.238dejanr,
-> #235, drpr>> Danas sam nešto muljao oko pascala i naiđoh u O'Brien-ovom
>> vodiču na funkciju PORT ali nigde ne nađoh da li je ona zamena
>> za IN/OUT u asembleru ili šta je?
Jeste. Umesto što bi rekao iz asemblera OUT 12, 123, kažeš port[12]:=123
Isto tako i za IN, samo što fiktivni niz port[] stoji sa desne strane :=
pascal.239kenza,
-> #233, peca.st(;> Ma TOT je i inace prilicno bagovit,
(;> pogotovu po pitanju hot-keya. Bez veze sto su
Hot Keyove (;) sam izbacio, a bug po bug ispravljam...
Beyond 2000 ce da bude o.k. ;)
pascal.240kenza,
-> #234, niklaus(;> Ako ti eagle nista ne kaze, ja kazem sledece:
(;> "Probaj sa dummy procedurom, onaj fazon begin end;"
Ona f-ja koju mi je Eagle ostavio izgleda da je resila stvar.
Dummy sam vec ranije probao, i nije vredelo ;)
pascal.241a.kircanski,
-> #236, bole_-=> Hi ljudi, evo ja napisah jedan prg. A to je Modul Player
_-=> zvani BOMP (BOlex Modul Player)
Axa, a koji unit si koristio? Nemoj samo da kažeš da si
sam napisao algoritam za mod datoteke ;-)
sale.
pascal.242ognjen,
Evo, i ja poceh da malo ucim PASCAL, ali mi nesto nikako ne ide
u glavu (valjda od posledica BASICa ;) :
WHILE A<=3 DO itd.
!!!!
Dok je A manje ili jednako 3 radi to i to i to...
(ovo je ok, ne razumem ovo sto sledi: )
FLAG:=TRUE
WHILE FLAG DO blabla
!!!!
Ovo ne kapiram! Zar ne bi trebalo da stoji
WHILE FLAG:=TRUE DO blabla??? Dakle, dok je flag Ok,
radi blabla, a, kad se flag promeni pici dalje, zar ne?
Ali, po datom primeru, reklo bi se, NE! Gornja petlja
bi onda bila DOK_JE_FLEG_RADI_blabla?!? Dok je flag, STA?
Dok je flag TRUE ili FALSE ili STA???? HELP!
pascal.243bulaja,
-> #242, ognjen│FLAG:=TRUE
│WHILE FLAG DO blabla
│!!!!
│Ovo ne kapiram! Zar ne bi trebalo da stoji WHILE FLAG:=TRUE DO blabla???
│Dakle, dok je flag Ok, radi blabla, a, kad se flag promeni pici dalje,
│zar ne? Ali, po datom primeru, reklo bi se, NE! Gornja petlja bi onda
│bila DOK_JE_FLEG_RADI_blabla?!? Dok je flag, STA? Dok je flag TRUE ili
│FALSE ili STA???? HELP!
└───
WHILE petlju posmatraj kao while (<uslov>), gde je <uslov> logicki
izraz, sto znaci da njegove vrednosti moug biti true ili false. Potpuno
je svejedno da li je taj logicki izraz prost (npr. ispituje se stanje
samo jedne promenljive tipa Boolean kao u tvom slucaju) ili slozen (kao
sto je (a<=3) - vazan je rezultat logickog izraza. Konkretno, u tom tvom
primeru petlja ce se vrteti dokle god je vrednost izraza (flag) jednaka
true, sto prakticno znaci isto sto i
while (flag == true).
pascal.245peca.st,
-> #243, bulaja!-> while (flag == true).
Hm, hm, neće biti "==" :) (to bi bilo za C)
Peđa.
pascal.244peca.st,
-> #242, ognjen!-> WHILE FLAG:=TRUE DO blabla??? Dakle, dok
!-> je flag Ok,
Prvo što moraš da naučiš je da razlikuješ naredbu dodele ( := )
i logičko jednako ( = )
Dakle, ovo što si napisao gore nikako ne bi moglo da stoji.
Moglo bi da stoji While flag = true do blabla ali nije potrebno
jer je "While flag = true" ekvivalentno sa "While flag",
a "While flag = false" ekvivalentno sa "While not flag".
Ako ti je lakše, slobodno možeš da piše tako, potpuno je svejedno.
Ali, ne zaboravi, a := b NIJE ISTO ŠTO I a = b
Peđa.
pascal.247draganm,
-> #242, ognjen*> Ovo ne kapiram! Zar ne bi trebalo da stoji
*> WHILE FLAG:=TRUE DO blabla??? Dakle, dok je flag Ok,
*> radi blabla, a, kad se flag promeni pici dalje, zar ne?
*> Ali, po datom primeru, reklo bi se, NE! Gornja petlja
*> bi onda bila DOK_JE_FLEG_RADI_blabla?!? Dok je flag, STA?
*> Dok je flag TRUE ili FALSE ili STA???? HELP!
Flag ti je promenjiva boolean tipa, on moze da ti zameni bilo koji
logicki izraz (npr. a>3) i u ovom primeru se ono sto je iza while izvrsava
dok je flag=TRUE, ako flag promeni vrednost u FALSE program izlazi iz WHILE
petlje.
-=>Phantom Lord<=-/.CoRRoSioN.
pascal.246draganm,
-> #241, a.kircanski*> Axa, a koji unit si koristio? Nemoj samo da kazes da si
*> sam napisao algoritam za mod datoteke ;-)
Nije unit nego OBJ, tacnije mod-obj :))
-=>Phantom Lord<=-/.CoRRoSioN.
pascal.248predragd,
Zašto neke MS-DOS funkcije (IOCTL, čitanje/setovanje serijskog
broja diska) ne rade u protected modu (BP 7.0). Dok na primer
funkcija $41 - brisanje fajla, takođe u protected modu, radi
odlično. Sa druge strane sve te funkcije u real modu (takođe BP
7.0) rade potpuno ispravno.
Peđa.
pascal.249paki,
-> #242, ognjen> WHILE FLAG DO blabla
> !!!!
> Ovo ne kapiram! Zar ne bi trebalo da stoji
> WHILE FLAG:=TRUE DO blabla??? Dakle, dok je flag Ok,
> radi blabla, a, kad se flag promeni pici dalje, zar ne?
> Ali, po datom primeru, reklo bi se, NE! Gornja petlja
> bi onda bila DOK_JE_FLEG_RADI_blabla?!? Dok je flag, STA?
> Dok je flag TRUE ili FALSE ili STA???? HELP!
Dok je fleg True. Evo i malog objašnjenja:
Recimo da se logička promenljiva (tj. flag) zove SunceSija.
Tada, ako napolju sija sunce, napišeš 'SunceSija:=True'.
Dalje u programu ti treba da vidiš da li sunce sija.
Ispitaćeš sa 'if SunceSija then...'.
Vrednost SunceSija je logički izraz koji može biti tačan ili
netačan. Isto tako si mogao da napišeš 'if 2>3 then...', i u ovom
slučaju je '2>3' logički izraz koji vraća vrednost False (jer 2
nije veće od 3).
Dakle, podrazumeva se da, ako napišeš 'while Flag', misliš na
'while Flag=True'. Takođe, umesto 'while Flag=False' možeš pisati
'while not Flag'. Npr. ako sunce ne sija, sigurno ti je
razumljivije ako napišeš 'if not SunceSija' nego 'if SunceSija=False'.
pascal.250magician,
-> #244, peca.st=> !-> WHILE FLAG:=TRUE DO blabla??? Dakle, dok...
=>
=> Prvo što moraš da naučiš je da razlikuješ naredbu dodele ( := )
=> i logičko jednako ( = )
=> Dakle, ovo što si napisao gore nikako ne bi moglo da stoji.
Pascal nemam pojma, ali u C-u bi moglo da stoji i
while (FLAG = TRUE) // '=' čitaj kao ':='
Jeste da u ovom slučaju nema mnogo smisla, ali nije neispravno. Da
li je u Pascalu neispravno prvo dodeliti vrednost promenljivoj, pa
onda ispitivati njenu logičku vrednost?
pascal.251snemcev,
-> #245, peca.st>> !-> while (flag == true).
>>
>> Hm, hm, neće biti "==" :) (to bi bilo za C)
I za Clipper! ;)))
pascal.252peca.st,
-> #250, magician!-> Da li je u
!-> Pascalu neispravno prvo dodeliti vrednost
!-> promenljivoj, pa onda ispitivati njenu
!-> logičku vrednost?
Ma, u Pascalu ne možeš ko u Cu da u sred nekog izraza dodeljuješ
vrednosti. Dodeljivanje vrednosti mora (valjda) da se vrši u posebnoj
naredbi, posebnom redu.
Peđa.
pascal.253pedjak,
-> #242, ognjen> WHILE FLAG DO blabla
> Ovo ne kapiram! Zar ne bi trebalo da stoji
> WHILE FLAG:=TRUE DO blabla??? Dakle, dok je flag Ok,
Nikako ne može da stoji while flag:=true ,može jedino while
flag=true ili skraćeno while flag.
pascal.254eagle,
-> #196, paki> Kako da u Paskalu deklarišem static promenljivu?
> Znači, treba mi promenljiva koja će zadržavati svoju vrednost i
> kada izađem iz funkcije u kojoj je definisana. Jedino što mi
> pada na pamet su globalne promenljive.
Ovo sam danas sasvim slučajno otkrio, i to zato što mi je pravilo
probleme u jednom programu. Dakle, deklarišeš promenljivu sa const:
const promenljiva : tip = pocetna_vrednost;
Na primer:
procedure proba;
const i:byte=0;
begin
inc(i);
writeln(i);
end;
BEGIN
while true do proba;
END.
pascal.255dejanr,
-> #254, eagle>> const promenljiva : tip = pocetna_vrednost;
Dodao bih još jednu sitnicu - ako je "konstanta" string, onda *ne*
treba pisati: const ime: string = 'Pera' nego const ime: string[5] = 'Pera'.
Inače u .EXE fajlu (kada ga napravi) ostavi stringčinu od 256 nula bajtova,
što možda i ne smeta mnogo ali deluje malo glupo.
Naravno, ako će "konstanta" posle menjati vrednost, onda mora da se stavi
maksimalna moguća dužina, pa kolko nula mora, mora.
pascal.256v.nesic,
-> #250, magician> ............................................................... Da
> li je u Pascalu neispravno prvo dodeliti vrednost promenljivoj, pa
> onda ispitivati njenu logičku vrednost?
U čemu je ovde poenta ?
pascal.257a.kircanski,
-> #242, ognjen_-=> WHILE FLAG DO blabla
To ti je isto što i While flag = true do blablabla
_-=> WHILE FLAG:=TRUE DO blabla??? Dakle, dok je flag Ok,
------
Ne treba while flag:=true do, nego while flag=true do. := je dodeljivanje.
sale.
pascal.258magician,
-> #256, v.nesic=>> ............................................................... Da
=>> li je u Pascalu neispravno prvo dodeliti vrednost promenljivoj, pa
=>> onda ispitivati njenu logičku vrednost?
=>
=> U čemu je ovde poenta ?
žini mi se da sam lepo napisao, ali...
Obrati se na pažnji:
if( (KlaraMandic = Read(...)) != SlobodankaGruden)
Ovde se prvo promenljivoj Klara dodeljuje neka vrednost pa se tek
onda ispituje njena log. vrednost. Poentu izvuci sam...
pascal.259vitez.koja,
-> #250, magician#=> neispravno. Da li je u Pascalu neispravno prvo dodeliti
#=> vrednost promenljivoj, pa onda ispitivati njenu logičku
#=> vrednost?
Kratko rečeno, jeste. Razlika je, zapravo, suštinska, i to u funkcionisanju
parsera za ova dva jezika i evaluiranju izraza. U Cu ce izraz evaluria s desna
na levo (naravno uzimajući u obzir prioritete operanda), čak sam stekao utisak
da se cela jedna naredba (između dva ';') može sa stanovišta Ca posmatrati kao
brojni izraz. Za paskal nisam siguran kako stvar izgleda, ali verovatno je
mnogo stroža i ograničavajuća.
Pitanje za one koji su se malo bavili samim jezikom, ne samo programiranjem u
njemu : zar vam se ne čini da je u Cu 'void' tip kršenje principa zarad lakšeg
korišćenja (programiranja) ? Naime, da nema ovog tipa (a pre ANSI standarda
nije ga ni bilo) bilo koji C programski izraz mogao bi se obrađivati kao
aritmetiči izraz, jer _svi_ članovi tog izraza ili imaju aritmetičke vrednosti
ili su operacije; rekao bih da su od takve koncepcije pošli i tvorci Ca.
pascal.260debelijencija,
-> #259, vitez.kojaOvome je ovdi mesto! :)
!=?> programiranjem u njemu : zar vam se ne čini da je u Cu
!=?> 'void' tip kršenje principa zarad lakšeg korišćenja
!=?> (programiranja) ? Naime, da nema ovog tipa (a pre ANSI
!=?> standarda nije ga ni bilo) bilo koji C programski izraz
void tip je postojaoi pre ANSI standarda, u nekim implementacijama. K&R i
kažu da su to usvojili pošto su se lično, u radu uverili da je to korisna
stvar.
Uostalom, šta ti fali? :) Zar nije ovako bolje? (da ga ima, nego da ga nema)
!=?> mogao bi se obrađivati kao aritmetiči izraz, jer _svi_
!=?> članovi tog izraza ili imaju aritmetičke vrednosti ili su
!=?> operacije; rekao bih da su od takve koncepcije pošli i
!=?> tvorci Ca.
Pa, čekaj, ti ne možeš da deklarišeš promenljivu tipa void. Stoga ona i ne
može da se pojavi u izrazu. Dakle, svaki izraz možeš tako da posmatraš...
Možda i ne možeš, ali ondak ne zna koji je taj.
Iskreno rečeno, pojma nemam od kakve su koncepcije pošli tvorci Ca (tačnije
tvorac Ca, pošto je Kernighan samo pomagao u knjizi), ali nije loše ispalo,
zar ne? :)
pascal.261paki,
-> #254, eagle> Ovo sam danas sasvim slučajno otkrio, i to zato što mi je pravilo
> probleme u jednom programu. Dakle, deklarišeš promenljivu sa const:
>
> const promenljiva : tip = pocetna_vrednost;
Super :) Ja sam to video na par mesta, ali sam mislio da služi
samo da se promenljivoj dodeli početna vrednost :)
pascal.262bojanp,
-> #255, dejanr>>> const promenljiva : tip = pocetna_vrednost;
>
> Dodao bih još jednu sitnicu - ako je "konstanta" string, onda *ne*
> treba pisati: const ime: string = 'Pera' nego const ime: string[5] =
> 'Pera'. Inače u .EXE fajlu (kada ga napravi) ostavi stringčinu od 256 nula
> bajtova, što možda i ne smeta mnogo ali deluje malo glupo.
Ako se želili minimalno memorijsko zauzeće onda je u gornjem primeru
ipak prihvatljivije napisati const ime : string[4] = 'Pera', jer
je dužina ovoga stringa 4 a ne 5. Kod Turbo Pascala se navodi
maksimalna dužina stringa i u nju ne treba uračunati byte u kome
se čuva trenutna dužina (za razliku od C gde treba alocirati jedan
byte više za nul karakter na kraju).
Pozdrav, Bojan
pascal.263v.nesic,
-> #258, magician> => U čemu je ovde poenta ?
> žini mi se da sam lepo napisao, ali...
Pretpostavio sam da to misliš, ali mi je zvučalo skroz drugojačije.
pascal.264vitez.koja,
-> #260, debelijencija#=> može da se pojavi u izrazu. Dakle, svaki izraz možeš
#=> tako da posmatraš...
Ma ni blizu:
while(e++%=25 ? e : clrscr());
Zaista nemam pojma čemu bi ovaj izraz služio, ali da ne radi - ne radi.
pascal.265ognjen,
-> #257, a.kircanski)-> Ne treba while flag:=true do, nego while flag=true do. := je
)-> dodeljivanje. sale.
Ok, nemoj mo zameriti, novi sam :)
pascal.266ognjen,
-> #253, pedjak)-> Nikako ne može da stoji while flag:=true ,može jedino while
)-> flag=true ili skraćeno while flag.
Thanks, samo jos nesto. Da li je skraceno flag po difoltu =true
ili mu je true vrednost dodeljena u nekom od prethodnih redova?
pascal.267peca.st,
-> #266, ognjen!-> Thanks, samo jos nesto. Da li je skraceno
!-> flag po difoltu =true ili mu je true
!-> vrednost dodeljena u nekom od prethodnih
!-> redova?
Uvek je true. Pakijev primer ti je najbolji i najlakše ćeš
shvatiti tako. "U duhu jezika" je da se piše "if flag", ili
"if not flag", a ne drugačije.
Peđa.
pascal.269broker,
-> #242, ognjen> FLAG:=TRUE
> WHILE FLAG DO blabla
U ovakvom slučaju ja bih upotrebio repeat until petlju. U gornjem
slučaju očigledno je da se u petlju ulazi bar jednom, a tada je
repeat until petlja zgodnija.
broker
pascal.270broker,
-> #250, magician> Pascal nemam pojma, ali u C-u bi moglo da stoji i
>
> while (FLAG = TRUE) // '=' čitaj kao ':='
C je u tome malo slobodan pa se pod TRUE uglavnom smatra ono sto
je različito od FALSE, a FALSE se obično smatra da je nula.
Obratiti pažnju na ono 'obično'. :) Negde se smatra da je FALSE ono
sto nije TRUE, a opet TRUE moze da se smatra da je 1... Sad ima
ono 'može'. :)
Zato ja i volim Paskal. Jeste da je tvrd, ali brate znaš na čemu
si.
broker
pascal.268broker,
-> #255, dejanr> Dodao bih još jednu sitnicu - ako je "konstanta" string,
> onda *ne* treba pisati: const ime: string = 'Pera' nego
> const ime: stringŠ5Ć = 'Pera'. Inače u .EXE fajlu (kada ga
> napravi) ostavi stringčinu od 256 nula bajtova, što možda
> i ne smeta mnogo ali deluje malo glupo.
>
> Naravno, ako će "konstanta" posle menjati vrednost, onda
> mora da se stavi maksimalna moguća dužina, pa kolko nula
> mora, mora.
Da, ali je tada jednostavnije da se promenljiva deklariše na
uobičajeni način, pa da joj se vrednost dodeli na početku programa.
Tada će u exe-u da zauzima minimalan prostor, a neće biti
ograničenja da se dužina kasnije poveća.
broker
pascal.271eagle,
-> #268, broker> Da, ali je tada jednostavnije da se promenljiva deklariše na
> uobičajeni način, pa da joj se vrednost dodeli na početku
> programa. Tada će u exe-u da zauzima minimalan prostor, a neće
> biti ograničenja da se dužina kasnije poveća.
Ali tada ne bismo imali STATIC promenljivu.
pascal.272pedjak,
-> #266, ognjen> Thanks, samo jos nesto. Da li je skraceno flag po difoltu =true
> ili mu je true vrednost dodeljena u nekom od prethodnih redova?
Ne dodeljuje se flagu nikakva vrednost, nego se njegova vrednost
ispituje, znači
while flag do ...
je isto što i
while flag=true do ...
Ok?
pascal.273dejanr,
-> #268, broker>> Da, ali je tada jednostavnije da se promenljiva deklariše na
>> uobičajeni način, pa da joj se vrednost dodeli na početku programa.
>> Tada će u exe-u da zauzima minimalan prostor, a neće biti
>> ograničenja da se dužina kasnije poveća.
Dosta diskutabilno, tj. decidiran odgovor bi zahtevao proučavanje
načina na koji turbo pascal generiše izvršni kod. Naime, ako kažem:
var p: string;
begin
p:='pera';
...
end.
biće u data segmentu alocirano 256 bajta za string p, ali još negde
mora da stoji tekst 'pera'. E sad, moglo bi se zamisliti (tako su i
radili neki od "poslednjih" bejzika na osmobitnim računarima) da se
p nanišani tako da pokazuje na string 'pera' u memoriji, pa tek ako
se nekada taj string promeni, da se alocira prostor na drugom mestu.
Međutim sumnjam da Turbo Pascal tako radi, verovatno je tekst 'pera'
negde u kod segmentu, a alocirani prostor je u data segmentu. Sve u
svemu, ako bih ovako dodelio puno dugačkih promenljivih, to bi dalo
relativno kratak EXE fajl, ali bi u trenutku izvršavanja em ceo taj
fajl stajao u memoriji, em bi stringovi bili još na jednom mestu, u
data segmentu. Dakle, trošila bi se memorija više nego što mora, tj.
u zbiru bi bilo manje prostora na heap-u.
Sa druge strane, ako stavim:
var p: string[5]:='Pera';
(može i string[4], kako neko reče, ali ja obično stavim bajt-dva više,
za svaki slučaj, naročito otkad me je jednom dimenzionisanje "u bajt"
koštalo 800 dem)
onda će se alocirati u data segmentu 5 (tj. 6 jer ima i dužina) bajta
za promenljivu, i odma tu piše početna vrednost. U zbiru, ušteda na
heap-u.
Osim svega toga, meni je nekako preglednije kada vidim dodeljenu vrednost
odmah, a ne moram da gledam "dole" u program.
pascal.274.obj,
-> #273, dejanr> Međutim sumnjam da Turbo Pascal tako radi, verovatno je tekst 'pera'
> negde u kod segmentu, a alocirani prostor je u data segmentu.
U pravu si, ne postoji razlog da se promenljivoj naknadno dodeljuje
vrednost. Samo bi se dodatno trošila memorija u CODE segmentu, gde TP
smešta konstantne stringove. A osim toga, i nije pregledno. :)
Eventualno bi kao argument bio da je odgovarajući EXE kraći, ali...
PKLITE rules. ;)
pascal.275.obj,
-> #274, .obj> Samo bi se dodatno trošila memorija u CODE segmentu, gde TP
> smešta konstantne stringove.
Nisam, kao i obično, bio precizan: TP stringove iz CONST-a smešta u
DATA segment (zajedno sa "nulama":), a ("konstantne") stringove koje
koristi u toku izvršavanja programa (pri dodeljivanju, konkatenaciji
itd.) smešta u CODE segment.
pascal.276bole,
Jao!
Ovako:
Ocu da napravim neki prg. (recimo) koji ce da upisuje u fajl podatke bilo kakve
a da posle mogu da ih menjam. E to mora (koliko ja znam) da se radi sa
RECORDIMA e posto jos nisam svatio kako se sa njima radi, MOLIM VAS pomoZITE
Hvala unapred i unazad!
bolE
pascal.277dejanr,
-> #276, bole>> E to mora (koliko ja znam) da se radi sa RECORDIMA e posto jos nisam
>> svatio kako se sa njima radi, MOLIM VAS pomoZITE
Možda da pročitaš umetak o Paskalu iz prošlih (septembarskih) "Računara",
tamo je to objašnjeno dosta detaljno?
Kratko rečeno, napraviš record, na primer
type telt = record
ime: string;
brtel: longint;
end;
onda definišeš promenljivu i fajl:
var tel: telt;
telf: file of telt;
u programu otvoriš fajl:
assing (telf, 'telefoni.dat');
reset (telf);
i onda kada hoćeš da promeniš deseti (broji se od nule) telefon kažeš:
seek (telf,10);
read (telf, tel);
tel.brtel:=123456;
seek (telf,10);
write (telf, tel);
i na kraju zatvoriš fajl
close (telf);
pascal.278peca.st,
-> #276, bole!-> Ocu da napravim neki prg. (recimo) koji
!-> ce da upisuje u fajl podatke bilo kakve a
!-> da posle mogu da ih menjam. E to mora
!-> (koliko ja znam) da se radi sa RECORDIMA
!-> e posto jos nisam svatio kako se sa njima
!-> radi, MOLIM VAS pomoZITE
Ako hoćeš da menjaš podatke u fajlu, oni u opšte ne moraju
biti neki slog. Mogu biti bilo kog tipa.
Evo kako bi to izgledalo na uopštenom primeru:
f : file of bilokojitip;
bkt : bilokojitip;
... (ovde ide ono assign, reset, pa šetanje po fajlu, bilo šta...)
read (f, bkt);
.... (promena sadržaja promenljive "bkt")
seek (f, filepos (f) - 1); (da se vrati tamo gde je malopre pročitao)
write (f, bkt);
...
Eto, ako još uvek nije jasno, pitaj.
Peđa.
pascal.279nikac,
Jedno pitanje za poznavaoce TVISION-a.
Kako da saznam ime trenutno aktivnog prozora u Editoru?
pascal.280niklaus,
-> #270, broker(:> C je u tome malo slobodan pa se pod TRUE uglavnom smatra ono
(:> sto je različito od FALSE, a FALSE se obično smatra da je
(:> nula.
(:> Zato ja i volim Paskal. Jeste da je tvrd, ali brate znaš na
(:> čemu
Što jes' - jes!
Poznata mi je (kao mnogima) definicija (aksiom?) FALSE je 0,
a TRUE ponekad -1 (ovako beše u BASIC-u), nekad 1, nekad x!=0 (u C-u).
I pored toga sam x puta morao da pogledam u onaj TurboC-ov Help, za
naredbu _if_ - koji blok naredbi se izvršava za rezultat "zero", ili
"nonzero".
(:niklaus:)
pascal.281vvelisavljev,
Kako rešavate štampanje iz TPa? Mene onaj standardni printer
unit baš i ne zadovoljava. Nema kontrole da li je štampač uključen i
sl. Da li postoji neki unit ovde na sezamu koji rešava stvar.
Da li taj unit ima nešto više od jednog Assign(lst, prn)?
Za neka duža štampanja koistim dos print. (napunim tekst fajl i onda
pozovem print tekst.txt) Da li mogu nekako da u svom programu dobijem
informacije o tome da li je određena datoteka odštampana, da li je
uključen štampač i sl. a da ne koristim trik "print > trt.txt".
pascal.282dejanr,
-> #281, vvelisavljev>> Kako rešavate štampanje iz TPa?
U prošlomesečnim (septembarskim) "Računarima", u okviru umetka, diskutovano
je i o štampanju iz paskala. Varijanta sa Assign(lst, prn), bilo preko
printer unita ili direktno, ne zadovoljava ni za šta što nije tekst -
pojedini karakteri (a naročio chr(26)) se kod takve štampe gube. Tamo je
data procedura koja sprečava taj gubitak znakova (dos_rowmode), uz nju
se može relativno pristojno štampati iz paskala.
Jedno nešto drugačije rešenje (koje, inače, i ja koristim) dato je u
"Računarima 85", u okviru umetka o laserskim štampačima. Isto, naravno,
funkcioniše i na matričnom printeru. Ideja je da se sa štampačem komunicira
preko BIOS-a, tamo imaš proceduru kojom se testira da li je štampač spreman,
šalje znak itd.
Primere iz jednog i drugog umetka imaš i u direktorijumu RSOFT:
R094PAS.ZIP odnosno R055LAS.ZIP.
pascal.283fole,
-> #279, nikac> Jedno pitanje za poznavaoce TVISION-a.
> Kako da saznam ime trenutno aktivnog prozora u Editoru?
Pročitaj naziv prozora :)
Evo ja sam nešto izmajmunisao. Radi, ali rešenje je prilično neelegantno.
Uz poruku je zakačen modifikovan TVEDIT.PAS iz TP 6.0. Izmene su ozna-
čene sa (***********). Voleo bi kad bi neko uradio to jednostavnije
(čitaj: elegantnije).
ed.zippascal.284predragd,
-> #279, nikac
> Jedno pitanje za poznavaoce TVISION-a.
> Kako da saznam ime trenutno aktivnog prozora u Editoru?
Funkcijom GetTitle (MaxSize: Integer) iz TEditWindow objekta.
MaxSize predstavlja maksimalnu dužinu imena prozora. Iako koliko
sam ja uspeo da zakljucim iz fajla EDITORS.PAS MaxSize ne igra
nikakvu ulogu.
Peđa.
pascal.285eagle,
-> #283, fole> Evo ja sam nešto izmajmunisao. Radi, ali rešenje je prilično
> neelegantno. Uz poruku je zakačen modifikovan TVEDIT.PAS iz TP
Jednostavnije ne može, ali ovako ipak neće raditi baš u svim programima.
Može da se desi da aktivan pogled nije prozor. Doduše, u većini programa
se direktno u desktop ubacuje isključivo Pwindow ili njegovi potomci
(Pdialog, Peditwindow...) ali može neko da direktno iz Pviewa napravi
svoj pogled, na primer neki terminal, i u tom slučaju bi program otišao
na ko zna koju adresu, pošto je twindow.gettitle virtuelan.
Ja sam smislio jedan način kojim možeš da pristupaš svim poljima
bilo kog objekta iz desktopa. Na primer, treba mi dužina bafera iz
aktivnog editora. Pošto ne postoji način da saznam da li je aktivan
pogled editor ili npr. dijalog, umesto Teditwindow napravim svoju klasu
koja je nasleđuje, i u toj klasi redefinišem neki metod sa parametrima,
koji potiče iz Tview-a (zato što je desktop^.current^ tog tipa), na
primer handleevent, tako da za neku cm vrednost upisuje u neku globalnu
promenljivu polje bufsize iz svog objekta, a za druge vrednosti poziva
teditwindow.handleevent. Pomenuta dužina se saznaje na sledeći način:
duzina:=0; (* duzina je globalna promenljiva *)
event.command:=cmDajMiBafer;
desktop^.current^.handleevent(event);
U slučaju da je duzina ostala na istoj vrednosti, znači da aktivan
prozor nije editor, u svim ostalim slučajevima je sigurno pozvan
metod tMyeditwindow.handlevent koji radi duzina:=bufsize;
Dakle, ovako je moguće proveriti i tip aktivnog pogleda. Način je
potpuno legalan, radi uvek, a treba dopisati ne više od desetak redova.
Evo šiljem uz poruku ovako promenjen tvedit.pas , bitno je da vraća
title samo ako je u pitanju editor, što je i trebalo uraditi.
ed1.zippascal.286djelovic,
-> #284, predragd> Iako koliko sam ja uspeo da zakljucim iz fajla EDITORS.PAS MaxSize ne igra
> nikakvu ulogu.
Rekao bih da je to uvedeno čisto zbog kompatibilnosti sa TurboVisionom za
C++, koji je od C-a nasledio te nesrećne stringove.
pascal.287djanjusevic,
Evo jednog problema na pascalu:
Uz poruku ide i fajl sa source-om programa.Dati program bi trebao da
nacrta jedan svemirski brodic.U zavisnosti od ugla Alfa brodic bi trebao
da bude u sasvim drugom polozaju od pocetnog(tj. da sve koordinate budu
rotirane za ugao Alfa u odnosu na centar rotacije(xcor,ycor).
Pocetne koordinate svih tacaka nalaze se u fajlu podaci.dat,koji program
koristi.Sve koordinate su sigurno dobre,ali ja ne znam u cemu je problem.
HHHHEEEELLLPPP!!!!!!
Mansell
pascal.arjpascal.288ognjen,
Da li se pri ponovnom izvršavanju nekog programa u Pascalu stare
vrednosti promenjlivih ostaju iste izuzev ako nisu "resetovane" u
samom programu? Uf, ala sam ga zavukao... Dakle, da li se
prilikom rešavanja jednacine Z=1/2 * 2/3 *...* 99/100 dva puta
(dva puta se startuje program) dobija resenje 1/10000 umesto
1/100??? A, da, naravno, Z nije dobijalo nijednu određenu
vrednost, što znači da se jednačina ustvari rešavala _DVA_
puta...
pascal.289dejanr,
-> #288, ognjen>> Da li se pri ponovnom izvršavanju nekog programa u Pascalu stare
>> vrednosti promenjlivih ostaju iste izuzev ako nisu "resetovane" u
>> samom programu?
Ne znam da li sam dobro razumeo - ako recimo imaš program TEST.EXE,
startuješ ga, on nešto mulja i završi, ili ga prekineš, pa onda ponovo
startuješ TEST, vrednosti promenljivih naravno neće biti sačuvane,
izuzev ako je sam program preduzeo neko njihovo snimanje u datoteku
itd.
pascal.290zdule,
Zna li neko kako da izmerim vreme pisanja neke reči ili rečenice
od pritiska prvog tastera do pritiskanja enter-a?
ZDule...
pascal.291ognjen,
-> #289, dejanr)-> Ne znam da li sam dobro razumeo - ako recimo imaš program
)-> TEST.EXE, startuješ ga, on nešto mulja i završi, ili ga
)-> prekineš, pa onda ponovo startuješ TEST, vrednosti
)-> promenljivih naravno neće biti sačuvane, izuzev ako je sam
)-> program preduzeo neko njihovo snimanje u datoteku itd.
Da, to sam hteo da kažem... Ali vidi, kad sam startovao program:
-----------------------------------------------------------------
program Simple (input, output);
var z: real;
b,i: integer;
begin
b:=1;
i:=2;
z:=1/2;
repeat
begin
b:=b+1;
i:=i+1;
z:=z*(b/i);
end;
until b=100;
writeln (z);
writeln (1/10);
if z<1/10 then writeln ('Tacno!') else writeln ('Nije tacno!')
end.
-----------------------------------------------------------------
Koji bi, kao sto vidiš, trebao da izračuna vec pomenutu
jadnačinu, rešenje je bilo SVAKI PUT DRUGAžIJE (!?!) ! Kako je to
moguće? (Exponent se povećavao uvek za -2, što znači da se
dobijeni broj množio sa rešenjem jednačine 1/100, što znači da se
ista jednačina izračunavala više puta! (onoliko puta koliko sam
startovao program)).
pascal.292peca.st,
-> #291, ognjen!-> Koji bi, kao sto vidiš, trebao da
!-> izračuna vec pomenutu jadnačinu,
!-> rešenje je bilo SVAKI PUT DRUGAžIJE (!?!)
Ako si ga startovao iz editora onda je moguće.
Ako ga kompajliraš na disk, pa startuješ ga kao exe
(ono što je dejan napisao) onda se to ne može (hvala Bogu)
desiti.
Peđa.
pascal.293a.kircanski,
-> #290, zdule_-=> Zna li neko kako da izmerim vreme pisanja neke reči ili
_-=> rečenice od pritiska prvog tastera do pritiskanja enter-a?
Lako:
Kad ovaj pritisne prvo slovo(sa npr. keypressed proveravaš),
onda uzmeš vreme sa gettime. (ne znam tačno sintaksu, ali
ima nešto kao gettime. onda, kad lupi enter, uzmeš gettime
u drugu varijablu, i onda lepo uzmeš delta(sati) i delta(minuti) B-)
poz, sale.
pascal.294zdule,
-> #293, a.kircanski╠═══ Kad ovaj pritisne prvo slovo(sa npr. keypressed proveravaš),
Ma probao sam ja sa if keypressed then gettime() ali sam kao rezultat
dobio neke nebuloze od brojeva. :(((
ZDule...
pascal.295asterix,
Da li u MS FORTRAN-u 5.1 postoji ekvivalentna funkcija
koja vraća pritisnuti taster ? Odnoso da li se u FORTRAN-u
može napraviti sledeća struktura:
Program ... ;
uses crt;
Var c : char;
Begin
...
c:=Readkey <--- da li postoji ovakva konstrukcija u MSF5.1 ?
...
End.
Pozdrav Nenad :)
pascal.296maksa,
-> #295, asterix<><> Da li u MS FORTRAN-u 5.1 postoji ekvivalentna funkcija
<><> koja vraća pritisnuti taster ? Odnoso da li se u
<><> FORTRAN-u može napraviti sledeća struktura:
Ne znam je l' baš insistiraš na onome 5._1_ (u 5.0
definitivno ne postoji) a ako se ne pojavi neko ko
kaže da postoji, pomaže ti samo ovo:
Nađeš neku dobru dušu koja će ovo da ti izasemblira MASM-om:
(ja bih rado, al' nemam MASM)
PUBLIC GETCHR
GETCHR PROC FAR
PUSH BP
MOV AH, 08H
INT 21H
MOV BP, SP
LES BP, BP+6
XOR AH, AH
MOV ES:BX, AX
POP BP
RET 04H
GETCHR ENDPR
i ubažiš, to jest povežeš sa tvojim programom.
Koristilo bi se ovako nekako:
PROGRAM TASTPROBA
C--------------------------------- malo kozmetike :)
INTERFACE TO INTEGER*2 GETCHR(M)
INTEGER*2 M
END
C
INTEGER*2 N
WRITE(*,*) 'Pritisni nesto, sa Ctrl-C zavrsavas'
10 CONTINUE
CALL GETCHR (N)
WRITE(*,*) 'Nagazio si taster ',N,' '
GO TO 10
END
Znam, znam, strašno. :( Sve ovo da bi dobio kôd jednog
bezveznog tastera.
pascal.300andrejt,
Kako da otvorim fajl za upis/citanje u TSR-u.I, usput kako da proverim tastere
(sve sem onih koji mogu da se provere prekidom $16), takodje u TSR-u.
pascal.301ognjen,
-> #292, peca.st)-> Ako si ga startovao iz editora onda je moguće.
)-> Ako ga kompajliraš na disk, pa startuješ ga kao exe
)-> (ono što je dejan napisao) onda se to ne može (hvala Bogu)
)-> desiti.
Kako da sredim da mi iz editora daje istu vrednost...?
pascal.302janko,
-> #294, zdule> Ma probao sam ja sa if keypressed then gettime() ali sam
> kao rezultat dobio neke nebuloze od brojeva. :(((
Najlakše je da napišeš svoju rutinu za input.
pascal.303a.kircanski,
Kako da pročitam sadržaj FAT-a? Ili da ga uništim.
Prilog u ASMu je dobrodošao, također :-)
poz, sale.
pascal.304bulaja,
-> #303, a.kircanski│Kako da procitam sadrzaj FAT-a? Ili da ga unistim.
└───
Najbolje za strukturu FAT-a, Boot sektora i slicnih stvari pogledaj neki
od fajlova u INFO direktorijumu, npr. DosRef, HelpPC, TechRef i slicno.
Ukratko, FAT obicno pocinje na prvom logickom sektoru (pise u boot
sektoru gde tacno pocinje), citas ga funkcijama za absolut disk read (ne
znam koja je f() u TP za to, ali imas i INT 25h). Dakle najbolje
pogledaj opise strukture u tim INFO fajlovima, ako negde zapne pitaj :).
pascal.305bole,
-> #293, a.kircanski>> Kad ovaj pritisne prvo slovo(sa npr. keypressed proveravas),
>> onda uzmes vreme sa gettime. (ne znam tacno sintaksu, ali
>> ima nesto kao gettime. onda, kad lupi enter, uzmes gettime
Prosto napravis 8 wordova i 4 (ili 3 zavisno od preciznosti koja ti treba)
integera pa das:
GetTime (Hour, Min, Sec, Sec100);
Pa posle
gettime (hour2, min2, sec2,sec1002)
pa das
integer1:=hour2-hour ....pa prebacujes do 60 je jedan pa....
pascal.306dr.grba,
Imam mladog druga, srednjoškolca, prilično zagrejanog za neke napredne
tehnike u programiranju. Već je prilično verziran u Turbo Pascalu, a ja
mu dođem nešto poput podstrekača, jer mu ponekad postavljam neke probleme
na razmišljanje. Iz svega toga - pre ili kasnije - treba da se izrodi i
korist, moja jer ću doći do nekog alatićA po narudžbi, a njegova jer će
nešto da nauči i to upotrebi u budućnosti...
Postavio sam mu problem u kome se još nije snašao: editovanje .EXE fajla,
pisanog u Pascalu ili čak u nepoznatom razvojnom okruženju. I to sve u dva
smera: sa jedne tačke kako pronaći neki deo koda i izmeniti mu neki if()
uslov, a sa druge strane kako postaviti nove default vrednosti "zamrzavanjem"
opcija datim na komandnoj liniji. Nešto, dakle, poput novih defaulta u
programu FDS, viđenom na Sezamu.
Stoga vas molim da ovde ili u mail na moje ime ostavite neku korisnu
referencu, savet ili primer. Zahvaljujem se unapred na pomoći bilo koje vrste.
pascal.307dejanr,
-> #306, dr.grba>> sa jedne tačke kako pronaći neki deo koda i izmeniti mu neki if()
>> uslov...
Ovo bi i mene zanimalo.
>> a sa druge strane kako postaviti nove default vrednosti
Nije poseban problem - pre neki dan baš to napravih u Prvoj Srpskoj
Elektronskoj Kihalici (IBMPC\FUN\KIHALICA.ZIP). Staviš neki karakterističan
string u program (npr. const default: string[12]:='TRALALA#$XXX'), onda
otvoriš EXE fajl kao i svaki drugi (imaš ime u PARAMSTR(0)), nađeš string
TRALALA#$$ i umesto XXX upišeš novu vrednost. Nije baš u duhu "čistog i
kulturnog" programiranja, ali radi posao :)
Mislim da je zzivotic pisao o ovome pre par meseci u "Računarima".