cccc.103mtadic,
-> #97, gww.Ljubo, jedan komentar na tvoj programčić:
pošto trenutno nemam ni jedan C instaliran ;) ne mogu da proverim šta tvoj pgm
proizvodi (pretpostavljam, niz *rastućih* brojeva ?), ali šta god da dobiješ na
ekranu (pa čak i "mešane" tj. neuređene brojeve) - u redu je. U C-u ti niko ne
garantuje izvršavanje operacija s-leva-u-desno osim u slučaju comma operatora.
Zarezi u pozivu funkcije *nisu* comma operatori, pa bi proizvoljan rezultat
izvršavanja tvog pgm-a bio moguć (i dozvoljen) bez obzira na redosled
prosleđivanja parametara.
Ciao, Milančica
cccc.104ppekovic,
-> #99, rlazic>>Pošto imam dosta iskustva u radu sa pomenutim kompajlerom (ceo
>>školski raspust sam proveo s njim)
Uh, kako je to "imam dosta iskustva ..." relativno. Ali
ipak mislim da se "iskustvo" ne može steći za 15 dana, pa makar i
24h rada sa nekim kompajler-om, pa bio to i TC ++. No, mišljenja su
različita, ja samo iznosim svoje.
>>Editor ima (za sada) jedan odvratan bag. Naime, kada "legnem" na
>>neki kursorski taster, često se dešava da mi editor ubaci po neku
>>dvojku, osmicu ili nešto slično (odgovarajući brojevi na numeričkoj
>>tastaturi) u program, što je VRLO neprijatno. Zaista ne znam šta
>>je u pitanju, jer mi se ni u jednom drugom programu ne dešava ništa
>>slično.
Nije to bug editor-a već verovatno tvoje tastature ili
nekih rezidentnih programa vezanih za tastaturu. Meni su se pre
izvesnog vremena pojavili takvi problemi. Rešenje je bilo u zameni
jednog rezidentnog programa odgovarajućim.
>>Moram da priznam da sam se dobro namučio sa run-time greškom Null
>>pointer assignment, koja se javlja na kraju izvršavanja programa.
Za ovo nemoj da tražiš grešku kompajleru nego sebi. Ovo je
tipična greška koja se javlja u prvim programerskim koracima u C-u
i to ne samo kod TC ++ nego i kod ostalih compiler-a.
>>Naravno, to je i
>>dalje daleeekooo u odnosu na MSC 6.00 :))).
Pa sigurno, za ozbiljne stvari je uvek trebalo malo više
vremena ;)
>>Što se tiče C++ programiranja, Turbo C++ predstavlja praktično jedini
>>izbor (ostaje još Zortech C++, koji nisam imao prilike da vidim,
>>ali smatram da nije ništa posebno).
A kako to smatraš da nije ništa posebno kad ga nisi ni
video ????!!!!! ;))))))))))))))))))))))))
>>Takođe, na ovom mestu bih da poručim Vladi Kostiću da nije u pravu
>>(po mom pišljenju, naravno) kad kaže (u nekoj od ranijih poruka,
>>ne sećam se tačno broja) da ništa ozbiljnije *ne može* da se radi
>>bez DOS/BIOS poziva. Verovatno se nas dvojica bavimo pisanjem različitih
>>tipova programa, ali ipak nije u redu iznositi takve tvrdnje. Vlado,
>>nemoj ovo pogrešno da shvatiš, ali meni pri pisanju već pomenutog
>>programa (simulator paralelnog procesiranja i interpreter jednog
>>paralelnog jezika), kog ja smatram za ozbiljniji (ako ti nešto znači,
>>source ima oko 75kB i oko 2500 linija), ni jednom nije zatrebalo
>>da direktno pozovem DOS ili BIOS, izuzimajući izključivanje kursora
>>(to je zaista smešno i trivijalno).
Svaki program se može napisati na xxxxxx različitih načina.
Jedan je bolji, drugi lošiji. Svi oni rešavaju problem ali na
različite načine, različitim brzinama, komforom, pouzdanošću. Vlada
je, koliko znam Vladu, govorio o najboljem načinu, a i po mom
mišljenju, najbolje jedino vredi pominjati.
BTW, za tvoju informaciju, simulator paralelnog
procesiranja, kao i odgovarajući kompajler!!! a ne interpreter već
postoji.
Paya
cccc.105rlazic,
-> #101, alexaSlična stvar je i meni pala na pamet (da exit poziva destruktore),
ali sam se ubrzo razuverio. Kada step-ujem preko delete operatora sve
je u redu, tj. Turbo C++ pre dealokacije memorije koji zauzima
primerak klase prvo pozove destruktore (bilo standardne, bilo one
koje sam ja definisao) za svaki član klase posebno - mogu lepo da
step-ujem kroz njih i tačno vidim šta se dešava.
Zbog toga jednostavno otpada tvoja pomisao da sam "pobrkao" redosled
pozivanja destruktora - oni se uvek pozivaju istim redosledom, ako se
radi o "brisanju" jednog objekta. Takođe, predvideo sam situaciju u
kojoj treba da se obriše više objekata redom koji ja ne zadajem (na
kraju programa, na primer), pa sam u svim destruktorima vodio računa
o mogućnosti da je neki član klase već dealociran.
Na bag funkcije exit, pored kontrolisanja sadržaja prvih stotinjak
lokacija data segmenta (koji se ne menja od početka programa, pa sve
do poziva exit-a), ukazuje i činjenica da _exit u istoj situaciji ne
prijavljuje nikakvu grešku. Pošto se memorija i ovako i onako mora
dealocirati, VRLO je nelogično da exit i _exit to rade na različite
načine. Pošto u uputstvu stvarno *ništa* ne piše o tome i pošto
kompajler ne step-uje kroz destruktore pri pozivu exit-a, moguće je
da se memorija dealocira jednostavnim pozivanjem DOS-a za svaki
alocirani blok memorije.
Takođe, funkcije exit i _exit se potpuno isto (korektno) ponašaju
kada se neka od početnih lokacija data segmenta promeni - obe ispišu
Null pointer assignment. Znači da _exit ne preskače taj test. U
uputstvu piše da je razlika između exit i _exit ta što exit, osim
izlaska u DOS i vraćanja ERRORLEVEL-a, zatvara sve otvorene fajlove,
ispisuje tekst zaostao u baferu i poziva "exit funkcije", tj.
funkcije čije je pozivanje po izlasku programer eksplicitno zadao.
(Dealokacija memorije se *nigde* ne pominje.)
Zbog svega navedenog, ja i dalje pomišljam da je u pitanju (na
žalost) bag exit funkcije. Naravno, ne isključujem ni mogućnost svoje
greške, pa ako imate još neku ideju, napišite!
S poštovanjem, Ranko Lazić
cccc.106rlazic,
-> #102, gww.Što se tiče funkcija s promenljivim brojem argumenata, slažem se s
tobom u konstataciji da način guranja argumenata na stek nema previše
uticaja. Možda se njihovo skidanje u pozvanoj funkciji relativno
olakšava, ali bi se i pri obrnutom guranju argumenata stvar mogla
sasvim lepo rešiti "dobacivanjem" broja prenetih argumenata.
Takođe, potpuno si u pravu kad kažeš da ovakav način pozivanja
funkcija "skida odgovornost" sa pozivajuće funkcije i sve prepušta
onoj čiji se poziv vrši. Na taj način se, recimo, omogućava
generisanje korektnog .OBJ koda i pored toga što mnoge funkcije još
nisu definisane.
Dalje, tačno je da ovakav način pozivanja može doći u suprotnost sa
zdravom logikom (kao u navedenom programu), ali je i dalje sve O.K.,
jer u stvari sve radi kako je predviđeno i propisano.
Pozdrav, Ranko Lazić
cccc.107rlazic,
-> #103, mtadicProgram zaista daje kao rezultat niz rastućih brojeva, što je i
logično. Ali, moram da ti kažem da nisi u pravu kad kažeš da bi sve
bilo O.K. u slučaju ispisivanja neuređenog niza brojeva. Naime, to
nema *nikakve* veze sa comma operatorom i sve je u potpunosti
određeno i definisano - argumenti se na stek guraju zdesna nalevo i
tim redom se i "izvršavaju", tj. računaju se odgovarajući izrazi.
Pozdrav, Ranko Lazić
cccc.108rlazic,
-> #104, ppekovic>> Uh, kako je to "imam dosta iskustva ..." relativno. Ali ipak
>> mislim da se "iskustvo" ne može steći za 15 dana, pa makar i 24h
>> rada sa nekim kompajler-om, pa bio to i TC ++. No, mišljenja su
>> različita, ja samo iznosim svoje.
S obzirom da sam pročitao dosadašnje poruke u temi cccc, zaključio
sam da se niko nije ni dotakao Turbo C++-a (osim malo Vlada, ali je
samo testirao brzinu), kao što sam i napisao, pa sam za shodno
smatrao da mojim poštovanim sagovornicima prenesem svoja iskustva pri
radu s tim kompajlerom. To da ga imam dosta je veoma relativno - ono
se u toku rada neprestano povećava. Ne znam zašto te je navedena
rečenica toliko pogodila?
>> Nije to bug editor-a već verovatno tvoje tastature ili nekih
>> rezidentnih programa vezanih za tastaturu. Meni su se pre izvesnog
>> vremena pojavili takvi problemi. Rešenje je bilo u zameni jednog
>> rezidentnog programa odgovarajućim.
Pa lepo sam napisao da je prilično moguće da je za sve kriv
ncc/fastkey (nisam još probao da ga skinem). Ali, pošto se to stvarno
ne javlja *ni u jednom drugom programu*, uključujući Turbo C 2.00, ja
to i dalje smatram Turbo C++-ovim bagom (moguće je da je Borland
pravio neke perverzije oko skeniranja tastature).
>> Za ovo nemoj da tražiš grešku kompajleru nego sebi. Ovo je tipična
>> greška koja se javlja u prvim programerskim koracima u C-u i to ne
>> samo kod TC ++ nego i kod ostalih compiler-a.
U ispravnost svog programa (po pitanju Null pointer asignment-a) sam
99.99% siguran (onaj 0.01% uvek ostaje), jer sam zaista žestoko
kontrolisao prvih stotinjak lokacija za svo vreme izvršavanja
programa, kao što sam i napisao. Ne znam odakle ti ideja da ja pravim
"prve programerske korake u C-u". Kako si to zaključio i s kim me to
porediš? Sa sobom? Odakle ti takva samozaljubljenost i samouverenost?
>> Pa sigurno, za ozbiljne stvari je uvek trebalo malo više vremena ;))
Šta? MSC 6.00 je "ozbiljniji" kompajler od Turbo C++-a? Trt!
>> A kako to smatraš da nije ništa posebno kad ga nisi ni video
>> ????!!!!! ;))))))))))))))))))))))))
To sam zaključio iz programerskih časopisa u kojima se o njemu
*relativno* malo piše.
>> Svaki program se može napisati na xxxxxx različitih načina. Jedan
>> je bolji, drugi lošiji. Svi oni rešavaju problem ali na različite
>> načine, različitim brzinama, komforom, pouzdanošću. Vlada je, koliko
>> znam Vladu, govorio o najboljem načinu, a i po mom mišljenju,
>> najbolje jedino vredi pominjati.
Najbolji način za pisanje efikasnih, brzih, komfornih i pouzdanih
(tj. profesionalnih u pravom smislu) programa su direktni DOS i BIOS
pozivi, a? Ha, ha, ha, ha, ha, ...
>> BTW, za tvoju informaciju, simulator paralelnog procesiranja, kao
>> i odgovarajući kompajler!!! a ne interpreter već postoji.
Iz ovoga što si napisao zaključujem da si *totalni* nepoznavalac
navedene oblasti. Zato bolje ćuti, uči i ne maltretiraj druge svojim
razbacivanjem. BTW, o svom znanju u pomenutoj oblasti uopšte nemam
previsoko mišljenje. Što se tebe tiče, izgleda da pripadaš grupi
ljudi za koje važi: ne zna koliko ne zna (bar za ovu oblast).
P.S. Čoveče, odakle ti tolika zloba i sujeta? Meni se čini da mi ovde
treba da sarađujemo i delimo iskustva, a ne da blatimo jedni druge.
Drugarski pozdrav, Ranko Lazić
cccc.109kale,
-> #103, mtadic
>> U C-u ti niko ne garantuje izvršavanje operacija s-leva-u-desno osim
>> u slučaju comma operatora.
ANSI standard garantuje izvođenje logičkih "i" i "ili" operacija
u "if" naredbi sleva nadesno, i da neće biti izvršeno više operacija
nego što je neophodno da se izračuna rezultat testa.
Pozdrav, Kale
cccc.110ppekovic,
-> #108, rlazic>> Ne znam zašto te je navedena
>>rečenica toliko pogodila?
Veliko iskustvo=15 dana rada sa kompajlerom????!!!!
Veliko iskustvo sa C kompajlerima ima samo nekoliko ljudi
na Sezamu!!!
Iskustvo se ne stiče zezanjem i pisanjem malih rutinica na
C-u već pravljenjem ozbiljnih aplikacija koje imaju praktičnu
primenu. Programi za paralelno procesiranje i pomenuti interpreter
se sigurno nemogu napraviti za tih 15 dana.
>>Ali, pošto se to stvarno
>>ne javlja *ni u jednom drugom programu*, uključujući Turbo C 2.00,
>>ja to i dalje smatram Turbo C++-ovim bagom (moguće je da je Borland
>>pravio neke perverzije oko skeniranja tastature).
Što Njegoš u Gorskom vijencu reče:
"Tvrd je orah voćka čudnovata,
ne slomi ga al zube polomi..."
>>U ispravnost svog programa (po pitanju Null pointer asignment-a)
>>sam 99.99% siguran (onaj 0.01% uvek ostaje), jer sam zaista žestoko
>>kontrolisao prvih stotinjak lokacija za svo vreme izvršavanja
>>programa, kao što sam i napisao. Ne znam odakle ti ideja da ja pravim
>>"prve programerske korake u C-u". Kako si to zaključio i s kim me
>>to porediš? Sa sobom? Odakle ti takva samozaljubljenost i samouverenost?
Jednog dana, kad ti Null pointer assignment poruka nestane,
zapitaj se šta si promenio u svom programu. Sorry, ako ti nestane...
Slučajno imam malo više iskustva od onih 15 dana u C-u, i mogu ti
reći da sam tu grešku video xxxxx puta i svaki put je bila moja
greška i ni jedan moj završeni program to nema. Izvini mi se jednog
dana.
A sa kime ti SEBE porediš. Posle Vlade Kostića, TI ćeš da
nam daješ zaključke o Turbo C-u!!!
>>To sam zaključio iz programerskih časopisa u kojima se o njemu
>>*relativno* malo piše.
A iz kog časopisa? Čitajući neke naše računarske časopise,
mogao sam saznati da je Turbo pascal 6.0 najbolji kompajler za PC-a
i da bi svi trebalo da pređemo na njega. A još ako je objektno
orijentisan!!!! aiiiiiii (ovo se ne odnosi na tebe).
>>Najbolji način za pisanje efikasnih, brzih, komfornih i pouzdanih
>>(tj. profesionalnih u pravom smislu) programa su direktni DOS i
>>BIOS pozivi, a? Ha, ha, ha, ha, ha, ...
Imam za tebe jedan sjajan programski jezik. Jesi čuo za
LOGO?
>>Iz ovoga što si napisao zaključujem da si *totalni* nepoznavalac
>>navedene oblasti. Zato bolje ćuti, uči i ne maltretiraj druge svojim
>>razbacivanjem. BTW, o svom znanju u pomenutoj oblasti uopšte nemam
>>previsoko mišljenje. Što se tebe tiče, izgleda da pripadaš grupi
>>ljudi za koje važi: ne zna koliko ne zna (bar za ovu oblast).
>>P.S. Čoveče, odakle ti tolika zloba i sujeta? Meni se čini da mi
>>ovde treba da sarađujemo i delimo iskustva, a ne da blatimo jedni
>>druge.
Kada budeš malo porastao, pa budem mogao da te povedem sa
sobom, a da te čika na ulazu ne zaustavi jer nemaš LK, onda javi pa
da te odvedem i da ti pokažem kako to radi.
I na kraju, NE BUDI BEZOBRAZAN, i smanji malo ton, pogotovu
kad se obraćaš nekom ko je, pa makar za 1 dan, stariji od tebe. Al
pri ovom ne mislim samo na godine!!!
Paya
cccc.111rlazic,
-> #110, ppekovic>> Veliko iskustvo=15 dana rada sa kompajlerom????!!!! Veliko
>> iskustvo sa C kompajlerima ima samo nekoliko ljudi na Sezamu!!!
>> Iskustvo se ne stiče zezanjem i pisanjem malih rutinica na C-u već
>> pravljenjem ozbiljnih aplikacija koje imaju praktičnu primenu.
>> Programi za paralelno procesiranje i pomenuti interpreter se sigurno
>> nemogu napraviti za tih 15 dana.
Prvo, ja sam rekao da imam dosta iskustva (a ne *veliko* iskustvo,
što je bitna razlika) pri radu sa Turbo C++-om, kao i zašto sam to
napisao. Drugo, ne znam kako ti to "napamet" zaključuješ da veliko
iskustvo pri radu sa C kompajlerima ima samo nekoliko ljudi na
Sezamu? Treće, kako si došao do zaključka da ja pišem "male
rutinice"? Možda ti za "ozbilje aplikacije koje imaju praktičnu
primenu" (uf, uf ;) - da i ja malo počnem da koristim ;) smatraš
programe za prenos podataka sa Amstrada na PC-ja, drajvere za
tastaturu (Vlado, ja te cenim kao programera i uopšte ne ciljam na
tebe) i sl. Ja bih rekao da su to obična i bezvredna (osim što rade
posao) *hakerisanja*. Četvrto, kako ti znaš da li se simulator
paralelnog procesiranja ne može napisati za 15 dana - ja smatram da
je to posao od 10-ak čovek/dana, ako se prethodno o svemu raščisti i
sve do kraja isplanira. Inače, slažem se da ni mesec dana stalnog
rada nije dovoljno ako se kao haker "bane" za tastaturu i krene s
kucanjem main funkcije.
>> Što Njegoš u Gorskom vijencu reče:
>> "Tvrd je orah voćka čudnovata,
>> ne slomi ga al zube polomi..."
Ko bi ovde trebalo da bude Crna Gora, a ko Turska?
>> Jednog dana, kad ti Null pointer assignment poruka nestane,
>> zapitaj se šta si promenio u svom programu. Sorry, ako ti nestane...
>> Slučajno imam malo više iskustva od onih 15 dana u C-u, i mogu ti
>> reći da sam tu grešku video xxxxx puta i svaki put je bila moja
>> greška i ni jedan moj završeni program to nema. Izvini mi se jednog
>> dana.
Ti izgleda nisi pročitao moj odgovor poštovanom Alexi u kome sam
prilično precizno objasnio celu stvar.
Kako ja to imam 15 dana iskustva u C-u, kad u C-u (u zadnje vreme u
C++-u) radim od sredine 1989. godine? Kako si sad to zaključio? Ja
sam rekao da imam 15 dana intenzivnog rada iskustva sa Turbo C++-om
(uključujući još par meseci "fakultativnog"), a ne 15 dana iskustva u
programiranju u C-u (daleko od toga).
>> A sa kime ti SEBE porediš. Posle Vlade Kostića, TI ćeš da nam
>> daješ zaključke o Turbo C-u!!!
Jel' si se ti to zaljubio u Vladu Kostića, pa mi stalno izbijaš oči s
njim? Što se mene tiče, navešću ti s kim se sve poredim: sa autorima
programerskih tekstova u *našim* časopisima (tj. sa znanjem koje
iznose u njima), sa saradnicima (na polju programiranja) i ljudima iz
redakcije Sveta kompjutera (gde si ti malo "provirio"), sa
predavačima i saradnicima u Istraživačkoj stanici Petnica, sa
sadržajem postdiplomskih predavanja cenjenog profesora Dr Prešića u
Matematičkom institutu u Srpskoj akademiji nauka i umetnosti, ...
Ako želiš još "prepucavanja" na ovu temu, nemoj ponovo da odgovoriš
pitanjem i smanji frekventnost znakova ! u svojim porukama. Iz
(između ostalog) onoga što si napisao u konferenciji forum (tema
devojke), dalo bi se zaključiti da je tvoj domet toliko pominjani
Klub programera.
>> A iz kog časopisa? Čitajući neke naše računarske časopise, mogao
>> sam saznati da je Turbo pascal 6.0 najbolji kompajler za PC-a i da
>> bi svi trebalo da pređemo na njega. A još ako je objektno
>> orijentisan!!!! aiiiiiii (ovo se ne odnosi na tebe).
Rekao sam iz programerskih časopisa, što AUTOMATSKI isključuje "neke"
(rekao bih SVE) naše računarske časopise, koji se svode na reklame i
prikaze hardvera i softvera. Što se tiče postavljenog pitanja, reč je
o časopisima Program Now, Programming Languages i IEEE.
>> Imam za tebe jedan sjajan programski jezik. Jesi čuo za LOGO?
Za Logo ne samo da sam čuo, nego ga i znam. Jezik je lep i sasvim
zgodan za ono za šta je namenjen (crtuckanje i dečja zabava). Imam i
ja jedan SAVRŠEN programski jezik za tebe: 6502 asembler.
>> Kada budeš malo porastao, pa budem mogao da te povedem sa sobom, a
>> da te čika na ulazu ne zaustavi jer nemaš LK, onda javi pa da te
>> odvedem i da ti pokažem kako to radi. I na kraju, NE BUDI BEZOBRAZAN,
>> i smanji malo ton, pogotovu kad se obraćaš nekom ko je, pa makar za 1
>> dan, stariji od tebe. Al pri ovom ne mislim samo na godine!!!
Zašto stalno potenciraš razliku u godinama između tebe i mene i
forsiraš Vladu? Jel' su ti to dva jedina argumenta za toliko
razbacivanje? Šta ćeš da mi pokažeš "kako radi"? Neki program o kome
nemaš pojma ni ko je ni šta je ni šta radi, a neko te napalio na
njega? Što se mene tiče, uopšte nisam bezobrazan (šta će ti opet
gomila znakova ! - šta to tako burno doživljavaš?) - čak se divim
sebi što odavno nisam rekao: "Ma, pusti ga da balavi". Na šta još
misliš sem na godine i zašto bih ja trebalo da imam poštovanja prema
starijima koji pokazuju da nisu dostigli očekivani stepen svesnosti i
samokontrole, kao i da pate od kompleksa više vrednosti.
P.S. Zaista mi je žao što se ovako "koljemo", ali ipak ne bih hteo da
nastaviš da se razbacuješ neosnovanim tvrdnjama.
Drugarski (nije ironično) pozdrav, Ranko Lazić
cccc.112ppekovic,
-> #111, rlazic>>Što se mene tiče, navešću ti s kim se sve poredim: sa autorima
>>programerskih tekstova u *našim* časopisima (tj. sa znanjem koje
>>iznose u njima), sa saradnicima (na polju programiranja) i ljudima
>>iz redakcije Sveta kompjutera (gde si ti malo "provirio"), sa
>>predavačima i saradnicima u Istraživačkoj stanici Petnica, sa
>>sadržajem postdiplomskih predavanja cenjenog profesora Dr Prešića
>>u Matematičkom institutu u Srpskoj akademiji nauka i umetnosti,
>>...
Vidiš dečko, kad porasteš, kazaće ti se samo zašto sam ti
sasvim lepo i bez uvreda u prvom reply-u skrenuo pažnju da se ne
izlećeš baš toliko da svi odmah vide koliko imaš godina.
Paya
cccc.113gww.,
Dakle i ja koristim TC++ ali ne koristim IDE. Koristim samo TCC, TLINK i
TLIB. Dve stvari mi smetaju a mislim da sam ih pomenuo ovde. Kod separatnog
kompajliranja i linkovanja sa debug informacijama TLINK 3.0 se nepovratno
zakuca (to bih voleo da neko vidi šta je sa tim). Druga stvar je da mi se
učinilo nepouzdanim bilo koji switch TCC-a koji se odnosi na EMS/XMS (nešto
nije radilo, ne koristim više, a nisam ni tražio šta je, nemam vremena).
Što se tiče C++ kao jezika lepo je kao ekstenzija (nisam probao) tako da
C++ koristim kao C kompajler. Prekompajlirao sam sve biblioteke i
zadovoljan sam (ima svačega osim teške matematike). Radi sve što imam,
jedino je brzina kompajliranja blago opala (što je razumljivo). Debugger
(TD 2.0) hoće da se zakuca čim uključim EMS a program veliki (nije EMS
prostor u pitanju, možda je u pitanju moj EMS u šta prilično sumnjam) ali
varijanta TD286 (XMS) lepo radi zasad nisam imao problema jedino što ona
malo sporije radi (što je takodje logično) a i zauzima vrlo malo mesta u
osnovnoj memoriji .
cccc.114gww.,
-> #109, kaleDa li se garantuje i izvršavanje funkcija (u parametrima) s desna na levo
u ANSI standardu ?
Ako se ne garantuje znači treba drugačije pisati portabilne C programe.
O.K. Za if() nisam znao, ali to mi se dopada i logično je.
cccc.115gww.,
-> #110, ppekovicppekovic i rlazic, molim vas kao i sve ostale da unesete malo kolegijalnog
ponašanja u diskusije. Ocenjivanje tudjeg kvaliteta nikad nije zahvalna
rabota. Ispravljanje zabluda jeste korisno, ali uvek se može staloženo i
argumentovano odbraniti svoj stav, ali i prihvatiti tudje mišljenje ako se
čovek nadje u zabludi. Ja znam da smo svi mi (pa i ja) manje više sujetni
kada je poznavanje ove oblasti u pitanju (računari, programiranje), ali
ovde smo pre svega da se medjusobno pomažemo, više očiju više vidi.
cccc.116alexa,
-> #114, gww.Mislim da if() nije u pitanju, već izrazi koji sadrže logički and i
or (da ne isključujem sada YUSCII zbog or-a :)
cccc.117alexa,
Povodom argumenata u C-u, gde me je gww. 'ispreskakao':
istina je da se mogu gurati na stek i u obrnutom redosledu (tj.
prvo levi) ali se mora posebno dati i podatak o tome gde se nalazi
prvi argument (valjda se zato takav način nigde i ne koristi - ili
ga bar ja nisam video). Inače, u C-u se argumenti moraju prenositi
preko steka - po definiciji.
cccc.118mtadic,
-> #107, rlazic>to nema *nikakve* veze sa comma operatorom i sve je u potpunosti
>određeno i definisano - argumenti se na stek guraju zdesna nalevo i
>tim redom se i "izvršavaju", tj. računaju se odgovarajući izrazi.
neeee, nisi shvatio. Da ti pojasnim: bez obzira na redosled guranja parametara
na stek, tebi još uvek niko ne garantuje da će i funkcije biti izračunate istim
redosledom!! Redosled izračunavanja je *potpuno* proizvoljan osim u slučajevima
comma operatora i u logičkim izrazima (*ne* u if-u, nego u logičkim izrazima,
što je širi skup situacija). Za verodostojnost ove tvrdnje možeš da
konsultuješ:
B.W. Kernighan and D.M. Ritchie The C Programming Language
preciznije Chapter 2.12 "Precedence and Order of Evaluation". Malo šale za
kraj: u mom izdanju to je strana 50 (tj vrlo blizu *početka* knjige ;)
Pozdrav, Milan
cccc.119gww.,
-> #117, alexa"prvo levi) ali se mora posebno dati i podatak o tome gde se nalazi
"prvi argument (valjda se zato takav način nigde i ne koristi - ili
da, to je bio "najlabaviji" deo mog dokaza. Da se toga nisam setio ubedio
bi me. Ali podsetiću na jednu sitnicu. Prilikom svih sistemskih poziva na
PC-u nešto se mora tutnuti u registar. Ne poznajem PC-jev asembler
dovoljno ali čim se "upadne" u neku funkciju izvršava se nešto poput:
MOV BP,SP
Ta instrukcija može lepo da se izvuče "ispred zagrade" pa da se ne
izvršava u pozvanoj funkciji već van nje. Time je praktično i markiran
prvi argument.
cccc.120gww.,
-> #118, mtadicpretpostavimo da imamo 3 funkcije F1, F2, i F3. Koje se MORAJU pozivati
baš u tom redosledu (1,2,3). kod izraza:
a=F1()+F2()+F3();
niko naravno ne može garantovati koju će optimizator koda uzeti prvo u
obradu, ali kod parametara je stvar drugačija, pretpostavimo da postoji F4
koja koristi kao prametre rezultate ovih triju funkcija, pitanje glasi da
li je potrabilna (sa C-a na C) sledeća programska linija:
d=F4(F3(),F2(),F1());
ili se mora pisati:
a=F1(); b=F1(); c=F1(); d=F4(a,b,c);
cccc.123alexa,
-> #120, gww.Mislim da nigde ne piše da se argumenti izračunavaju onim redosledom
kojim se guraju na stek. Međutim, ovo je manje-više akademsko
pitanje,
jer svi današnji kompajleri prevode C source u neki međukod, koji je
dosta primitivan, i liči na mašinski jezik nekog virtuelnog procesora
(kasnije se ovaj međukod prevodi u mašinski kod).
Zbog toga je vrlo verovatno da će se argumenti izračunavati u
redosledu
u kojem se smeštaju na stek, i da je ovaj redosled zdesna ulevo.
(Istina, oni bi mogli biti postavljeni na stek u
uobičajenom redosledu, a da se na njega stavljaju obrnutim
redosledom,
naravno ne pomoću naredbi push).
cccc.124alexa,
-> #119, gww.> MOV BP,SP
>Ta instrukcija može lepo da se izvuče "ispred zagrade" pa da se ne
>izvršava u pozvanoj funkciji već van nje. Time je praktično i
markiran
>prvi argument.
Jeste, ali BP ne služi samo za markiranje prvog argumenta (uostalom,
on i
ne pokazuje direktno na njega). U odnosu na njega se određuje i mesto
automatskih varijabli na steku. Znači, morao bi da odvojiš novi
registar
za tu svrhu.
U stvari, BP se (čak i u Intelo-voj dokumentaciji) povremeno naziva
frame pointer-om; stek se ne posmatra kao klasičan procesorski
stek reči fiksne dužine, nego kao stek 'okvira' - blokova koji se
pridružuju procedurama u toku izvršavanja. U 'okvirima' se nalazi
radni prostor, koji služi za smeštanje automatskih promenljivih,
i za smeštanje argumenata pri pozivu nove procedure. Na početku
izvršavanja svake procedure, ona (na PCju) u BP registru čuva
pointer na 'okvir' pozivajuće procedure, a zatim zauzima za sebe novi
'okvir' na klasičnom steku. Pri ovome joj BP služi i kao referenca na
sopstveni 'okvir'. Na 286 i 386 procesorima postoji i instrukcija
ENTER, koja sve to sama uradi.
Jedna familija računara (Honeywell 6-ice) ima mašinsku instrukciju
ACQ (acquire stack frame), koja omogućava realizaciju 'steka' kao
ulančane liste 'okvira', pri čemu ovi 'okviri' nisu smešteni
jedan do drugog u memoriji.
cccc.125kanda,
-> #120, gww.
>>koja koristi kao prametre rezultate ovih triju funkcija, pitanje glasi da
>>li je potrabilna (sa C-a na C) sledeća programska linija:
>>
>> d=F4(F3(),F2(),F1());
>>
>>ili se mora pisati:
>>
>> a=F1(); b=F1(); c=F1(); d=F4(a,b,c);
Neko je to ovde već pominjao : u K&R II izd., str. 202 piše :
"The order of evaluation of arguments is unspecified; take note
that various compiler differ."
Dakle ako je redosled pozivanja ovih funkcija nebitan, može se
koristiti i gornji i donji metod; ali ako je redosled bitan, tj. npr.
izvršavanje F1() utiče na rezultat koji vraća F3(), mora da se radi kao u
donjem primeru
Tako i za ono printf( "%d %d %d", i++, --i, i ), ANSI C
ti ne garantuje šta ćeš dobiti. Baš tu skoro sam radio nešto na PC
sa TC2.0, i upravo zbog ovakvog jednog printfa sam #*!& osedeo. Inače
cenim da je ovo jedan od poganijih razloga da program ne radi.
I još, kod binarnih operatora nije definisano (ima izuzetaka,
recimo && i ||) kojim redom se izračunavaju operandi, tj. da li prvo
levi pa desni ili obratno. Baš u K&R II ( str. 77 ) ima primer poziva
push( pop() - pop() ). Recimo da je pop() takva funkcija, da kad je
prvi put pozoveš vrati 3, a drugi put 5. Niko ne garantuje da li će
onaj izraz biti evaluiran kao push( 3 - 5 ) ili push( 5 - 3 ), tj.
da li je pop()-pop() -2 ili 2 :O
cccc.126gww.,
-> #124, alexaAha, pa su parametri "ispod" BP a auto varibaile "iznad" ako sam dobro
shvatio. Lepo i jednostavno.
cccc.127gww.,
-> #125, kandaO.K. treba da se zna!
cccc.128rlazic,
-> #112, ppekovic>> Vidiš dečko, kad porasteš, kazaće ti se samo zašto sam ti sasvim
>> lepo i bez uvreda u prvom reply-u skrenuo pažnju da se ne izlećeš baš
>> toliko da svi odmah vide koliko imaš godina.
Dobro, pošto vidim da ti je jedini argument delta godine, smatram da
je ova "rasprava" završena. A to da si u prvom reply-u istupio lepo i
bez uvreda, ne bih baš rekao.
Drugarski pozdrav, Ranko Lazić
cccc.129rlazic,
-> #113, gww.>> Kod separatnog kompajliranja i linkovanja sa debug informacijama
>> TLINK 3.0 se nepovratno zakuca (to bih voleo da neko vidi šta je sa
>> tim).
Ne znam, nije mi se to dešavalo (par puta sam bio prinuđen da
koristim TCC i TLINK zbog nedostatka memorije).
>> Druga stvar je da mi se učinilo nepouzdanim bilo koji switch TCC-a
>> koji se odnosi na EMS/XMS (nešto nije radilo, ne koristim više, a
>> nisam ni tražio šta je, nemam vremena).
U svojoj prvoj poruci sam napisao kako TC (i TCC) koriste EMS/XMS
memoriju - možda te je to (ne poruka, nego način korišćenja) zbunilo.
Ranko Lazić
cccc.130rlazic,
-> #115, gww.>> ppekovic i rlazic, molim vas kao i sve ostale da unesete malo
>> kolegijalnog ponašanja u diskusije. Ocenjivanje tudjeg kvaliteta
>> nikad nije zahvalna rabota. Ispravljanje zabluda jeste korisno,
>> ali uvek se može staloženo i argumentovano odbraniti svoj stav, ali i
>> prihvatiti tudje mišljenje ako se čovek nadje u zabludi.
Par puta u toku naše diskusije, pokušao sam ppekovic-u da ukažem na
to da mi ovde treba da se pomažemo i razmenjujemo iskustva, ali nije
vredelo. Sve što sam svo vreme pokušavao da uradim je da ispravim
njegovu zabludu, i to putpuno argumentovano. Staloženost je bila
odgovarajuća njegovoj drskosti.
Inače, on mi je kasnije u chat-u rekao da je ovde (na Sezamu) takav
"običaj" - da se međusobno blatimo i da tako nastaju najbolje
diskusije. E pa, taj običaj mi se mnogo ne sviđa.
Drugarski pozdrav, Ranko Lazić
cccc.131rlazic,
-> #118, mtadic>> neeee, nisi shvatio. Da ti pojasnim: bez obzira na redosled
>> guranja parametara na stek, tebi još uvek niko ne garantuje da će i
>> funkcije biti izračunate istim redosledom!! Redosled izračunavanja je
>> *potpuno* proizvoljan osim u slučajevima comma operatora i u logičkim
>> izrazima (*ne* u if-u, nego u logičkim izrazima, što je širi skup
>> situacija).
Da, u pravu si. Mada, mislim da je krajnje logično povezati redosled
izračunavanja argumenata sa redosledom kojim se oni guraju na stek.
Čak se u praksi uvek (na svim kompajlerima koje sam probao) pokazalo
da je to zaista tako. Ipak, slažem se da ponekad treba imati na umu
proizvoljnost njihovog izračunavanja - radi portabilnosti (jedno od
osnovnih pravila u programiranju je: nikad ništa ne podrazumevaj dok
ne proveriš).
Pozdrav, Ranko Lazić
cccc.132ppekovic,
-> #130, rlazic>>Par puta u toku naše diskusije, pokušao sam ppekovic-u da ukažem
>>na to da mi ovde treba da se pomažemo i razmenjujemo iskustva, ali
>>nije vredelo. Sve što sam svo vreme pokušavao da uradim je da ispravim
>>njegovu zabludu, i to putpuno argumentovano. Staloženost je bila
>>odgovarajuća njegovoj drskosti.
Čika GWW., čika GWW. čika Paya me diraaaaaaaa!!!.
>>Inače, on mi je kasnije u chat-u rekao da je ovde (na Sezamu) takav
>>"običaj" - da se međusobno blatimo i da tako nastaju najbolje
>>diskusije. E pa, taj običaj mi se mnogo ne sviđa.
Ako imaš log chat-a pročitaj ga još jednom, premda sumnjam
da ćeš uspeti i ovog puta da skontaš. ;)))
I na kraju, ako nisi primetio, nisam slao reply gww.-u jer
je čovek u pravu i jer zaista nije fer da opterećujem druge ličnim
diskusijama. Svima izvinjenje sa moje srane, a TI rlazić-u, ne budi
žena i ne traži pomoć za svoje "probleme" plačući na ramenu gww.-u
ili bilo kome drugom. Pošalji mi private mail, ili otvori šifru pa
reci svima za nju, pa kome se čita... A najbolje bi bilo da dođeš u
klub, jer ću lepo da ponesem odštampane sve "naše" poruke, pa da ih
lepo, na miru analiziramo, premda čisto sumnjam da ćeš izabrati ovu
zadnju opciju, jer si prošle nedelje utekao i ili nisi došao u
klub ili si došao pa se ućutao. ;)
Paya
cccc.133gww.,
-> #129, rlazic>> Kod separatnog kompajliranja i linkovanja sa debug informacijama
>> TLINK 3.0 se nepovratno zakuca (to bih voleo da neko vidi šta je sa
>> tim).
Evo moje turboc.cfg datoteke da potkrepim stvar.
-ml
-v
-w
-a
-N
-y
-P-
-Z-
-k
-IC:ĐTĐCĐINCLUDE;C:ĐTĐCĐINCLUDEĐSYS;
-Le:Đ;C:ĐTĐCĐLIB;
Što se linkovanja tiče:
TLINK /v
- * -
" U svojoj prvoj poruci sam napisao kako TC (i TCC) koriste EMS/XMS
" memoriju - možda te je to (ne poruka, nego način korišćenja) zbunilo.
????
Nemam nikakav stav, samo utisak, da TCC pada prilikom korišćenja EMS/XMS,
maybe da je problem u mom EMS-u, u šta sumnjam jer par drugih programa
radi sasvim korektno.
cccc.134gww.,
-> #130, rlazic& rep 6.132
Rešenje tako blizu a tako daleko.
Blizu:
create/tema PC.SOFT::Najbolji.programer (može i u ORKI, ona se valjda
bavi socio-psihologijom) Kaleeeeeeeeeeeee!!!!!!!!!!!!!!!!
Daleko:
V.K. je valjda još u Italiji.
Arbitar promene, "Čika" GWW. :))))))))))))))))))))))))))))))))))))
P.S. Ta, valjda znate trilogiju .... ;)
cccc.135rlazic,
-> #132, ppekovic>> Čika GWW., čika GWW. čika Paya me diraaaaaaaa!!!.
Deda Payo (jel' ti sad srce na mestu), ja sam GWW-u najnormalnije
odgovorio i objasnio razloge našeg prepucavanja. Inače, čiča Paya me
uopšte nije "dirao", već se samo (još jednom da ponovim)
neargumentovano razbacivao na moj račun. Pošto ipak nisam mogao
'ladno da pređem preko svega toga, došlo je do ove diskusije. Samo ne
znam zašto još posle prvog reply-a nisam rekao: "Ma, pusti ga da
bulazni, čovek je ionako neiživljen i iskompleksiran." I još nešto:
izgleda da je sve što si postigao u životu to što si sticajem
okolnosti odrastao, pa zato to STALNO ponavljaš i na tome baziraš
svojih poslednjih nekoliko reply-a, pošto nemaš na čemu drugom.
>> ...premda čisto sumnjam da ćeš izabrati ovu zadnju opciju, jer si
>> prošle nedelje utekao i ili nisi došao u klub ili si došao pa se
>> ućutao. ;)
Na klub nisam došao zbog toga što je bilo potrebno da sutra počnem da
se budim oko 7:30am (to traje bar pola sata), da bih u 8:50am krenuo
vozom za Valjevo. Da sam došao, buđenje bi bilo fizički teško
izvodljivo, tako da sam oko 11:00pm legao da pajkim.
P.S. Predlažem da sada stvarno prestanemo da gušimo ljude koji nisu
ništa skrivili da bi čitali ovo, pa mi reply pošalji private mail-om.
P.P.S. Ako imaš višak energije, prvom sledećom prilikom otidi do
severne tribine na Marakani, pa se sit isprazni.
Ranko Lazić
cccc.136rlazic,
-> #133, gww.>> " U svojoj prvoj poruci sam napisao kako TC (i TCC) koriste EMS/XMS
>> " memoriju - možda te je to (ne poruka, nego način korišćenja) zbunilo.
>> ????
>> Nemam nikakav stav, samo utisak, da TCC pada prilikom korišćenja
>> EMS/XMS, maybe da je problem u mom EMS-u, u šta sumnjam jer par
>> drugih programa radi sasvim korektno.
Da, nismo se pravilno razumeli. Mene je kod Turbo C++-a jednom veoma
zbunio način korišćenja EMS/XMS memorije. Naime, Turbo C++ koristi
navedenu memoriju samo za svoje swap-ovanje iz osnovnog RAM-a, što se
podjednako efikasno može uraditi i RAM diskom, ili u krajnjoj liniji
običnim hard diskom (samo će biti nešto sporije). To praktično znači
da je kod korišćenja Turbo C++-a potpuno isto imati 512kB ili 7MB
EMS/XMS memorije.
Što se tvog problema tiče, nisam pretpostavio da je u pitanju
blokiranje (tj. zakucavanje:) kompjutera. Probaću istu stvar kod mene
sa navedenim parametrima, pa ćemo da vidimo šta je (Turbo C++ ili
tvoja EMS/XMS memorija).
Pozdrav, Ranko Lazić
cccc.137ppekovic,
-> #135, rlazic>>P.S. Predlažem da sada stvarno prestanemo da gušimo ljude koji nisu
>>ništa skrivili da bi čitali ovo, pa mi reply pošalji private mail-om.
>>
>>P.P.S. Ako imaš višak energije, prvom sledećom prilikom otidi do
>>severne tribine na Marakani, pa se sit isprazni.
Slušaj MALI!!! ja sam, za razliku od tebe, pogledao jedno
16 puta onaj moj prvi reply na tvoju prepotentno, nadobudno,
imbecilno hvalisavu poruku i nisam uspeo da nađem ništa što bi na
bilo koji način bilo uvredljivo ili bilo šta slično, čak šta više
tamo ćeš pročitati da sam čak imao i nameru da ti pomognem, kao što
se uostalom trudim da svima na Sezamu pomognem ako to moje znanje i
mogućnosti dopuštaju. Iz tog razloga sam prikačio uz ovu poruku
zipovanu celu "diskusiju" između nas dvojice, u kojoj je, naravno,
i moj prvi reply na tvoju gore pomenutu poruku. A tu je naravno i
tvoj odgovor na moju, sasvim normalnim i nimalo uvredljivim rečima,
napisanu poruku. A ti si bio toliko drzak i bezobrazan, kao i u
svim kasnijim porukama. I da ti otvoreno kažem, upotrebiš li još
jednom ijednu jedinu pogrdnu reč upućenu meni, neću se više
zadovoljiti krajnje argumentovanim i za tebe preblagim reply-ima!!!
Dakle, spusti nos par kilometara dole i pročitaj celu
diskusiju pa proceni. Ako ti ne umeš, posavetuj se sa nekim
starijim. Ja sam pokazao tvoju i moju prvu poruku nekolicini ljudi
koji su sasvim neutralni, i kojima nisam rekao da je izbila bilo
kakva varnica kasnije u toj diskusiji, samo da mi kažu šta bi
odgovorio na onakav drzak reply, tj. da li sam ja stvarno napisao
bilo šta, što bi te povrdilo. Odgovor svih, ali baš svih ljudi, je
da su iznenađeni koliko si drzak i bezobrazan, a kad sam još
pomenuo koliko godina imaš, rekli su da bi ti rado uši izvukli.
Prema tome, bezobrazno derište, spusti pogled do svog
monitora i pročitaj par puta moj reply, pa ćeš onda ukapirati kakva
si ništarija obična, i dugojezika ženturača ispao.
Ovo važi i za sve ostale koji su mi rekli da sam delom u
pravu a da sam malo i preterao, neka pročitaju moj prvi reply zbog
koga se rlazić grdno uvredio, i zbog koga je nalupao onoliko
gadosti i gluposti, na koje čovek nezna dal da ga žali il da mu se
smeje.
Moji argumenti su u fajlu ispod, pa izvolite, pažljivo
pročitajte.
Paya
rlpp.zipcccc.138bojt,
-> #137, ppekovicAjde ppekovicu, smanji doživljaje i ostavi čoveka na miru.
>> I da ti otvoreno kažem, upotrebiš li još jednom ijednu jedinu
>> pogrdnu reč upućenu meni, neću se više zadovoljiti krajnje
>> argumentovanim i za tebe preblagim reply-ima!!!
Ako se ova diskusija nastavi ovim tokom, ja se više neću zadovoljiti
reply-ima nego ću možda da potegnem neke jače argumente...
cccc.139ppekovic,
-> #138, bojt>>Ajde ppekovicu, smanji doživljaje i ostavi čoveka na miru.
O.K.
>>Ako se ova diskusija nastavi ovim tokom, ja se više neću zadovoljiti
>>reply-ima nego ću možda da potegnem neke jače argumente...
Ono O.K. je direktna posledica gore navedene rečenice. Jest da Bojt ima 165
i 55 kila al ti mali su najgori, prgavi bre nešto mnogo.
Paya
cccc.140dejanr,
-> #139, ppekovicMolim da se ova diskusija iz PC.SOFT preseli u neku prikladniju konferenciju,
a još bolje u privatnu poštu. Dalje poruke na ovu temu ćemo uklanjati iz
PC.SOFT/cccc
cccc.141gww.,
-> #136, rlazicŠta zapravo TC++ odsvapuje u EMS? Vrlo čudno je za DOS program da ima 800K.
Kako se zapravo nalouduje takav program, jedini moj logičan zagljučak da
negde ima zapisano koliki zapravo kod treba da se nalouduje a ostalo je
neka vrsta overlaya. Ako je tako zašto su uopšte trpali sve u jedno? Čisto
zbog kurioziteta?. Zašto bi se svapovao u XMS kad recimo debugger lepo radi
iz XMS-a bez svapa?
cccc.142rlazic,
-> #140, dejanrZa sve one koji su imali (ne)prilike da prate diskusijicu između Paye
i mene, obaveštenje da se ista od sada razvija u private mail-u pod
šifrom !rlpp.
Ranko Lazić
cccc.143rlazic,
-> #141, gww.>> Šta zapravo TC++ odsvapuje u EMS? Vrlo čudno je za DOS program da
>> ima 800K. Kako se zapravo nalouduje takav program, jedini moj
>> logičan zagljučak da negde ima zapisano koliki zapravo kod treba
>> da se nalouduje a ostalo je neka vrsta overlaya.
Mislim da je u pitanju taj novi Borland-ov sistem za overlay-e
(VROOMM). Izgleda da stvar radi tako što sve "natrpa" u jedan .EXE
fajl, na početku učita deo koji mu je u tom trenutku potreban, a
tokom rada iz fajla "vadi" segmente programa koji mu u datom trenutku
trebaju. Kako piše u uputstvu, VROOMM će sam prepoznati i koristiti
EMS/XMS memoriju.
Moj zaključak je da se upravo na to svodi TC++-ovo korišćenje EMS/XMS
memorije - umesto da tokom izvršavanja stalno "prčka" po disku, on te
overlay-e lepo stavi u EMS/XMS, pa ih posle odatle vadi. Objašnjenje
za poruku "Swapping..." tokom kompajliranja je da on u tom trenutku
prebacuje u EMS/XMS (ili na hard/RAM disk) segmente koji su mu u tom
trenutku suvišni i na taj način povećava količinu slobodnog osnovnog
RAM-a. Naravno, sve to ima granice (nešto ipak mora da mu ostane u
memoriji), čije prekršavanje rezultuje sa Fatal error: Out of memory.
Ranko Lazić
cccc.146bjirecek,
TC 2.0
Funkcija
/*OVDE*/
/*OVO*/ for(i=0;i<64000;i++)
niz[i]=0;
izvrsi OVO (skoro) trenutno; ali ako OVDE iniciramo grafiku,
OVO se izvrsava nesto vise od POLA SATA!!!! (XT).
Zna li neko zasto?
cccc.147mperovic,
U najnovijim racunarima je dat prikaz knjige:
The Waite Group's Microsoft C Bible
ali nigde u celom tekstu nije data adresa ili telefon zasĘtuůpnika
iz Sarajeva kod koga se moze kupiti doticna knjiga. Ako je neko zna
molim vas da je posalje.
Pera
cccc.148dtadic,
-> #147, mperovicTa adresa se vec vise puta pojavljivala na Sezamu.
Evo je opet:
TKP "Sahinpasic"
Livanjska 74
Sarajevo
tel. 071/212-333, 275-574
┼
cccc.149miki,
Jedno pitanje za korisnike MS-C6.00
Nova verzija C-a u sebi sadrzi opciju za generisanje Browser - datoteka,
poznata -FR opcija. Ove datoteke posle koristi pwbmake i na kraju PWB.
Program pwbmake generise fajl *.BSC koji ustvari predstavlja fajl baze
podataka, nesto kao *.DBF fajlovi. Interesantno je da u uputstvu za C6.00
ima vrlo malo toga napisanog, tj. vecinu ovog sam shavatio koristeci qh
program. Imam utisak da je ova opcija jos nedovrsena pa iz tog razloga nije
dobro dokumentovana.
Pitanje:
Da li neko zna format ovih *.BSC fajlova ili neki program osim PWB-a koji
moze da ih cita.
Unapred hvala: Mirko B.
cccc.150dgrbic,
TURBO C 2.0:
Kada sam u petlji imao nest ovako:
a [i][1]=...; a [i++][2]=...;
to nije radilo korektno, pa sam morao da uvecavanje brojaca izvucem u poseban
izraz.
Pretpostavljam, da je to posledica optimizacije (default), nisam jos stigao da
proverim sa iskljucivanjem optimizacije (to mi se upravo sad desilo).
Vrlo ruzno, program ne radi, a morao bi. Kada se radi o necem takvom, trazenje
greske moze biti vrlo neprijatno.
Ovo je cito kao upozorenje, da bi ljudi znali sta im se radi iza ledja, tj. ako
program ne radi a morao bi, moglo bi da se radi o necem ovakvom.
Grba.
cccc.151dgrbic,
Ima li neko neka iskustva sa Power C kompajlerom (od MIX Software)?
Grba.
cccc.152pjero,
Poruka je u datoteci handle.sez
hendle.sezcccc.153dgrbic,
Ima li neko source nekog C ili Pascal kompajlera? (Small C ili slicno)
Grba
cccc.154vkostic,
Pointer na niz stuktura ????????
Mislio sam da znam sve o C-u, programiram vec godinama na C-u, drzao sam
i kurseve C-a, ali ne lezi vraze! Danas sam naleteo dali na svoje
neznanje, ili na ogranicenje C-a, nemam pojma.
Problem: Imam strukturu i pointer na nju:
struct {
int a;
int b;
} *p;
Prostor za strukturu se alocira na heap-u, i to ne za jednu strukturu
nego za niz struktura.
Ok, sada hocu da adresiram te elemente. Da je struktura ovako
deklarisan:
struct {
int a;
int b;
} p[10];
onda bi to radio ovako:
p[i].a
po toj analogiji, ja sam pokusao da uradim:
p[i]->a
posto je p kao sto rekoh deklarisan kao pointer.
E, ali to ne radi. Jednostavno nemam pojma zasto. Imam tri knige ovde
pri ruci, ali ni u jednoj ni slova o pointeru na niz stuktura, samo ono
standardno - pointer na strukturu:
p->a
Malo petljanja sa aritmetikom pointera prizvodi sledeci rezultat:
(*(p+i)).a
i to radi. Proverio sam. Nije ni lepo ni elegantno ali radi. Samo,
problem je sto sam nameravao da koristim nesto mnogo slozenije:
struct regions {
char name[32];
long users;
int subregions;
struct subregions *subregs_ptr;
} *sp;
struct subregions {
char name[6];
long start_index;
long users;
long maxusers;
};
Pri cemu je sp pointer na niz struktura, a u svakoj od tih struktura
sregs_ptr je pointer na drugi niz struktura. Sav prostor se alocira na
heap-u jer se tacne dimenzije ne znaju unapred.
Dalje, nameravao sam da koristim izraze tipa:
sp[i]->subregs_ptr[j]->start_index
Samo, to ne moze. Izgleda da bi moglo:
(*((*(rp+i)).subregs_ptr+j)).start_index
Sacuvaj boze sto je to pregledno, a pitanje je i dali radi. Upravo
nameravam da proverim.
Jel ima neko bolju ideju?
Pozdrav, V.K.
cccc.155zzivotic,
-> #154, vkostic>> Pointer na niz stuktura ????????
>> Ok, sada hocu da adresiram te elemente. Da je struktura ovako
>> deklarisan:
>> struct {
>> int a;
>> int b;
>> } p[10];
>> onda bi to radio ovako:
>> p[i].a
>> po toj analogiji, ja sam pokusao da uradim:
>> p[i]->a
>> posto je p kao sto rekoh deklarisan kao pointer.
Sve je ok sem analogije :) Jesi li probao prosto:
p[i].a
Pozdrav, zz
cccc.156kaza,
-> #154, vkosticKod polja struktura tipa
struct {
int a;
int b;
} *p;
i druge
struct {int a;
int b;
} p[10];
Razlika je sto se u prvom slucaju NE alocira prostor (nezna se ni
koliki je) *p-to ne govori, a u drugom slucaju se alocira prostor
posto se zna koliki je niz struktura. (i u prvom slucaju se alocira
prostor ali samo za jednu strukturu, ne za niz)
Kod oba slucaja vrijedi p[i].a ili *(p+1).a sto je analoo.
Postoji analogija i sa oblikom p->a ali to izgleda ovako (p+i)->a.
Notacija p[i]->a ne dolazi u obzir jer u ovom slucaju (pointer na
pointer) nije deklarisana.
Jednostavno receno u strukturama kombinacija * i . ili [] i . se
mogu zamjeniti sa notacijom -> umjesto tacke, ako je tako preglednije
i pod uslovom da je deklarisan niz struktura.
Prva struktura iz ovog primjera je neupotrebljiva kao niz jer se vise
na nju ne moze pozvati u smislu deklaracije clanova niza jer nema
ime.
Medjutim polje struktura koje sadrzi polje struktura kao u
komplikovanom primjeru iz poruke 6.154 se moze napraviti na slijedeci
nacin:
struct x {
int a;
int b;
struct {
int c;
int d;
} p[10];
};
sada u programu treba inicijalizirati strukturu npr.
void main()
{
static struct x y[]={
{1,2,{{31,41},
{32,42},
moze se dodati jos clanova niza (do 10)
{39,49}}},
{5,6,{{71,81},
{72,82}...}},
{9,10,{{11,12}}}
};
Tek je ovaj proces inicijalizacije alocirao prostor ?
Apojedinim elementima se moze pristupiti:
(y+i)->p[j].c za i=1 i j=1 ovo je 72
ili ekvivalentno
y[i].p[j].c ako je preglednije
pozdrav KAZA
cccc.157vkostic,
-> #155, zzivotic
>> Jesi li probao prosto:
>>
>> pŠiĆ.a
Eh da, trebalo se setiti! Bre Zorane, od tebe covek uci dok je ziv! :)
Pozdrav, V.K.
cccc.158vkostic,
-> #155, zzivotic
>> Jesi li probao prosto:
>>
>> pŠiĆ.a
Eh da, trebalo se setiti! Bre Zorane, od tebe covek uci dok je ziv! :)
Pozdrav, V.K.
cccc.159vkostic,
-> #156, kaza
Hvala na trudu oko odgovora. Sve sto si napisao vec godinama znam osim
sitnice da je trebalo napisati pŠiĆ.a a ne pŠiĆ->a.
Pozdrav, V.K.
cccc.160.bale.,
U novim "Računarima" ZZ kaže da MENU.C (koga još nema u RSOFT) ima oko 1500
linija, a MENU.EXE 25 kB. Je li to greška (150) ili da se i dalje čudim?
Regards from .bale. !
#8*)+-<
cccc.161bojt,
-> #159, vkostic>> Sve sto si napisao vec godinama znam osim sitnice da je trebalo
>> napisati pŠiĆ.a a ne pŠiĆ->a.
Treba zakonom zabraniti da programeri koriste YUSCII raspored!
cccc.162gww.,
-> #159, vkosticEh da. Problem alociranja niza struktura na heap-u kao i uostalom svakog
niza svodi se na problem prljavosti C-a kao jezika. Ono što zapravo
nedostaje ja zovem "niz cast". K&R ne gleda razliku izmedju pointera.
Zapravo je svejedno kakav pointer se predaje a kakav se koristi. Oko toga
sam se već svadjao sa Alexom (a mislim da sam jednom tražio tu doslednost
ovde na Sezamu). Turbo C 2.0 (ANSI varijanta) ume da prijavi u tom slučaju
Suspicious pointer conversion jer jedno je pointer na strukturu a drugo
pointer na niz struktura iako jer adresna aritmetika ista. (po toj
analogiji svejedno je da li je str_p->a ili str_pŠ0Ć.a). Ovo povlači izjavu
da zapravo u C-u gornji bound checking nije moguć. A koliko sam shvatio
čitajući neki od Zoranovih napisa u "Računarima" ni donji bound cheking se
ne radi (tj mogući su i negativni indeksi) što daje neke mogućnosti ali kao
side-efekt a ne kao legalna filozofija.
To nije problem u C jeziku, medjutim, da je C malo više tipiziran jezik što
na primer C++ pokušava da bude (a Pascal naprimer jeste) postavlja problem
legalnosti smatranja pointera. t.j. preporučljivije je cast-ovati da bi
stvar bila jasnija. Zapravo mi ne pada napamet u kojim bi to slučajevima
izazvalo frku, ali da nedostaje - nedostaje. Ovako stvar prodje kao
(eventualni) warrning i pojeo vuk magarca (stvar radi) a o doslednosti
(lepoti filozofije) ko te pita.
P.S. Možda bi zapravo trebala f-ja calloc da vraća pointer niz tipa (možda
calloc to i radi, ne znam, nisam proveravao).
Možda ideja da se niz cast piše na primer: (ŠĆ*) ili možda lepže ali
i nedoslednije (ŠĆ).
pozdrav GWW.
cccc.164alexa,
-> #162, gww.Eh, gww., pa tebi ne treba C, nego Modula-2! Protivno je koncepciji
C-a proveravanje granica niza i slične stvari. C je samo zamena
(mnogo lakša, lepša, elegantnija i portabilnija) za asembler.
cccc.165gww.,
-> #164, alexaZašto je moliću lepo protivno koncepciji bilo kog jezika proveravanje?
Koliko znam tako nešto čak i postoji i to baš za C, a zove se LINT (uzgred
ima li neki LINT za PC). Ne vidim takodje razlog za tvrdnju da je C zamena
za ASM jezike isto se tako može reći da je "samo zamena (mnogo brža,
fleksibilnija, elegantnija i portabilnija) za" neki viši jezik. Jezik je
lep i koristan sa još par zgodnih stvari (koje već postoje u C++) mogli bi
se 'ladno odreći svega što postoji i lepo zaboraviti probleme računarskih
jezika (ovog tipa).
'De me nadje sa Modulom? pa ona je povukla masu loših strana Pascala, čak
je neke i prološila da se slobodno izrazim, a recimo današnji Turbo Pascal
(počev od verzije 4) mi žestoko smrdi na propali projekt Turbo Module 2.
Pogotovo otkad sam video Turbo Modulu 2 za CP/M.
pozdrav GWW. (u zanosu akademske rasprave) :)))))
cccc.166alexa,
-> #165, gww.C je jezik niskog nivoa.
Zato u njemu nema stvari kao što su proveravanje dimenzija niza,
razlikovanje pointera-na-niz od pointera-na-element,
prenosa argumenata po referenci itd. To su koncepti
višeg nivoa, koji svoju podlogu nemaju u arhitekturama današnjih
računara. Za takve stvari je pravi jezik upravo C++, i ne treba
tražiti da se ubacuju u C. Ne zaboravi da je C++ nekada generisao
kod u C-u, kao dobroj (portabilnoj) zameni za mašinski kod!
(istina, taj kod u C-u je VRLO nečitljiv).
Što se tiče LINT-a, to je program potpuno odvojen od C-a, i služi
za to da ti ukaže na (njemu) sumnjiva mesta; koristio sam ga
nekoliko puta za traženje bug-ova, ali mi ne pada na pamet da
ga redovno upotrebljavam. Program koji bi bio sasvim 'po ukusu'
LINTa uopšte ne bi ličio na 'normalan' C program. Sve u svemu,
LINT mi liči na podvalu nekog učenika N. Wirtha, i ne zaslužuje
da postoji.
Što se tiče Module, ne shvatam zašto te toliko odbija (kad već
voliš strong typing). Ono što je POSEBNO dobra stvar kod Module
su odvojeni definition- i implementation-moduli. To se (prilično
bedno, po mom mišljenju) simulira u C-u upotrebom header datoteka.
Na kraju, da kažem da već godinama programiram u C-u (profesionalno),
prvenstveno na UNIXu i UNIXoidnim operativnim sistemima. Tek kad
malo više 'zaživi' Release 4 System V UNIXa preći ću na ANSI C,
a dotle sam vrlo zadovoljan starom (K&R) verzijom jezika.
Pozdrav, Alexa
cccc.167gww.,
-> #166, alexaZašto niskog?
"Zato u njemu nema stvari kao što su proveravanje dimenzija niza,
"razlikovanje pointera-na-niz od pointera-na-element,
"prenosa argumenata po referenci itd. To su koncepti
Ali zato ima struktura i strukturne aritmetike (još gore unija), prenosa po
adresi i po vrednosti i funkcije strlen. Kakva ameba!
Modula ima pretenziju da se proširi na proces linkovanja (čak i na druge
funkcije opertivnog sistema, ali to je već druga priča), C nema tu
pretenziju zato i nema jake koncepcije linkovanja u C-u. Slažem se:
linkovanje C-a je operacija koja nigde nije dovoljno objašnjena (*1).
Modula se vrlo malo razlikuje od današnjeg turbo pascala s tim što je
Borland na vreme odlučio da nas ne gnjavi sa moduloidnim drilom pisanja
programa. Nemam nameru da koristim modulu a i današnji pascal koristim
uglavnom za brzo rešavanje odredjene klase problema i za eskperimentisanje.
Strong typing ima tu lepu osobinu što je idealan za eksperimentisanje ali
ne i za konačnu verziju nekog koda (čemu overhead?). A ako bih hteo nešto
portabilno jednostavno ne bih imao šta da izaberem osim C-a, ali bojim se
da su tu mnoge stvari još uvek jednostavno nedorečene.
Sve u svemu u pravu si osim što ćeš kad predješ na ANSI C susresti jednu
podvalu ili pak lepu stvar (sve zavisi kako posmatraš): prototip funkcije
sa parametrima a onda na scenu stupa niz cast ... ta da da dam :))
(*1) Skoro mi se dogodio jedan biser u vezi sa linkovanjem. Iz nekog čudnog
razloga u jednoj od biblioteka našla se funkcija main. Da stvar bude malo
više po marfiju u modulu koji je trebao da bude glavni main funcija je bila
isključena (komentarom). Stvar je prošla bez problema (kompajliranje /
linkovanje) a po startovanju programa pojavio se meni od pre mesec dana. U
trenutku je palo zbunjvanje ali i rešenje: jedan pregled svih biblioteka i
stvar je bila jasna kao dan.
GWW
cccc.168alexa,
-> #167, gww.> Ali zato ima struktura i strukturne aritmetike (još gore unija),
> prenosa po adresi i po vrednosti i funkcije strlen. Kakva ameba!
UH! Ovde nema ni jedne reči sa kojom se mogu složiti!
Strukture sasvim sigurno JESU low-level koncept. Sa time se neće
složiti jedino zaklete FORTRANdžije, jer eto ima i jedan
high-level jezik bez njih. Podsetio bih da i Microsoftov
asembler ima službenu reč STRUC, koja upravo služi za realizaciju
koncepta strukture - skoro identičnog C-ovim strukturama.
UNION u C-u nema AMA BAŠ NIKAKVE veze sa strukturnom aritmetikom
(šta god to bilo), već je prosto prirodno proširenje koncepta
strukture. Nešto slično imaš u PASCALu, na primer, kao
VARIANT RECORD.
U C-u NE POSTOJI prenos argumenata po adresi,
nego samo po vrednosti!!!
Funkcija strlen je možda deo C-a od kako je ANSI komitet uzeo
stvari u svoje ruke.
> linkovanje C-a je operacija koja nigde nije dovoljno objašnjena.
To je zato što je linkovanje funkcija operativnog sistema,
totalno izvan C-a, kao što i TREBA da bude. Zato objašnjenja treba
tražiti u priručnicima za LINK ili analogni program operativnog
sistema.
> Modula se vrlo malo razlikuje od današnjeg turbo pascala ...
Ispravka: današnji TP se vrlo malo razlikuje od Module-2.
> Sve u svemu u pravu si osim što ćeš kad predješ na ANSI C susresti
jednu
> podvalu ili pak lepu stvar (sve zavisi kako posmatraš): prototip
funkcije
> sa parametrima a onda na scenu stupa niz cast ... ta da da dam :))
No dobro, svaka ideja se može zloupotrebiti. Ja ulogu
forsiranog cast-a u prenosu argumenata vidim na sasvim drugoj
strani - u rešavanju praktičnog problema čestih grešaka u
dužini raznih integerskih izraza-argumenata.
cccc.169zonjic,
Postavio sam pitanje na temi TP o programu za ulepsavanje source-a
u pascalu, ovde ostavljam to isto, samo za C.
Rade
cb.zipcccc.170djelovic,
U TC++ se grafički karakteri mogu otkucati tako
sto izađete u DOS (Shell), vratite se u TC, i onda
otkucate Alt- kombinaciju (recimo Alt-196).
Izašao je Borland C++ for Windows koji koristi
isti grafički toolkit kao i Actor, tako da bi trebao
da bude moćan.
Koji je "najniži" bios poziv za ispisivanje znaka
na ekran (da svi drugi pozivi idu preko njega).
cccc.171braca,
Može li neko da mi preporuči dobru biblioteku funkcija za C
(ili C++) za rad sa podacima organizovanim u B+ stablo?
Unapred hvala,
Braca.
cccc.172djelovic,
-> #171, bracaOdlična je C/Database Toolchest (B+, ISAM) za samo
$19.95 od iste firme koja prodaje Mix C kompajler
za koga kažu da je car među low-end kompajlerima.
Adresa: Mix Software
1132 Commerce Drive
Richardson, TX 75081
Tel: 1-800-333-0330
P.S.: Imaš i "60 Day Money Back Guarantee".
cccc.173sstakic,
-> #172, djelovicDa li si probao da zoves nekada na 1-800-... ? ;>>>
cccc.174nkbog,
-> #171, braca Evo datoteke sa programima iz DDJ (u C-u) iz decembra '90. Ona sadrzi source
program i header datoteke za rad sa B stablom.
Autor je Al Stevens. U programu se javlja funkcija dberror() koju trebas
sam definisati (obrada greske). Nazivi funkcija su dovoljno jasni.
NB.
btree.zipcccc.175braca,
-> #172, djelovic
Hvala na preporuci, upravo sam naleteo na to listajući danas
DDJ i naručio na slepo, rekoh da ne mogu da se zeznem za 50$ (19.95 +
10 za source + 20 za transport).
Kad stigne, ostaviću utiske ovde.
cccc.177djelovic,
-> #173, sstakic Možda Braca ima ujaka u Amerigi (To je još uvek
najbolji način da se nešto odande dobavi). Što se
telefona tiče, možda treba probati i tech. supp.
line: 1-214-783-6001
cccc.178sstakic,
-> #177, djelovicTako vec moze!
Pozdrav Srdjan
cccc.179ppekovic,
Imam sledeći problem: Korstim MSC 6.00 i u jednom programu
u isto vreme koristim više fontova različitih veličina. Problem je
što, kada god promenim font, program ga učitava sa disk-a. Da li je
moguće, kao kod Borlandovog TC-a, ulinkovati fontove zajedno sa
programom i kako, ili, da li je moguće učitati fontove u memoriju,
pa ih koristiti iz memorije a ne sa diska, i naravno, kako?
Za svoje potrebe, ja prepišem fontove u RAM disk, međutim,
program treba da radi na svim mašinama ;(.
Paya
cccc.180djelovic,
Da li neko zna kojim redosledom bivaju izvršeni
konstruktori i destruktori u C++? Izgleda da prvo
bivaju izvršeni oni koji su prvi definisani
(class x (...); - zamislite vitičaste zagrade, ja
imam YUSCII), tj. izgleda da nije bitan redosled
njihovog kreiranja u programu, mada ne mogu u to
biti siguran.
cccc.181djelovic,
Da li je moguće .OBJ faljove iz TC-a dalje
optimizirati trećim prolazom MSC-a. .OBJ fajlovi bi
trebali da budu standardni (ja ne znam format), ali
je moguće da kompajler ostavlja "komentare" koji služe
za dalju optimizaciju, te je "gorespomenuta tehnika"
neizvodljiva.
cccc.182alexa,
-> #180, djelovic> Da li neko zna kojim redosledom bivaju izvršeni
> konstruktori i destruktori u C++?
-----------------------------------------------------------
When a class has a constructor, it is called whenever an
object of that class is created. When a class has a destructor,
it is called whenever an object of that class is destroyed.
Objects can be created as
(1) An automatic object: created each time its declaration is
encountered in the execution of the program and destroyed
each time the block in which it occurs is left;
(2) A static object: created once at the start of the program
and destroyed once at the termination of the program;
(3) A free store object: created using the 'new' operator
and destroyed using the 'delete' operator; and
(4) A member object: as a member of another class or as a
vector element.
An object can also be constructed by explicit use of a
constructor in an expression, in which case it is an automatic
object.
(citat iz knjige 'The C++ Programming Language', Bjarne Stroustrup)
-----------------------------------------------------------
Sudeći po citatu, trebalo bi da je bitan *redosled kreiranja
u programu*. Ako se radi o TC++, bilo bi dobro da rečima
autora programskog jezika C++ ne veruješ suviše - Borland se
nikad nije libio da prepravi programski jezik ako mu ne
odgovara onakav kakav jeste.
cccc.183alexa,
-> #181, djelovic> Da li je moguće .OBJ fajlove iz TC-a dalje
> optimizirati trećim prolazom MSC-a.
Nije uobičajeno da optimizujući deo kompajlera
kao ulaz koristi objektnu datoteku - njen format je za
tako nešto vrlo nepogodan. Treći prolaz MSC-a
kao svoj IZLAZ daje .OBJ datoteku.
> .OBJ fajlovi bi trebali da budu standardni
Standardni format datoteka sa objektnim kodom je za MSDOS
Intel-ov (NE Microsoft-ov!) OMF.
cccc.184djelovic,
-> #182, alexaHvala. Međutim, moj problem je u tome što je jedan
objekt (klasa) iz jednog fajla, a dugi iz drugog.
Primer:
Fajl1:
class cl1 (...);
...
cl1 class1;
Fajl2:
extern cl1 class1;
class cl2 (...) class2;
main () (...)
Iako je u fajlu 2 class1 definisana pre class2, prvo
se izvršava konstruktor iz class2, pa tek onda iz class1.
Koristim TC++, možda je u njemu problem?
P.S.: Prave su zagrade samo iza main. Sve ostale su vitičaste.
cccc.185alexa,
-> #184, djelovic > Iako je u fajlu 2 class1 definisana pre class2, prvo
> se izvršava konstruktor iz class2, pa tek onda iz class1.
Ako sam dobro shvatio, tebe zanima redosled izvršavanja
konstruktora za statičke objekte definisane izvan funkcija - na
najvišem nivou.
Pogledaću još malo Stroustrup-ovu knjigu, ali pretpostavljam
da je što se toga tiče stvar ostavljena na volju autoru
kompajlera.
Uzgred budi rečeno, u fajlu 2 class1 uopšte nije definisan,
samo je deklarisan. Definisan je u fajlu 1.
cccc.186djelovic,
-> #185, alexaI ja isto mislim da su Borlandovci sami odlučivali.
Hvala u svakom slučaju.
cccc.187ljupco,
Kako da nateram TCC da generise informacije potrebne turbo debuger-u?
Takodje zelim da dobiveni fajl bude .com tipa. Mozda
TCC -mt -lt -v -lv -y -ll IME
Medjutim, tdebug javi da mu nedostaje tabela simbola. Sta sad?
cccc.188ljupco,
Juce mi se dogodilo sledece: imam program od 25 reda u kome je neko
racunanje i na kraju je stampanje. Na pocetku je #include "math.h" i
#include "stdio.h". Prilikom linkovanja iz integrisane okoline TC 2.0,
interni linker javi da je naisao na neke nedefinisane simbole (medju kojima
navodi i _fabs i _sqrt, funkcije fabs i sqrt koristim u programu) i t.n. Isti
program, sa TCC i TLINK, prolazi bez problema. Direktorijumi za include i lib
su pravilno podeseni i kod TC i kod TCC. Pre nedelju dana isti taj program
kompajlirao se bez greske i sa TC. U cemu gresim?
cccc.189ljupco,
Secam se da je negde (u nekoj poruci ili u Racunarima) nedavno bilo
reci o deklaraciji funkcije kao 'interrupt'. Zna li neko gde?
U uputstvu za TC20 na str.542 (Appendix E, Language Syntax Summary,
Lexical Grammar, Tokens, Keywords) kao i u Norton Guide (Reserved Words)
navodi se rezervisana rec interrupt kao ekstenzija TC-a, ali i nista vise.
cccc.190ljupco,
Hteo bih da pokujem Herkules video memoriju (kartica je u tekst
rezimu). Medjutim, sledeci program
#include "dos.h"
int i,p;
void main()
{
for(i=0, p=0; i<256; i++, p++, p++) poke(0xb000,p,i+256*7);
}
ne radi. Racunar se zaglavi. U cemu gresim? Poke(int segment, int ofset, int
vrednost) je makro u "dos.h" (tako kaze NortonGuide).
cccc.191djelovic,
-> #189, ljupco interrupt f-je se razlikuju od običnih u tome
što automatski gurnu registre CPU-a na stack, i završavaju
se sa IRET. Nisam pogledao, ali bi trebao da imaš primer
kod f-je keep (). Što se pitanja o herkulesu tiče, pogledaj
help TC++ - a na temu keep (). Tu imaš mali primer. Inače,
ja poke nisam koristio, švrljao sam direktno sa pointerima
i to sigurno radi, a i više je u duhu C-a ("poke" ?? - jel
to C ili BASIC?). Pozdrav.
cccc.192alexa,
-> #188, ljupco> interni linker javi da je naisao na neke nedefinisane simbole
> (medju kojima navodi i _fabs i _sqrt, funkcije fabs i sqrt
> koristim u programu) i t.n.
Pa, ne znam kako radi to 'integrisano okruženje', ali ono što se
dešava je da linker ne uzima u obzir biblioteku sa math
funkcijama - verovatno imaš negde neku opciju da ubaciš i ovu
biblioteku.
cccc.193ljupco,
-> #192, alexa> Pa, ne znam kako radi to 'integrisano okruzenje', ali ono sto se
> desava je da linker ne uzima u obzir biblioteku sa math
> funkcijama - verovatno imas negde neku opciju da ubacis i ovu
> biblioteku.
Na pocetku programa nalazi se direktiva #include "math.h".
cccc.194ljupco,
-> #191, djelovic> help TC++ - a na temu keep (). Tu imas mali primer. Inace,
> ja poke nisam koristio, svrljao sam direktno sa pointerima
> i to sigurno radi, a i vise je u duhu C-a ("poke" ?? - jel
> to C ili BASIC?). Pozdrav.
Probo sam najpre ovako:
char i=0;
char far *p;
void main()
{
p=0xb0000L;
do
{
*p=i++;
p+=2;
}
while(i);
}
ali svejedno ne radi, a i nacin na koji ne radi je isti.
Posto je ocigledno da pojma nemam, molim te ne zameri ako odvalim
neku glupost. Juce sam tek posle pola sata lupanja glave i tri minuta sa
TurboDebuger-om shvatio da
char i;
for (i=0; i<=255; i++) ;
jeste mrtva, a ne prazna petlja.
cccc.195djelovic,
-> #193, ljupco Taj include fajl služi samo za definisanje
konstanti itd., tj on nema veze sa onim što linker
ubacuje. Nateraj (potraži to po opcijama) linker
da ubaci i matematičku biblioteku (math.lib ili tako
nešto), a ako ti ni to ne uspe, probaj da je ručno
ubaciš u project fajl.
cccc.196djelovic,
-> #194, ljupcoprobaj p = MK_FP (0xb000, 0) umesto p = 0xb0000L i
p++; *p = <atribut>; p++; (ti to "izoptimizuj")
tj., možda ti prikazuješ slovo na ekranu, ali crno
na crno. Srećno.
cccc.197sradman,
Molim nekog da mi prenese iskustva sa BORLAND C++ 2.0,posto namjeravam da ga
nabavim.
cccc.198nkbog,
-> #194, ljupco> p=0xb0000L;
Ovo bi trebala da bude adresa 000b:0000 <=> 0b0h. TC bi trebao (ne radim sa
njim ali imam neke source-ve) da isto pamti far pointere sa 2x 16bita. Stoga
program ne radi jer si gadjao nultu stranu <=> tabela vektora.
NB.
cccc.199kaza,
-> #194, ljupcoProbaj jednostavno sa recimo
char far pok=(char far *) 0xb0000000L;
ovo pouzdano radi ali ima jedno divno rjesenje a podrazumjeva
strukturu oblika :
struct m {
char slovo;
char atrib;
} (far *Ekran) [BR_RED][BR_KOL];
sada se moze definisati
#define PUTC(red,kol,ch) (*Ekran)[red][kol].slovo=(ch)
isto za atribut
pa se poslije moze pokati po video memoriji koristeci oblik
npr. PUTC(0,0,'A');
Inace treba reci Ekran=(struct m(far*)[25][80]) 0xb0000000L;
Pozdrav KAZ
cccc.200ljupco,
-> #196, djelovic Greska je u p=0xb0000L. Treba char far *p=(char far *)0xb0000000L !!!
Drugim recima, kada stavis p=0xAAAABBBB, onda je za pointer p segment 0xAAAA,
ofset 0xBBBB, t.j. stvarna adresa je 0x(AAAA0+BBBB). Radi
char i=0;
char far *p=(char far *)0xb0000000L;
void main()
{
do
*(p+=2)=i++;
while(i);
}
I makro MK_FP daje pointer u obliku 0xAAAABBBB za MK_FP(0xAAAA,0xBBBB):
#define MK_FP(seg,ofs) ((void far *) \
(((unsigned long)(seg) << 16) | (unsigned)(ofs)))
Hvala na pomoci.
P.S. Ovog trenutka mi je pogled pao na aprilske Racunare otvorene na strani
71 (moja skola c-a, zz), gde je dat primer o huge pointerima:
"... Ako pokusamo da proverimo ovu tezu sledecim primerom:
void main()
{
char huge *p;
p=(char huge *)0x12345678L;
printf("%p\n",p);
}
necemo bas dobiti potvrdu ove teze, program ce stampati 0x1234:0x5678."
Resenje mi je bilo ispred nosa citavo ovo vreme! ^^^^^^^^^^^^^
cccc.201djelovic,
-> #200, ljupco Zbog dužine tvog nosa mi smo morali da ispaštamo :).
Odsada, svake računare da si na pamet naučio, a mi ćemo
da te ispitujemo.
cccc.202ivujanic,
-> #197, sradman>Molim nekog da mi prenese iskustva sa BORLAND C++ 2.0,posto namjeravam da ga
>nabavim.
Paket mi je tek stigao pre par dana. Deluje moćno. U odnosu na poslednju
verziju Turbo C++ koji sam video, novost je što oba C++ kompajlera (i onaj sa
IDE i klasični linijeski) postoje u dve varijante: jedna je standardna DOS
verzija, a druga prebaci vaš 286+ računar u protected mode i koristi svu
raspoloživu expanded/extended memoriju. Isto važi i za TASM, jedino njemu
u "mišićavoj" verziji treba pomoć Windows-a.
Gomila disketa, pa ste mirni bez obzira da li imate 3.5" ili 5.25", što
je lepo od njih.
Da bi se radilo za Windows-e dodat je i Turbo Debbuger pod Windows-ima,
koji normalno ima mogućnost remote debbuging-a sa druge mašine preko RS-232.
Mali ali korisni dodatak je i Whitewater Resource Toolkit, program koji
radi pod Windows-ima sa zadatkom da omogući lako kreiranje i editovanje
resursa za Windows-e (dialog-box, ikone, kurzori...). Radi sasvim fino, ko
ima vremena uz pomoć te alatke će cele Windows-e prevesti na S-H, jer je
struktura koda za Windows aplikacije standardizovana, pa možete editovati
resurse bez source-a, samo sa .EXE ili .DLL verzijom.
Knjiga koliko ti volja:
1. Borland C++ Getting Started
2. Borland C++ User's Guide
3. Borland C++ Programmer's Guide
4. Borland C++ Library Refernce
5. Whitewater Resource Toolkit
6. Turbo Profiler
7. Borland Languages Help Compiler
8. Turbo Debugger
9. Turbo Assembler
10. Turbo Assembler Quick Reference Guide
11. Mali ali vrlo zgodan Borland C++ Quick Reference Booklet
Ja sam ga uplatio na dan kad je Ante proglasio novi kurs, po predračunu
koji sam dobio dan ranije ;) ali mislim da ja i sadašnja cena sasvim fer.
Ko može marku da nađe ispod 17 din?
Postoji još gomila malih alata koji pomažu u radu, ali još nisam stigao
da ih sve pogledam.
Ivica
cccc.203ljupco,
-> #199, kaza Hvala. Resenje koje si dao je stvarno lepo. Ja sam stavio
struct m{
char slovo;
char atrib;
}(far *ekran)[25][80]=(struct m(far *)[][])0xb0000000L;
Interesantno da kad je zadnja linija
}(far *ekran)[25][80]=((struct m)(far *)[][])0xb0000000L;
t.j. kad je '(struct m)' umesto 'struct m' dobijem 'Error:Expression syntax'.
Zasto?
cccc.204ivujanic,
-> #202, ivujanic
Što više proučavam Borland C++ to me više prijatno iznenađuje. Mislili
su na sve žive konfiguracije računara, na sve žive probleme na koje možete
naići... Čak i linker i asembler postoje u verziji za protected mode!
Normalno i profiler, a debugger može da radi standardno, u 286 modu (digne
se u hi-RAM) ili da pređe u 386 mode i za vašu aplikaciju napravi pravu malu
8086 virtuelnu mašinu (na žalost tada neće ići software tipa QEMM ili 386ČMAX,
jer je tada mašina već u virtuelnom modu).
Stvarno je potrebno iščitati kompletna uputstva, jer je šteta da vam
rešenje problema leži pod nogama a da niste ni znali.
A sada ono što je vrlo bitno: brzina i veličina koda. Što se brzine tiče,
nisam imao na raspolaganju ništa što bi mi sigurno pokazalo brzinu koda, pa
je dobrodošao neko ko ima neki program koji je već koristio da bi poredio
dosadašnje kompajlere da isti zakači na mail pa ćemo videti. A što se koda
tiče, manji je za oko 8% od Turbo C-a. Mrzi me da instaliram Turbo C++.
Dakle oni koji su već poredili dosadašnje kompajlere i sačuvali su
rezultate dobro su došli da vidimo koliko je dobro ovo novo čedo.
Ivica
cccc.205kaza,
-> #203, ljupco(struct m[][]) predstavlja cast
(struct m)[][] ostavlja [][] da visi samo za sebe pa to uzrokuje
greske.
citavu konstrukciju (struct (far *)m[][]) treba shvatiti kao cast u
castu i sve je ok.
pozdrav KAZA
cccc.206djelovic,
Kako da u TC++ napravim GOSUB kao u BASIC-u (Sve
u okviru jedne procedure). Probao sam sa:
#include <stdio.h>
void main ()
š
asm call far dummy
return;
asm dummy:
printf ("Deki");
asm ret
ć
ali me kompajler psuje. PLEASE HELP!
cccc.207nkbog,
-> #206, djelovic
>> #include <stdio.h>
>>
>> void main ()
>>
>> s
>> asm call far dummy
>> return;
>> asm dummy:
>> printf ("Deki");
>> asm ret
>> c
Kao prvo, kad saljes nesto kao C (ili pascal ili bili sta drugo) iskljuci
molim te YUSCII kod. Kao drugo probaj bez "far" poziva izbaci "asm dummy:"
i stavi dummy: (labela u C <=> labela u assemberu- u ovom slucaju) - na MSC
radi. Evo jednog resenja:
/* FAR poziv */
main()
{
unsigned long a;
printf("Zdravo\n");
/* sada sledi gosub */
_asm mov bx,offset a
_asm mov ax,seg dummy
_asm mov word ptr [bx+2],ax
_asm mov ax, offset dummy
_asm mov word ptr [bx],ax
_asm call dword ptr [bx]
/* ovde je kraj gosub */
printf("RETURN executed\n");
goto end;
dummy:
printf("GOSUB executed\n");
/* ovde je return */
_asm retf
end:;
}
/* NEAR poziv */
main()
{
printf("Zdravo\n");
/* sada sledi gosub */
_asm call dummy
/* ovde je kraj gosub */
printf("RETURN executed\n");
goto end;
dummy:
printf("GOSUB executed\n");
/* ovde je return */
_asm ret
end:;
}
NB.
cccc.208djelovic,
-> #206, djelovic Mali lapsus: trebalo je call far ptr dummy, i
sve je OK. Compiler proizvodi .ASM fajl koji dalje mora
da se prevede ručno, jer izgleda TASM 1.0 koji je ugrađen
u TC++ ne može da se snađe sa forward referencama.