cccc.1dejanr,
Iako "mlađi" od većine konkurenata, C je među programerima
zaradio ogromnu reputaciju - najveći deo svih komercijalnih
programa za PC (i ne samo za PC) razvijen je upravo na C-u! Na
ovom jeziku je, uzgred budi rečeno, razvijena i aplikacija
koja upravo ispisuje poruku koju čitate.
PC-jevci se ne nalaze samo pred dilemom da li programirati
na fortranu, bejziku, paskalu, C-u ili nekom drugom jeziku već
i pred dilemom na kom C-u - popularni su Microsoft C 5.1 i
Turbo C 2.0 premda u inostranstvu sve više pristalica ima i
objektno orijentisani C++ (zašto C++? C+ bi u C-u bila
sintaksna greška a C++ je OK). Koji je vaš izbor i zašto?
cccc.2lgavrilovic,
TC i MSC
--------
Što se mene tiče koristim oba paralelno, razivijam u TC-u (V2.0)
koji je brži prilikom kompajliranja i ima standalone debbuger
koji mi se više sviđa (Turbo debugger 1.5) od MS-ovog. Što se
rezultujućeg koda tiče zbog optimizacija, veličine koda i brzine
izvođenja kapu treba skinuti MSC-u. Druge kompajlere nisam imao
prilike da probam i voleo bih baš da čujem neke pikanterije od
onih koji ih koriste.
C uopšte
--------
Čini mi se da se mnogo više psihički zamaram prišući u C-u nego u
TPascalu pogotovo kad radim sa stringovima i tekstualnim
fajlovima. Voleo bih da čujem Zorana, SEZAM se uglavnom zasniva
na tekstu...
C knjige
--------
My favorite is "C: The complete Reference" from Herbert Schildt.
Vrlo dobra je "C Power user's guide" od istog autora. Obe su
izašle kod McGrow-Hill-a. Prvu uzmite ako zaista želite naučiti
(i redovno koristiti C). Drugu uzmite ako vas mrzi da pišete
prozore, menije i ostale osnovne stvari.
Treća knjiga koju bih toplo preporučio svima koje interesuje 3-D,
grafika , CADD i C je: "Interactive 3D computer graphic"
Leendert-a Ammeraal-a u izdanju "John Wiley & Sons Limited",
Distribution Centre, Shirpney Road, Bognor Regis, Sussex,
PO22 9SA, England.
Knjiga ima primere za Turbo C V1.5 (zbog BGI-a) a autor nudi i
disketu sa kompletnim sorsovima iz kjige (od 200 do 249 str. je
sve samo sors)
---------------------------------------------------------------
PRO - C
-------
Verziju 1.3 ProC-a dobio sam krajem Jula 1989. Program je zaista
lep i lepo zamišljen, radi sa gomilom popularnih DB ekstenzija
ali... Čuvajte se ove verzije. Ako imate neko izracunavanje i
radite ga u promenljivoj zatim ga želite vratiti u record, nećete
uspeti. Izgleda da postoji neki bug koji ni autori nisu
primetili. Pošto PRO-C generiše sors u C-u logično je pomisliti
da ga je lako prepraviti. NE! PRO-C je izuzetno produktivan
50-60K sorsa (po fajlu) nije ništa za njega pogotovo ako imate
pointer na pointer filozofiju. I još jedna opaska: Kada završite
projekat iskompajlirate ceo sors EXE datoteka će vam vrlo lako
biti 100 i više K. Ako još želite da vam poruke budu na našem
jeziku videćete da autori i nisu bili uvek dosledni. MSG-ovi su
doduše stavljeni u jedan .H, ali iznenadićete se kada budete
usanovili da su neki i u biblioteci (i to baš u onoj za koju
nemate sors u workbenchu). Znate ono "dva loša ubiše Miloša"?
(two bed miloš dead).
Da ga ne bih suviše kudio (a ima još toga) reći ću nekoliko
lepih svari:
* PRO-C generiše izuzetno lep C kod. Ako neko uči C trebalo bi
da pogleda kako treba da izgleda C program. Štaviše PRO-C gene-
riše i komentare u sorsovima.
* file I/O funckije su centralizovane u neku vrstu SHELLa pa
jednostvnim menjanjem broja prebacujete se sa jednog DB sistema
na drugi (u već izgenerisanom sorsu)
* Vrlo lako se generišu maske za unos i preklapajući meniji.
Koncipiran je tako da mogu se koristiti samo ove opcije za
generisanje delova koje ćete kasnije ugraditi u svoj program.
* Help je razrađen do ludila, sve se može promeniti.
* Data je biblioteka rutina koje koisti PRO-C u SORSU
(Workbench) i detaljno opisana svaka funkcija.
* Genrisana dokumentacija je toliko detaljna da to može i da
zasmeta.
Sve u svemu lep program koji će vas izdati kada to najmanje
budete očekivali. Nadam se da će bugovi biti ispravljeni u
sledećoj verziji.
p.s. Jedan Novosadski (softverski) privatnik već dugo traži
finansijera za zastupništvo za PRO-C za Jugoslaviju (u šta bi
ušlo prevodjenje kompletnog programa i dokumentacije na naš jezik
i ispravka postojećih bagova). Kaže mi da je od Jasenica do
Đevđelije tražio pomoć i da je neverovatno koliko ljudi nemaju
razumevanja za ovako nešto. Zahvaljujući njemu imao sam prilike
da upoznam i isprobam paket. Ovaj tekst je dobio njegovu
saglasnost.
------------------------------------------------------------
C - YACC - LEX
----------------
Ima li neko kakvu dokumentaciju o YACCu i LEXu i uopšte o UNIX
utilitiy-ima za programiranje u C-u?
GWW
p.s. Da otvorimo temu C funkcije? Kažu da ako C funkcija
prelazi 20 redova treba je ponovo napisati - jednostavnije.
p.p.s.
Kažu da je perverzija ako imate tri zvezdice u programu (pointer
na pointer na pointer na sadržaj) neki pominju sa du videli
programe sa četiri i pet. Ja lično nisam upotrebio više od dve.
Ima li neko sa više ?
cccc.3zzivotic,
Sasvim se slažem - pisanje u C-u zahteva prilično koncentracije
ali na kraju ispadne brže. BB zaista počiva na samo dva elementa -
string i file operacijama.
S obzirom da sam dugo vremena koristio Turbo Pascal mislim da mogu
da procenim da bi pisanje BB-a trajalo bar duplo duže u paskalu
a ne verujem da bi neke stvari mogle uopšte biti ugrađene u tom
slučaju.
Što se tiče konstrukcija tipa ******ptr ne vidim šta je tu
neobično - dva indirektna adresiranja su svakodnevna pojava (mnogi
deklarišu main( int argc, char **argv ), tri se često koristi a
najveći broj sam upotrebio u BB-u - 7. Ne smatram to nikakvom
perverzijom - naprotiv vrlo zgodan način za dinamičko adresiranje
složenih struktura.
cccc.4ilja,
7 zvezdica????? Nemoguce! Pa zasta bi tako nesto bilo potrebno?
cccc.5vkostic,
TURBO C (2.0) ima daleko vise funkcija nego MSC 5.0 koje omogucavaju
da se lakse pisu profesionalni programi za IBM PC masine. Ja volim da
pravim male izmene u programu i odmah vidim kako to izgleda - da
koristim MSC 5.0 posedeo bi! Ne koristim TC nego iskljucivo TCC - ne
volim mnogo sarene prozore i menije, a naj vaznije od svega, sa TCC
mogu direktno da pisem na asembleru u sred C programa.
Inace, odusevljen sam kako TURBO C (2.0) i MSC 5.0 generisu
optimizovani kod. Svojevremeno sam za potrebe predavanja na jednom
kursu masinskog jezika napisao program za igru LIFE na asembleru.
Posle sam istu stvar (sa potpuno istim algoritmom) napisao na C-u. I
C je radio brze! Istina, to je bio kurs za pocetnike, pa nisam
koristio sve hakerske trikove u programu na asembleru, ali ipak...
TURBO DEBUGER 1.0 divno zamisljen proizvod sa predivnim mogucnostima,
ali i sa gomilom gluposti! Zasto ne moze da se single step-uje kroj
pozive DOS-u i BIOS-u. Jeste da to obicno ne treba, ali meni je par
puta bas zatrebalo da vidim sta to DOS radi. Mogo bi jos dugo da
nabrajam sitne bubice u tom programu. Dali neko ima iskustva sa
verzijom 1.5?
cccc.6lgavrilovic,
Nisam bio dugo ovde (oko 7-8 dana) pa da se priključim:
1. O pointerima na pointere:
U principu više volim da pišem main(int argc,char *argvŠĆ) umesto
char **argv jer meni je logičnije da smatram parametre kao niz
stringova nego kao neku vrstu matrice karaktera. Dakle nisam
sasvim oduševljen da razmišljam suviše "nisko" te mi se više
sviđaju konstrukcije tipa ŠnĆ nego *(ptr+n). Kada se uzme u
obzir ovaj drugi pristup broj "zvezdica" se naglo povećava.
2. C
Ja takođe koristim TCC umesto TC-a iz razloga lakšeg rada sa
bibliotekama (lepši je MAKE) a i zbog toga što moja mašina ima
"samo" 512 KB.
3. Turbo debugger 1.5
Nema mnogo pobobljšanja u odnosu na 1.0 bar za C. Dodata je
opcija View - Hierarhija zabog "OO" pascala. Molim Vladu da
obrazloži buggove. Da se zna o čemu se radi. Ja inače koristim
source i variable window, a od ostalih ponekad dump fajla i
inspect. Watch mi je neprijatan, break pointi zgodni (pogotovu
havtanje menjanja variable) ali više koristim kombinaciju F4, F7.
4. O debuggerima
Specijalno za Vladu !!
Jesi li probao Quaide Analizer. Sve vrvi od nedokumentovanih DOS
poziva (i u command.com-u) recimo switch char? Možeš da
patch-uješ interapte itd. Malo je nepregledan ali je prozor u
mašinu. Još nešto, možeš da se zakačiš za mašinu pre DOS BOOT-a.
Javi se, pozdrav od starog drugara (seti se Galaksije+, i
Beogradskog sajma još kada je "Ekranski editor" bio aktuelan, i
ekipe Beca, Milanče i ja)
5. Pitanja za magove C-a
Prilikom pisanja funkcija sa promenljivim brojem parametara
fff(...) natrčao sam na problem deklaracija, ne neki veliki jer
sam uspeo da ga rešim ali bi me znaimalo neko pravilnije
rešenje. Dakle ako se funkcija deklariše u istom fajlu kao recimo
int fff(int pp, ...);
a posle normalno definicija kao
int fff(int pp, int qq, int rr)
š
.
.
ć
stvar pada jer javlja redeklaraciju funkcije.
Ukoliko se stvar okrene, pa se u definiciji funkcije ne navedu
ostali paramteri kako im simbolički pristupiti? Padalo mi je
napamet da ih nekako skidam sa steka ali nije mi se svidjalo da
pravim neko psovanje na početku funkcije.
Stvar je izgleđena ovako:
U fajlu je nisam deklarisao, stavio sam je u biblioteku, u
glavni program deklaraciju i jedina stvar koja se javlja je
upozorenje prilikom kompajliranja definicije da funkcija nema
deklaraciju. Uzgred i printf je deklarisan slično pa postoji
mogućnost zaboravljanja variabli. Možda bi overloading funkcija
rešio stvar jedva čekam da mi neki C++ padne pod ruke.
U stvari nije problem da se koriste funkcije sa promenljivim
brojem paramtera i istorodnim paramterima int int int ...
je riste paramatere koristitie za različite operacije ali kako
preneti raznorodne paramtere na pr u jednom slučaju
fff(char *s,int pp, int qq)
a u drugom
fff(char *s,char *pp)
cast ?
---------------------
C izgleda voli takve dvosmislenosti pa evo još jednog sličnog i
opet pitanja:
Kao što sam napomenuo više volim da radim sa nizom nego sa
pointer aritmetikom. U TC-u globalnih variabli ne može biti više
od 64K bez obzira na memorijski model. Postavlja se problem
velikih nizova. Postoje naravno linkovane liste i slična rešenja
ali Q&A fajl daje još jedno rešenje:
Q. How do I declare an array that's greater than 64K?
A. Arrays greater than 64K must be allocated off the heap. If,
for example you wanted a two-dimensional array of characters
that was 1024 by 128, the declaration you would expect to
write would be:
char arrayŠ1024ĆŠ128Ć;
But since the size of this array is greater than 64K, it must
be allocated off the heap. An example of this is:
#include <alloc.h>
char (huge *array)Š128Ć;
:
main()
š
:
array = farcalloc(sizeof(*array), 1024);
:
ć
The array can be accessed with the same code as an array not
allocated off the heap. For example:
i = arrayŠ30ĆŠ56Ć;
will assign "i" the value stored at the 31st by 57th element
in "array".
no to rešenje mi nije ogovaralo iz razloga što koristim i MSC, u
njemu bi to moglo sa _fmalloc a možda ću i neki hipotetični za
koji nisam siguran da će koristiti ovakve trikove. No ima još
jedan štos koji je prenosan:
char *ptr;
main
š
maloc....
fff(ptr);
ć
fff(char arrayŠnnnĆ)
š
.
.
.
ć
Pitanje:
Opet sam se bio izvukao uz poruku suspicious pointer conversion.
Nije problem u velikim nizovima, to je ekstremni slučaj problem
je u svim no char nizovima koji se alociraju po Heap-u.
Dakle kako izbeći ove nedoslednosti ?
GWW
cccc.7vkostic,
Zdravo Ljubisa!
Ovo je jedan primer kako se koristi funkcija sa promenljivim
brojem parametra:
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
void main()
š
void test(int,...);
test(5,1,2,3,4,5);
test(7,1,1,1,1,1,1,1);
ć
void test(int c,...)
š
int i,x;
va_list argp;
va_start(argp,c);
for(i=0; i<c; i++) š
x=va_arg(argp,int);
printf("%dĐn",x);
ć
va_end(argp);
ć
>> U stvari nije problem da se koriste funkcije sa promenljivim
>> brojem paramtera i istorodnim paramterima int int int ...
>> je riste paramatere koristitie za različite operacije ali kako
>> preneti raznorodne paramtere na pr u jednom slučaju
>>
>> fff(char *s,int pp, int qq)
>>
>> a u drugom
>>
>> fff(char *s,char *pp)
>>
>> cast ?
Koristi isti primer koji sam ti dao gore. Deklarises samo jedam
parametar, a ostale vadis sa:
xxxx= va_arg(argp,int);
Ako hoces da uzmes int, stavis int. Ako ti treba float, stavis float,
( va_arg(argp,float); ),itd.
Bar jedan parametar moras da navedes u opisu funkcije da bi
funkcija na osnovu njega nekako znala koliko jos parametra sledi i
kakvog su tipa.
Tipican primer je printf koji na osnovu pocetnog stringa tipa
"%d %f ... itd" izbroji koliko ima parametra, a onda ih zavisno od
tipa skida sa va_arg(argp,int) ili va_arg(argp,int) , itd.
Pozdrav, VK.
P.S.
Upravo se spremam da isprobam QUAIDE ANALIZER.
cccc.8zzivotic,
Ima li neko iskustva sa blokiranjem prekida programa kompajliranog
za Microsoft C u trenutku kada nastene floating-point greška? Po
dokumentaciji bi trebalo zameniti lib rutinu matherr svojom u kojoj
bi se greška na drugačiji način obrađivala (a ne prekidanjem
programa) ali izgleda da ima problema - recimo overflow koji nastaje
nakon običnog množenja izgleda da ne može da se presretne na ovaj
način?
Zoran
cccc.9bjankovic,
U Turbo C-u handler za DivideByZero, Overflow i neke FP
exceptions deklarisan je u SIGNAL.H, trebalo bi da je tako i u
MSC. U TC matherr ne reaguje na integer Overflow.
B.J.
cccc.10vkostic,
U jednoj od ranijih poruka sam napisao da vise volim da koristim
TURBO C nega Microsoft C. E, pa od sada jos vise volim TURBO C, a
jos vise mrzim Microsoft C.
Napisem program koji kompilovan sa TURBO C 2.0 radi savrseno.
Kompilujem isti taj program sa Microsoft C 5.0, i tras!
Program ne radi. Bug je bio u kompajleru...
Jedna sekvenca programa je izgledala ovako:
regs.h.ah=0x2F;
intdos(®s,®s);
Medjutim, to je Microsoft-u smetalo zato sto funkcija DOS-a 2F
zabrlja DS registar. Kada sam napisao:
regs.h.ah=0x2F;
intdosx(®s,®s,&sregs);
onda je sve radilo savrseno.
Nemam uputstva za Microsoft C pri ruci da proverim sta kaze za
intdos(), ali ja ovu glupost smatram za cist bug kompajlera.
Zasto poziv neke DOS funkcije nebi smeo da smesti povratne
informacije u neki segmentni registar?
I sama funkcija DOS-a 2F je biser za sebe. Vraca pointer (DS:BX)
na FAT ID BYTE (i pri tome zabrlja jako vazan DS registar),
umesto da taj FAT ID BYTE smesti u BL i zavrsi posao.
Inace, program preveden (uz speed optimizaciju) sa TURBO C 2.0 je
dugacak 8360 bajta, a sa Microsoft C 5.0 9183 bajta.
Pozdrav, V.K.
cccc.11dbulat,
Long live to MSC 5.10.
Oni koji ga ne vole, neka samo i dalje tako misle. Bez obzira na
njegovu sporost, nisam naisao na takve probleme koji proizilaze iz
neispravnosti kompajlera, dok sa TC 2.0 jesam. Na Zagreb BBS-u
postoji jedan fajl sa patchevima za TC 2.0 jerbo taj kompajlet ima
bagova kao pas lutalica.
Za Vladu K.
Steta sto si pokusavao uopce programirati u C-u tako da pozivas
registre i slicne "prljavstine". Da se do sada vec nisi afirmirao kao
programer, pomislio bih da si samouki haker.
Pozdrav!
Darko
cccc.12vkostic,
Zdravo Darko,
MSC 5.1 ne koristime jer je hiper glomazan, a osim podrske za
OS/2 nema prednosti u odnosu na 5.0 (jedino nekoliko novih
pragma, i slicno). Zato jos uvek koristim verziju 5.0.
Long live MSC 5.10 ????????????!!!!!!!!??????????!!!!!!!!!???????
Neki vole da posede ispred racunara kok on kompiluje! Jedini
nacin da se koristi MSC za neki ozbiljniji program je RAM DISK od
par megabajta. Ili razbiti program na vrlo *male* delove, pa sa
MAKE...
Ako mislis da sa MSC stampas na ekranu "HELLO WORLD", onda je sve
OK. Ali ako mislis da radis nesto malo ozbiljnije, onda su pozivi
DOS-u i BIOS-u *neophodni*. MSC 5.0 jednostavno nema funkcije
koje bi adekvatno iskoristile sve resurse BIOS-a i DOS-a. Voleo
to ili ne, moras da se petljas sa registrima.
Pozdrav, V.K.
cccc.13bojanp,
Vlado, jedno pitanje za tebe:
Da li ne volis da citas manual-e i on-line help-ove
ili imas piratovanu verziju Turbo Debugger-a pa samim
tim nemas manual-e koje bi mogao da citas?
Neznam sta je u pitanju, ali kao programer nadam se da je ono
prvo. (Zivim od pisanja software-a kao i ti.) U Turbo Debugger-u
*mozes* da sinle step-ujes kroz funkcije DOS-a i BIOS-a. Jedino
sto za to treba da koristis naredbu *Instr* (taster Alt-F7), a
ne naredbu step (Alt-F7). Po meni ovo nije mana, nego prednost!
Jer, ako realno gledamo kada debug-ujes program koji pise, u
99.99% slucajeva te ne zanima kako funkcija operativnog sistema
sistema radi, vec sta radi, a tada ti single step-ovanje kroz
funkciju ne treba.
Sta pojam "bubice" podrzumeva? Da li bug-ove posle kojih se sve
"raspada" ili na cudi kao sto je ovo gore (koja nije tacna)? Ko-
ristim Turbo Debugger 1.0 vise od godinu dana i nisam naisao ni
na jedan bug. Ako oni stvarno postoje, voleo bih da ih navedes,
kako zbog mene, tako i zbog drugih koji koriste TD.
Inace smatram da se Turbo Debugger ne moze porediti sa
CodeView-om, od kojeg je n puta bolji (n -> +oo).
Bojan
P.S.: Sta mislis da se otvori tema o programerskim alatkama?
cccc.14vkostic,
Kada imam gresku u programu, obicno je pronalazim cisto misaonim
putem. Lakse mi je da minut dva analiziram program i razmislim
gde stvar skripi, nego da pola sata single step-ujem kroz
program. To je bar moj stil rada. Zato TD ne poznajem previse
dobro.
Slazem se da u 99.99% slucajeva nema potrebe da se single
step-uje kroj op. system. Ali ponekad i zatreba. U nekoliko
retkih situacija kada sam koristio TD, to mi je bas trebalo.
Konsulovao sam uputstva, ali za F7 je bas pisalo da ne moze da
single step-uje kroj INT pozive. Nigde u blizini nije pisalo da
treba pogledati ALT F7. A kada je progrm trebala da bude gotov za
juce, onda nemam puno vremena da citam uputstva.
Nekada sam imao TI-99/4A, knizicu od 100 strana i BASIC sa 30
naredbi. I sve sam ih naravno znao napamet. Dana ***ne mogu*** da
programiram, a da nemam tone prirucnika pored sebe. Ne mogu ni da
napisem tri linije, a da ne gledam u Norton guide, MS DOS
technical ref, ili uputstvo za kompajler. Stotine BIOS poziva,
stotine DOS poziva, hilajde funkcija C jezika, hiljade naredbi
masinskog jezika, stotine opcija jednog kompajlera, pa drugog
kompajlera, pa asemblera, pa debuggera,... Kako se vremena
menjaju!
TD je lep proizvod, ali i dalje tvrdim da nije idealan. Pre svega
*guta* memoriju. Drzim da je stari dobri FSD prava stvar. Nema
menije, nema prozore, nema sarene ekrane, ali radi posao. I ni
jednom me nije izneverio kada sam bio u zurbi da hitno otkrijem
greske u programu. Code view nisam koristio.
Tema o programskim alatima? Dobra ideja!
Pozdrav, V.K.
cccc.15dejanr,
>> Turbo Debugger guta memoriju...
Na 386 mašinama Turbo Debugger može da odleti u expanded memoriju
posle čega uzima 0 (dobro, par više ali zanemarljivo) bajta osnovne
memorije i prema tome da debaguje proizvoljno veliki program! Mislim
da mu je to jedna od jačih prednosti nad CodeView-om.
cccc.16vkostic,
Slazem se. To je idealno resenje za velike programe. Ali dok ne
nabavim neku 386 (ili bar 386SX) masinu, memorija ostaje prblem.
Mislim da je TD suvise iskomplikovan. Podrzava C i Pascal (i
assembler naravno), a ta dva jezika se bitno razlikuju. Mogli su da
naprave dva paketa - TD za C i TD za Pascal, i tada bi svaki bio
znatno kraci od postojeceg TD.
Pozdrav, V.K.
cccc.17vkostic,
U jedoj od ranijih poruka sam pisao o glupostima MSC-a. Sada je
na red dosao TC 2.0
TC za rad sa fajlovaima ne koristi FCB nego file handlere.
Ispravan pristup. Samim tim, TC pretpostavlja da DTA podrucje
nije od neke velike koristi, osim za funkcije DOS-a 4E i 4F.
Ispravan pristup. DTA je dugacko tacno 128 bajta - tako bar kazu
svi DOS prirucnici. Istina, DOS ne koristi svih 128 bajta. Ali
ako Microsoft kaze 128 bajta, onda se to mora postovati. E, tu
dolazi na red TC koji to ne postuje.
Desilo se da je TC neke eksterne varijable smestio bas na kraj
DTA podrucja! Sta mu je to trebalo, bog ce ga znati. Desilo se i
to da je moj program upisivao neke vrednosti u DTA (pretposta-
vljajuci da je DTA dugacko 128 bajta).
Rezultat? Eksterne varijable su pocele da dobijaju neke cudene
vrednosti.
Eh, Borlande, postuj ono sto Microsoft kaze!
cccc.18vkostic,
Evo i malo dublje analize prethodne poruke.
Ove je program:
------------------------------------------------------------
/* TURBO C 2.0 tcc -G -a -O -r -Z -ml TEST.C */
#include<stdio.h>
#include<dos.h>
#include<dir.h>
int x;
struct ffblk f;
void main()
š
printf("%pĐn",getdta());
printf("%pĐn",&x);
findfirst("C:ĐĐ",&f,0);
printf("%pĐn",getdta());
ć
------------------------------------------------------------
A ovo su rezultati njegovog rada:
28D1:0080
2A9B:03CC
2A9B:03A0
Prvi broj (28D1:0080) pokazuje da se DTA nalazi gde treba (na
offset-u 80H unutar PSP). I drugi broj - adresa eksterne
varijable x - je ok.
Ali posle poziva findfirst() stvari se menjaju. Treci broj
(2A9B:03A0) pokazuje da je funkcija findfirst() premestila PSP u
podrucje eksternih varijabli.
Sada se varijabla x nalazi samo 44 bajta od pocetka DTA podrucja.
A DTA podrucje ima 128 bajta!
cccc.19lgavrilovic,
Super! 'Prekopao' sam po .H i video kako je deklarisan printf.
Često čovek od šume ne vidi stabla.
Šta je sa drugim problemom ?
P.S. DELBAK ?
P.P.S. Čitajući raspravu o XRD-u palo mije napamet da preuredim
DELBAK. Nikad nisam razmišljao o brzini njegovog izvođenja
verovatno da zato što prikazuje šta radi a to već drastično
usporava program. Imaš kakvo mišljenje o tome ?
GWW
cccc.20vkostic,
Opet problemi sa TC 2.0 i MSC 5.0. Ovog puta se radi o funkciji
int86x().
Ne mogu da utvrdim gde je tacno problem, ali nesto sigurno nije
uredu. Mislim da u jednom trenutku pobrljavi sa stekom. Sve radi
savrseno, poziva se nekih 30 puta ta kunkcija, a onda 31 put
odjednom se obesi sistem. Inace, sa tom funkcijom pozivam BIOS,
int 13h service 02h. Kada umesto int86x() stavim int86(), onda je
sve OK.
Vrlo je interesantno da i TC i MSC imaju isti problem. Verovatno
je krivac int 13h.
Dakle, paznja ako koristite int86x() ili int 13h service 02h.
cccc.21vkostic,
Evo jos jednog bug-a u TC 2.0. Radi se o funkciji intr().
Norton Guide za tu funkciju kaze da se poziva ovako:
--------------------------------------------------------------------
intr() Alternate 8086 Software Interrupt Interface
#include <dos.h>
void intr(intr_num,preg);
int intr_num; Interrupt number
struct REGPACK preg; Pointer to structure
intr() generates an 8086 software interrupt specified by 'intr_num'.
The register values from 'preg' are copied into the registers before
the software interrupt is executed. After the software interrupt
completes, intr() copies the current register values into 'preg'.
The flags are preserved. The arguments passed to intr() are:
intr_num the interrupt number to be executed
preg the address of a structure containing
the input registers before the call, and
the value of the registers after the
interrupt call.
The 'REGPACK' structure has the following form:
struct REGPACK š
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_es, r_flags;
ć;
Returns: There is no return value. 'preg' contains the
value of the registers after the interrupt call.
--------------------------------------------------------------------
Lepo, ja sam to i uradio, ali program je krahirao. Nije me mrzelo
da single step-ujem kroz program i ustanovio sam ovo:
Vrednost iz regpac.r_bp se ne prenosi korektno u BP registar
procesora! Sta vise, pre poziva interapta u BP se nalazi neka
sasvim leva vrednost.
Bug se nalazi u instrukciji:
MOV BP,ŠBP-1EĆ
koja se nalazi odmah ispred INT poziva. Tu se Borland preracunao,
trebalo je da stoji:
MOV BP,ŠBP-22Ć
u tiny, small, medium, compact, i large memorijskim modelima, a
MOV BP,ŠBP-24Ć
u huge memorijskom modelu.
Bas lepo! Neko ce reci da blagosloveni MSC 5.1 nema takav bug, ali
MSC i nema funkciju intr().
U stvari, neverovatno je da se u strukturi REGS koja sluzi za
funkcije int86(), int86x(), intdos(), itd, jednostavno nema
registar BP. Jeste da se taj registar obicno ne koristi za prenos
podataka pri INT pozivima, ali postoji bar jedan INT poziv koji bas
koristi taj registar. A meni je trebao upravo taj INT poziv.
cccc.22vkostic,
Imam problema sa huge pointerima sa MSC 5.0.
O huge pointerima Norton guide kaze ovo:
---------------------------------------------------------------------
huge huge─Non-Standard Type Modifier
Huge pointers are similar to far pointers, in that both are 32-bit
pointers containing a 16-bit segment address and a 16-bit offset.
Huge pointers, however, are normalized, which means that as much of
their value as possible is stored in the segment address. This means
that the offset portion of a huge pointer cannot be larger than 15
(base 10), because segments start every 16 bytes (base 10).
---------------------------------------------------------------------
Lepo. Probao sam da uradim ovo:
void main()
š
char huge *p;
p=(char huge *)12345678L;
printf("ĐnĐn%pĐn",p);
Tu su i Turbo C i Microsoft C stampali isti rezultat: 00BC:614E.
Ocekivao sam da cu dobiti normalizovan rezultat 06D0:000E, ali dobro.
Dalje:
p++;
printf("%pĐn",p);
Tu je Turbo C stampao: 06D0:000F sto pokazuje da je normalizovao
rezultat prilikom sabiranja. To se upravo i ocekivalo.
Medutim, Microsoft je zakazao, stampao je 00BC:614F. Rezultat je
ispravan, ali nije normalizovan. U cemu je onda razlika izmedju
far i huge kod Microsoft-a?
Dalje:
p+=170000L;
printf("%pĐn",p);
ć
Tu je Turbo C ponovo blistao: 3051:000F. Microsoft je potpuno
zakazao: 00BC:F95F. Rezultat ne samo da nije normalizovan, nego
je pogresan.
E sada se ja pitam ko ju tu lud. Dali je moguce da Microsoft
tretira huge pointer kao obican far pointer? Ili ja neznam da
koristim CL? Ili Norton guide laze?
Sledeci primer kompilovan sa MSC 5.0 je samo potvrdio gore iznetu
pretpostavku:
void main()
š
char huge *p;
p=(char huge *)((0x4C0BL<<16L)+0x000FL);
printf("Đn%pĐn",p);
p++;
printf("%pĐn",p);
ć
Program je stampao: 4C0B:000F i 4C0B:0010 sto pokazuje da MSC
jednostavno ne ume da normalizuje huge pointer.
Dali jos neko ima ovakva iskustva sa huge pointerima?
Pozdrav, V.K.
cccc.23vkrstonosic,
Pozdrav svim Velikim Programerima,
Ja imam jedan mali problem: Radims a C-om 5.0 naravno MS, a imam
herkules karticu. Pošto MS C 5.0 i QC kao i većina MS programa, ne
podrzavaju herkules, molim Velike programere ako neko ima neko
rešenje daŰĆ mi pomogne. Ili ako neko ima dobar simulator CGA za
herkules.
Unapred zahvalan,
Vladimir Krstonošić
P.S. Ako imate neko rešenje, javite se ili u ovoj konferenciji ili
pošaljite poruku lične prirode (PLP).
cccc.24godza,
Helo,
koristi msherc.com koji dobijes uz msc 5.1 ili bsherc.com (ili tkao
nekako koji je isti fajl), koji se dobije uz quick basic
pozdrav Godza
ps
fajl uz basic se zove qbherc.com
:-)
cccc.25cuba,
YACC, LEX UNIX utility
Kome treba dokumentacija, mogu je iskopirati iz prirucnika za
HP UNIX, vazi i za RATFOR, LINT, itd
Cuba
cccc.26amiler,
Pre svega zdravo svima. Koristim Turbo C 2.0 i hteo bih da postavim
pitanje;
hteo bih da koristim nasa slova u svojim programima i to koristeci
fajlove
SANS.CHR, TRIP.CHR,..., odnosno eksterne fontove zapisane u
vektorskom obli-
ku u ovim fajlovima. Da li neko zna "sintaksu" zapisa ili da li neko
vec ima
gotove fajlove koje bi ustupio? Hvala, pozdrav Alek.
cccc.27bojanp,
Autor programa BIS (brojke i slova) koristi Borlandov BGI interface,
a u programu se sasvim lepo pojavljuju i YU slova. Zato najbolje
pitati njega ili nekog koje "ceprko" po BGI interface-u.
Bojan
cccc.28vkostic,
YU slova u grafickom modu su definisana u fajlovima *.CHR. Ako je
neko ceprkao po tim fajlovima i definisao YU slova, moga bi to da
posalje na Sezam. Svima bi kad-tad koristilo.
Pozdrav, V.K.
cccc.29majkl,
>> Autor programa BIS (brojke i slova) koristi Borlandov BGI
>> interface, a u programu se sasvim lepo pojavljuju i YU
>> slova...
Priroda problema kod programa BIS nije zahtevala
intervenciju na TRIP.CHR, GOTH.CHR... naša slova (ŠČĆ) se
dobijaju iz slova C i S prostim docrtavanjem 'kukica' napisanim
procedurama. Za druge primene ovo sigurno nije dobro rešenje.
Treba 'čeprkati' ne samo po *.chr datotekama nego i po
odgovarajućim *.obj fajlovima.
Pozdrav,
Majkl
cccc.30majkl,
Za one koji žele menjati .CHR datoteke...
Kratka analiza LITT.CHR (a slično je i sa ostalima) je
pokazala sledeće:
- definicija svakog slova data je u vektorskom obliku, pri
čemu dužina definicije varira od slova do slova
- pre samog kraja definicije slova postavlja se vektor na
poziciju za sledeće slovo (tako da je lako izmeniti da ispis
bude 'proportional' ili ne)
- završetak definicije slova označen je sa 00h 00h
- pošto dužine definicija slova variraju, postoji tabela koja
ukazuje na početne bajtove definicija (kod LITT.CHR tabela
počinje od adrese 90h) slova
- slovo je definisano nizom parova bajtova, prvi utiče na
pomeranje po X osi, a drugi na pomeranje po Y osi
funkcija pojedinih bitova je otprilike sledeća:
0 - nepoznato (uvek treba da je 1)
1 - pravac vektora 0 udesno 1 ulevo
2..7 - dužina vektora
8 - 0 samo skok 1 povlači liniju od tekuće pozicije
ka novoj poziciji
9 - pravac vektora 0 gore 1 dole
10..15 - dužina vektora
Na kraju prilažem izmenjenu datoteku LITT.CHR koja na
odgovarajućem mestu ima definisano slovo Ž. Za ovo slovo je bilo
dovoljno mesta u datoteci jer je i odgovarajući ascii znak
komplikovan, što nije slučaj kod zamene uglastih zagrada našim
slovima - tu treba menjati i tabelu pokazivača (da li vam sve
ovo zvuči poznato?).
Pozdrav,
Majkl
litt.zipcccc.31amiler,
>> - slovo je definisano nizom parova bajtova, prvi utice na
>> pomeranje po X osi, a drugi na pomeranje po Y osi
>> funkcija pojedinih bitova je otprilike sledeca:
>> 0 - nepoznato (uvek treba da je 1)
>> 1 - pravac vektora 0 udesno 1 ulevo
>> 2..7 - duzina vektora
>> 8 - 0 samo skok 1 povlaci liniju od tekuce pozicije
>> ka novoj poziciji
>> 9 - pravac vektora 0 gore 1 dole
>> 10..15 - duzina vektora
Pokusao sam da primenim gornji opis ali mi se nista ne
slaze! Na primer opis slova "L" je: 80 06 80 80 84 80 86 00 00 00.
Prema gornjem opisu 8 bit oznacava "skok ili povlacenje linije od
tekuce pozicije", sto bi znacilo da se slovo L ispisuje samo ska-
cuci sa jednog mesta na drugo ali ne i povlacenjem bilo kakve
linije. Vrlo cudno? Pozdrav Alek.
cccc.32majkl,
>> Pokusao sam da primenim gornji opis ali mi se nista ne
>> slaze! Na primer opis slova "L" je: 80 06 80 80 84 80 86 00 00 00.
>> Prema gornjem opisu 8 bit oznacava "skok ili povlacenje linije od
>> tekuce pozicije", sto bi znacilo da se slovo L ispisuje samo ska-
>> cuci sa jednog mesta na drugo ali ne i povlacenjem bilo kakve
>> linije. Vrlo cudno? Pozdrav Alek.
Bitove sam označio od 0 do 15 (a ne 1..16), pa je možda to
dovelo do zabune... Na primeru slova "L" to izgleda ovako:
80 06 (bit 0) = 1
(bit 2) = 0 udesno
(2..7) = 0 X koordinata: 0
(bit 8) = 0 skok
(bit 9) = 0 gore
(10..15) = 6 Y koordinata: 6 tj. skoči na poziciju 0,6
80 80 (bit 0) = 1
(bit 2) = 0 udesno
(2..7) = 0 X koordinata: 0
(bit 8) = 1 skok+ispis
(bit 9) = 0 gore
(10..15) = 0 Y koordinata: 0 povuci liniju do 0,0
(uspravna crta slova L)
84 80 (bit 0) = 1
(bit 2) = 0 udesno
(2..7) = 4 X koordinata: 4
(bit 8) = 1 skok+ispis
(bit 9) = 0 gore
(10..15) = 0 Y koordinata: 0 povuci liniju do 4,0
86 00 (bit 0) = 1
(bit 2) = 0 udesno
(2..7) = 6 X koordinata: 6
(bit 8) = 0 skok
(bit 9) = 0 gore
(10..15) = 0 Y koordinata: 0 skoči na 6,0
(pozicija za naredno slovo)
00 00 kraj def. slova "L"
Pozdrav,
Majkl
cccc.33dejanr,
Izašao je Microsoft C 6.0. Pogledajte FORUM/MICROB poruka 25.70.
Dejan
cccc.34dgergelj,
Posto sam samo knjiski poznavalac C-a molim velike magove da mi
odgovore na sledeca pitanja:
1. da li je moguce, a ako jeste kako linkovat object kod koga je
napravio Lettice C compiler (medium ili small) model (oba imam) sa
object codom koji je kompiliran za large model.
Konkretno pokusavam da povezem Oracle R4.0 sa Turbo prolog-om. Za
prvi paket raspolazem objectima za vezu sa lattice C-om , a drugi
R1.1 moze da se linkuje sa large modelom Lattice C-a.
Unapred zahvalan !!!
cccc.35dkovac,
ű
Nemam mnogo iskustva sa C-om na PC, ali vidim da se tu nalaze
ljudi koji stvaĺĚťĺuraju. Interesira me da li tko ima lib za
C koji sadrzi sve rutine za rad sa dBase odnosno Clipper datotekama
, te da li to uopce radi i ako radi koja su karakteristike. U
Byte reklamiraju taj lib. po cijeni oko 295$ . Mene interesira
da li to stvarno radi i da li tko radi sa time.
Pozdrav Dejan Kovac
cccc.36pbeciric,
TURBO C 2.0
HELP!!!
Kako da linkujem program pisan u Turbo C-u sa BGI-om?
Pozdrav,
Predrag Beciric
cccc.37caka,
Jao, jao, da li bi neko mogao biti ljubazan da mi zipuje
1. stat.h
2. timeb.h
3. types.h
iz Turbo C-a 2.0 i ostavi uz poruku u ovoj konferenciji.
Zaista mi hitno treba, zahvaljujem najtoplije unaprijed.
Caka
cccc.38braca,
Evo ti traženi fajlovi
tc.zipcccc.39caka,
Braco, hvala ti najljep{a, BBS pokazuje svoje prave vrijednosti.
Ti fajlovi idu u direktorij \SYS pa je momak zaboravio da ih kopira
i tako ... Thanks again !
Caka
cccc.40dbasaric,
Posjeduje interni modem prikljucen na COM4. Komuniciram uspijesno
sa PROCOMM-om medjutim ne mogu nikako da zadajem komande modemu
iz mog programa, programe sam pisao u TC,(pokusao sam da experime-
ntisem iz Basic-a ali on ne podrzava COM4).Dok sam imao externi modem
prikljucen na COM2 sve je uspjesno radilo. Znali neko sta treba da
uradim.
Denis
cccc.41vkostic,
Ako je modem prikljucen na COM4, onda mu se ne moze pristupati ni
preko BIOS-a, ni preko DOS-a, jer oba podrzavaju samo COM1 i
COM2.
>> Programe sam pisao u TC.
Da, ali sta si napisao? Ako si koristio funkciju bioscomm (ili
vec kako se zove), onda stvar sigurno nece raditi za COM4.
A nece raditi ni ako si koristio LCOMM od Zorana. Medjutim, mozes
vrlo lako da prepravis LCOMM da prodrzava COM3 i COM4 i onda je
sve OK. Ja sam to uradio, pa mogu da ti posaljem prepravljenu
verziju LCOMM-a.
Pozdrav, V.K.
cccc.42dbasaric,
Hvala Vlado. Tako nesto sam i pretpostavljao jer sam iz TC radio
sa bioscom samo zato sto je na HELP-u pisalo:
int bioscom(int cmd, char abyte, int port);
cmd values are 0 - set comm. parms to abyte
1 - send abyte out
2 - receive a char (in low 8 bits of return
value )
3 - return status
+---------------------------------------+
| PORT IS 0 FOR COM1, 1 FOR COM2 ETC. |
+---------------------------------------+
E, ovo ETC. je bilo problem. Sto se tice LCOMM-a bio bih zahvalan
kada bi
mi ga dostavio.
Denis
cccc.43vkostic,
>> +---------------------------------------+
>> đ PORT IS 0 FOR COM1, 1 FOR COM2 ETC. đ
>> +---------------------------------------+
>>
>> E, ovo ETC. je bilo problem.
Da, stos je u tome sto neki BIOS-i podrzavaju COM3 i COM4, a vecina
ne.
>> Sto se tice LCOMM-a bio bih zahvalan kada bi mi ga dostavio.
OK, saljem Zoranov LCOMM koji sam prepravio da radi sa COM3 i COM4.
Pozdrav, V.K.
lcomm.asmcccc.44dbasaric,
Da li bi neko mogao da mi zipuje TLINK ( samo da nije verzija 2.0 ).
Denis
cccc.45vkostic,
>> Da li neko moze da mi zip-uje TLINK?
Moze, javi se na 011 426-569.
cccc.46bjankovic,
Pokusao sam da sa programom FE (font editor za Borland CHR
fontove) iz arhiva BGITOOLS koji se nalazi na MIPS-u prepravim
neke BGI fontove. Program korektno učita font, editovanje ide
sasvim normalno, međutim datoteka koja se snimi na disk ima
potpuno haotičan header - gotovo sve je pogrešno. Da li je neko
radio sa tim programom i možda zna u čemu je stvar?
B.J.
cccc.47senadm,
Da neko slučajno nema source programa za igru PREFERANS u C-u (ili
nekom drugom programskom jeziku). Biću mu zahvalan ako mi ga prebaci.
Dobro će doći i source-vi drugih kartaških igara.
Gore navedeno potrebno za sirote studente zagrebačkog ETF-a.
Seni
cccc.48vkostic,
>> Da neko slučajno nema source programa za igru PREFERANS u C-u.
Adnan Smajlovic (071/37-256) ima bas sto ti treba. Pitaj ga, mozda
ti da source.
Pozdrav, V.K.
cccc.49vkostic,
Danas sam dobio Microsoft C 6.0 (izvor necu da navedem posto se
radi o maloj piratskoj seansi). Prvi utisci:
┌───────────────────────────┬───────────┬────────────┬─────────────┐
│ Compiler │Comp. time │ Exec. time │ Code size │
Ă═══════════════════════════ě═══════════ě════════════ě═════════════Á
│ TC20 (tcc -G -O -Z -a -r) │ 16 sec │ 509 sec │ 33344 bytes │
├───────────────────────────┼───────────┼────────────┼─────────────┤
│ MSC 6.0 (cl) │ 70 sec │ 490 sec │ 30311 bytes │
├───────────────────────────┼───────────┼────────────┼─────────────┤
│ MSC 6.0 (cl -Ox) │ 87 sec │ --- │ 30199 bytes │
└───────────────────────────┴───────────┴────────────┴─────────────┘
Program koji sam kompajlirao se sastojao od toga da ucita fajl
od 25K, zatim nesto silno mulja sa stringovima i na kraju generise
izlazni fajl od 500K. Sam rad sa diskom oduzima manje oko 8%
vremena. Program nije radio nista sa floating point brojevima.
Rezultati iz tabele pokazuju:
- Da je Turbo C pravi sampion u brzini kompilacije. Microsoft to
radi pet puta sporije.
- Microsoft generise malo kompaktniji i brzi kod.
- Opcija -Ox (max optimizacija) je porizvela vrlo lep i kratak
kod koji na zalost nije radio. Nisam se upustao u analizu gde
je kompajler zabrljao.
Izgleda da ce posle ovo kratke probne seanse Turbo C i dalje
ostati moj omiljeni kompajler.
Pozdrav, V.K.
cccc.50dejanr,
>> - Opcija -Ox (max optimizacija) je porizvela vrlo lep i kratak
>> kod koji na zalost nije radio. Nisam se upustao u analizu gde
>> je kompajler zabrljao.
Jasno je da se mogu iskonstruisati situacije koje optimizator
nikako ne može ispravno optimizovati (npr. do while flag - end
za flag=true će svakako biti optimizovano u "ništa", ali šta
ako neka interapt rutina menja fleg?) ali u normalnim situacijama
nije baš zgodno da kompajler pravi takve nestašluke. Zapravo
MSC pravi dobar i brz kod ali izgleda prečesto pravi brljotine
dok optimizuje.
Zanima me kako su napisali VAX-ov Fortran (za koji se piše da je
najbolji optimizator na tržištu) na kome se (bar meni) *nikad*
nije desilo da nešto pogrešno optimizuje. Kako to da na PC-ju
mora da bude tako kilavo?
cccc.51kanda,
>> Jasno je da se mogu iskonstruisati situacije koje optimizator
>> nikako ne može ispravno optimizovati (npr. do while flag - end
>> za flag=true će svakako biti optimizovano u "ništa", ali šta
>> ako neka interapt rutina menja fleg?)
Bar za ovaj slučaj, leka ima. Dakle, promenljivu flag treba
deklarisati kao volatile (službena reč), čime se prevodiocu stavlja
do znanja da promenljiva flag može menjati vrednost čak i ako se to
iz programa ne može zaključiti. Znači, deklarišeš
volatile int flag ;
... i prevodioc neće (bar ne bi trebao !) optimizovati while
u 'ništa'. Vrednost volatile promenljive (volatile = 'nestalna')
se smatra nepoznatom, bez obzira na dodele vrednosti.
cccc.52zzivotic,
Što više radim sa ovim MSC-om (ja sam osuđen, šta da radim
:( ), sve mi se čini da su u stvari zabrljali samo jednu stvar.
Naime, jedno od jačih sredstava optimizije je upotreba registara
umesto memorijskih lokacija. U verziji 5.0 (5.1) je sa ovim bilo
problema jer se dešavalo da kompajler jednostavno "zaboravi" da
je vrednost registra (naročito ES) u međuvremenu promenjena i da
više ne drži pravu adresu. Nevolja je bila u tome što ova vrsta
optimizacije nije bila posebno kategorizovana pa se nije mogla
direktno isključiti ili uključiti bez uticaja na ostale
optimizacije.
U verizji 6.0 izgleda da je stvar ostala na istom (opet
greši i opet taj ES!) ali sada bar postoji prekidač kojim se
može ovaj tip optimizacije isključiti.
Naravno, prva stvar koju sam probao kada sam dobio kompajler
je da prevedem softver za novi Sezam (uključivši maksimalnu
optimizaciju) i bio sam prilično iznanađen koliko je kod bio
skraćen (što se brzine tiče, ova aplikacija baš nije dobar test
jer nema nekih kritičnih delova po pitanju brzine izvršavanja).
Program je iz prve proradio ali sam brzo otkrio i jedan smešan
bag. Svaki datum koji bi zadao kao parametar neke naredbe (u
formatu ddmmgg) program bi loše preveo pa bi recimo 010190
postalo 01.01.234 i slične gluposti. Rutina koja niz od ovih
šest asci sifara pretvara u datum je izdvojena u funkciju koja
to radi krajnje jednostavno, redom uzima po dva znaka i na "licu
mesta" ih pretvori u decimalni broj (na primer date.day =
(str[0]-'0')*10 + str[1]-'0') i tako tri linije jedna ispod
druge za mesec i godinu - jednostavno da jednostavnije ne može
biti.
Kada sam pogledao kako je to kompajler preveo, zaista sam se
slatko ismejao! U prvoj liniji je u ES sačuvao adresu date
strukture a pošto mu je ES trebao za adresiranje stringa onda je
njegov sadržaj tokom cele rutine prebacivao u razne registre
"žonglirajući" da u njima ipak ostanu nekako i ofseti adresa jer
se optimizator očigleno namerio da tako jednostavnu rutinu
prevde bez korišćnja memorijskih promenjivih. E, tog
prebacivanja je bilo toliko i to u tako fantastičnim
kombinacijama da je jednostavno posle prve dve linije
jednostavno morao da se saplete! S obzirom da će u "Računarima"
biti prikaz ovog kompajlera, pokušaću da ponovim ovu situaciju i
da dam listing - oni koji poznaju asembler će se zaista lepo
zabavljati.
Microsoft izgleda da i ne krije da su preterali! U
dokumentaciji počinje da se pojavljuju i objašenja tipa
"probajte prvo sa ovom optimizacijom koja je jako agresivna
(?!?) pa ako program krahira (!) onda je isključite! Lepo je što
priznaju ali bojim se da to kod većih projekata, bar što se mene
tiče, ne dolazi u obzir.
Pozdrav, zz
cccc.53dejanr,
>> Bar za ovaj slučaj, leka ima. Dakle, promenljivu flag treba
>> deklarisati kao volatile (službena reč), čime se prevodiocu
>> stavlja do znanja da promenljiva flag može menjati vrednost
>> čak i ako se to iz programa ne može zaključiti.
Eh, pa nisam ja ni rekao da leka nema. Ali u tome i jeste stvar
sa greškama kompajlera - on napravi glupost, ti dodaš nešto da
bi ga u tome sprečio. Naravno, prethodno se namučiš da shvatiš
šta je uradio...
cccc.54dejanr,
Q12. What happened to the inportb() and outportb() inline macros
in dos.h?
A. They accidentally got left out. You can copy the definitions
below into dos.h. BTW, there are also definitions for word IO,
but they don't work correctly in this release of the compiler.
void _Cdecl outportb(int portid, unsigned char value);
void _Cdecl __outportb__ (int portid, unsigned char value);
#define outportb(portid, v) __outportb__(portid,v)/* Byte OUT
instruction */
unsigned char _Cdecl inportb(int portid);
unsigned char _Cdecl __inportb__ (int portid);
#define inportb(portid) __inportb__(portid)/* Byte IN
instruction */
Q13. Why does varargs require that arguments be on the stack?
A. I don't know, but many months ago someone from Borland asked if
that would be a reasonable requirement, and no one could think
of a reason why not. (Since then, someone obviously has :-).
Q14. Why does linking with WILDARGS.OBJ cause my program to crash?
A. There appears to be a bug using WILDARGS.OBJ and large model
programs. Expect a fix shortly. Found by Hyman Rosen
74716,3415.
Q15. Why does my large model program not work?
A. If stack checking is enabled, turn it off. Stack check in
large model is said to not work properly.
Q16. What is a good book for learning C++ programming?
A. C++ Primer, Stanley B. Lippman, ISBN 0-201-16487-6.
Q17. Why does the linker complain about missing functions when
I use C++ streams?
A. If you have selected Unsigned Chars:ON, change back to off,
or edit the <iostream.h> file on lines 577, 593, 597 to be
(const signed char *) in place of (const char *).
Q18. Where are the programs TCCNVT.EXE and PRJ2MAKE.EXE?
A. These utilities were not completed in time for shipment, and
should have been removed from the manuals. There is no
information on future plans regarding them.
Q19. Why does my program crash when I link with overlays, but work
ok without them?
A. Are you overlaying any modules that are data-only? Create a
detailed .MAP file, and see if any of the code segments being
overlayed are 0 bytes long. If so, don't overlay that module.
Q20. Why doesn't the preprocessor 'stringize' my macro? This works
OK in TC 2.0:
#define TEMP 5
#define STR(x) #x
printf("TEMP is %s\n", STR(TEMP));
A. ANSI has defined how the preprocessor converts macros. This will
work:
#define STR(x) STR1(x)
#define STR1(x) #x
Q21. Why doesn't MK_FP work the same way?
A. For most arguments to the MK_FP macro you will get the same
results.
However, if you are passing a long value, you may get something
unexpected. You should pass two integers as parameters.
Q22. I'm using overlays and C++. Why does my system crash when
exit()
is called?
A. There is a bug in c0.asm. Either don't call exit() when using
overlays and C++, or make this change to c0.asm, and run
BUILDC0.BAT. To change your c0.asm, follow these steps:
1) unzip the file STARTUP.ZIP in /turboc/examples
2) edit C0.ASM, moving these lines
mov byte ptr cs:JA_JB,72h
mov byte ptr cs:StartExit+1,0
to before the
call _main
3) run the BUILD-C0 batch file
4) link with the new C0x.OBJ file
Q23. Nothing seems to be working. I get crashes when compiling, or
running program that seemed to work before. What's wrong?
A. A common cause of mysterious crashes is using an old mouse
driver. TC (and TD, TProf, etc) use some mouse driver features
that old mice don't have. This allows them to share the mouse
between the program being tested, and TC. An old driver can
cause various problems.
You can get new drivers at these locations:
Mouse Systems Version (415) 683-0617
Logitech Version 4.1 ????
Microsoft Version ????
Q24. Why am I getting memory overwrites at run time?
A. If you link any code that defines CONST segments this will
confuse TLINK. Either you need to add CONST segments to
the proper place in C0.ASM, or remove the CONST segments
from your code.
Q25. How can I tell if I'm linking in improper assembly routines?
A. Create a detailed map file. The segment order should in
general be as follows:
Start Stop Length Name Class Comments
00000H 00433H 00434H _TEXT CODE One or more CODE segments
01AC5H 01D13H 0024FH TZSET_TEXT CODE
01D20H 022C2H 005A3H _DATA DATA One or more DATA segments
022CEH 022D9H 0000CH _SCNSEG DATA
022DAH 02367H 0008EH _BSS BSS The _BSS segment
02368H 02368H 00000H _BSSEND STACK Then _BSSEND with class STACK
02370H 023EFH 00080H _STACK STACK Then finally STACK
Q26. TLink crashes when linking in my own ASM file?
A. If you enabled debugging symbols (/zi), and have multiple symbols
with the same name (@@1:, etc) this may confuse TLINK. Change
the symbol names, or use the (/zd) option.
If any of this information is outdated, or not correct, or if you
have any suggestions for other items to cover, please let me know.
I will try to update this file (and STDANS.TXT on DL5) several times
a year, but only if I get the feeling it is useful to others.
Don Corbitt 74017,3244
Sunnyvale, California
---
Don_A_Corbitt@cup.portal.com
Not a spokesperson for CrystalGraphics, Inc.
Mail flames, post apologies.
Support short .signatures, three lines max.
cccc.55dejanr,
==========================
borland/long.messages #9, from gmussar, 13086 chars,
Tue Jul 17 23:15:06 1990
--------------------------
TITLE: Standard Answers to Frequently Asked Questions:
New, Improved Turbo C++
The following text was posted to USEnet. I seems to have some
origins on CI$.
Don Corbitt (Not for BI) 74017,3244
This file has the goal of answering many of the common questions
seen on BPROGB regarding Borland Turbo C++. I don't represent
Borland, any opinions are my own.
There is a similar file called STDANS.TXT in DL5 of BPROGB. It
answers common questions that apply to TC++ and TC (and programming
in general). This file is specific to Turbo C++ version 1.0.
Overview
==============
Enable warnings.
Many programming errors can be diagnosed by the compiler. If
you enable all warning messages you have a much better chance of
writing programs that work the first time.
Formatted messages
When you leave messages regarding problems, please use the
/POST UNFORMATTED option. Otherwise, CIS (Compuserve Information
Service) will re-format your program into a jumbled mess.
RTM - Read The Manual - readme and helpme!.doc
Before spending $$$ on CIS, it is often useful to read the
documentation. Also, look at the files README and HELPME!.DOC
included with TC. They list fixes to many common programming
errors. The TC++ 1.0 manuals have a lot of good information.
HELP ME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================
If you're just getting started, and nothing seems to be working,
see these questions first:
Q23 - mouse driver incompatible
Q15 - large model and stack checking
Q4 - assembly code and 3rd party libraries
Q24 - assembly code and 3rd party libraries
Q19 - overlays and data-only modules
Q22 - overlays and exit() with C++ or atexit() functions
Q9 - editor hangs when copying blocks of text
TAPCIS
Q1. What is TAPCIS, and how does it help?
A. TAPCIS is a program that calls CIS, checks for new messages,
saves them on disk, and hangs up. Then it lets you examine the
messages at your own pace, write replies, etc. TAPCIS then calls
CIS back, and uploads replies you have written. It saves a lot
on connect charges. GO TAP for more information. It is
shareware, and registration is expected if you like it. Another
program (ATO) is free, but I haven't used it.
OS|2/Windows linking
Q2. Can I use TC for OS|2 or Windows?
A. Windows and OS/2 are both 'strategic areas' for Borland. This
means that eventually BI's main products will work under DOS,
Windows, and OS|2-PM. At this time, the outside world doesn't
know what the timetable is. It doesn't do any good to ask for
specific dates, because the people that know aren't allowed to
say. "Borland does not pre-announce product releases."
Q3. Why is this C++ program illegal?
void main() {
for (int i=0; i<10; i++)
for (int j=0; j<10; j++)
;
}
A. The AT&T C++ 2.0 specification stated that variables can't be
declared in such a way that the initializer may never execute, but
they are still in scope. Turbo C implements this 2.0 rule. This
rule was changed back in the AT&T 2.1 spec, and I expect a future
version from Borland will follow C++ 2.1.
A simple workaround is to add braces around the inner 'for' loop:
void main() {
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++)
;
}
}
Q4. Why does malloc() corrupt memory?
Why does my program fail in mysterious ways?
Why does my program die when linked with TLINK 3.0, but
work with TLINK 2.0?
(etc.)
A. If you are linking in any assembly code, look for the DOSSEG
directive. DOSSEG was defined for a previous version of MSC
compilers, and is not currently needed. In fact, it conflicts
with the segment ordering of Turbo C++. Previous versions of
TLINK ignored the DOSSEG record, so they (often) worked. The
solution is to remove DOSSEG from your assembly source, and
reassemble. If you are linking with third party libraries
and don't have the source, ask them to send you a new library.
If they can't/won't, try linking in the integrated environment,
and find a new library vendor that is easier to work with! :-)
Q5. Why does qsort() give a warning/error, when it worked fine under
TC 2.0.
A. TC++ 1.0 is more strict in ANSI compliance. It is warning you
that your program may not work on certain computers. Two
examples of correct compare functions are:
/* if sorting an array of integers */
int fcmp(void const *p1, void const *p2) {
const int *ip1 = p1;
const int *ip2 = p2;
if (*ip1 < *ip2) return -1;
if (*ip1 > *ip2) return 1;
return 0;
}
/* if sorting an array of strings */
int fcmp(void const *p1, void const *p2) {
return strcmp(p1, p2);
}
Q6. When I use overlays, I get a linker warning that setjmp and
longjmp are multiply defined. Why?
A. OVERLAY.LIB includes its own setjmp and longjmp. This warning
is expected, and correct. You can disable it if you wish.
Q7. Why is Turbo Debugger 2.0 so much slower than TD 1.5?
A. For some machines, TD2 seems much slower, but not on others.
Suggestions for increasing speed are
1) disable execution history
2) update your mouse driver to latest release
3) disable use of mouse in TD
Q8. Can I place third party libraries in VROOM overlays?
A. Yes, if the vendor compiled with the -Y switch, or you have
source and recompile with -Y. If your vendor won't do so,
tell Borland and they will try to encourage them to fully
support VROOM.
Q9. When I try to copy a block in the IDE, the system hangs.
A. There is a bug in the editor - if the file ends in Ctrl-Z, the
last line is not terminated with CRLF, and there are an odd
number of chars in the last line, this will happen.
Workarounds are to terminate with CRLF, or remove the Ctrl-Z.
TC 2.0 inserts Ctrl-Z, while simply saving the file from TC++ 1.0
will strip them.
Q10. I ordered the ProPack upgrade option for $125. Why didn't I
get new TASM manuals?
A. Although TC++ 1.0 is _not_ an upgrade from TC 2.0, the Pro-Pack
part of the package (TD, TASM) is an upgrade. TASM had very few
changes, which are documented, so no new manuals were sent out.
There is a new quick reference guide, which is useful. If you
don't have TASM 1.0 manuals, you should have ordered the $145
special package which is for people that don't have the Propack,
and need all the manuals. A few people threw a tantrum when
their package arrived sans TASM manuals. Borland agreed to send
them TASM 2.0 manuals, and make sure any future purchasers know
what each order contains.
Q11. I ordered the upgrade through Borland for $xxx, and the next
week I found the same package for $xxx-10 at the local
"Software Is Us"store? Why is Borland ripping off its loyal
customers!!!!!
A. There are two parts to this answer...
1) Take a deep breath, count to ten, exhale slowly.
Now that you feel more relaxed...
2) C++ is a new product, so the special deals for past customers
are not as special. Each store/distributor is free to charge
what it wishes for software, including selling at or below
cost. Since they buy in huge quantity, they get very
good prices, and handling/postage is much lower than
individual sales. So I recommend checking with your local
discount house before placing an order direct to Borland.
PS - Egghead Software had a typo in their advertisements.
It looked like they were selling TC++ Pro Pack for $90,
when it was really just TC++ 1.0, no TASM/TD/TProf, etc.
cccc.56mdasic,
Zna li neko (hvala bogu da zna) kako da u MSC 5.0 (eventualno TC 2.0)
postavim pointer (recimo long) na neku apsolutnu masinsku lokaciju
(re-
cimo na pocetak video memorije ili ROMa).
Unapred hvala.
cccc.57zzivotic,
>> Zna li neko (hvala bogu da zna) kako da u MSC 5.0 (eventualno TC 2.0)
>> postavim pointer (recimo long) na neku apsolutnu masinsku lokaciju
>> (recimo na pocetak video memorije ili ROMa).
Generalno se to radi upotrebom long vrednosti i cast operatora, recimo:
unsigned far *videram = (unsigned far *)0xb0000000L;
long far *timer = (long far *)0x00000470L;
Pozdrav, zz
cccc.58bojt,
E, da: Zorane, kolki ti je problem da mi pošalješ OBJ potprograma
u MSC-u 5.0 koji bi radio sledeće: ja mu prenesem ime fajla a on
mi vrati njegovu dužinu? Treba mi hitno da ga linkujem sa
fortranom a nemam MSC pri ruci.
cccc.59aleks,
Potreban mi je nacin da "navucem" skoljku na neki exe program, tj
da presretnem sve console I/O funkcije i moj parent program da salje
ulaze u cld exe. Disk i ostale periferije me ne interesuju.
Moze li to iz TC-a sa funkcijama exec i spawn?
unapred hvala,
Aca.
cccc.60ppekovic,
MS C 6.00 je jako lepa stvar. Optimizacija u MS C 6.00 još lepša.
A L I !!!!!!!!
Zorane (Životić), pazi sad ovo:
#include <stdio.h>
#include <float.h>
main()
š
union
š
float broj;
struct
š
int l1;
int l2;
ć dg;
ć podeli;
printf("Unesi broj >");
scanf("%f",&podeli.broj);
printf("Ovo ne štampa %d %d",podeli.dg.l1,podeli.dg.l2);
ć
Posle startovanja ispiše lepo
Unesi broj >
Uneseš ti lepo neki broj a onda te dočeka Run-Time greškica R6002.
Koja kaže nešto kao Floating point support not loaded. HA!!!!!
Probao sam razne stvari da promenim u programu i došao do sledećeg
zaključka:
Ako definišeš neku promenljivu tipa float ali u main() funkciji ne
vršiš nikakve dodele, promene vrednosti, štampanje i sl. te
promenljive, onda optimizator jednostavno ne učita float.h. Naravno
samo ako je ta promenljiva jedina float koja se nalazi u programu kao
u gornjem primeru. Međutim nije mi jasno zašto optimizator ne
proverava funkciju scanf (vidi gornji primer, opet).
Napomena: sve ovo lepo radi na TC 2.0.
Bubice, Bubice, Bubice ....... !!!!!!!!
Paya
cccc.61zzivotic,
>> Uneseš ti lepo neki broj a onda te dočeka Run-Time greškica R6002.
>> Koja kaže nešto kao Floating point support not loaded. HA!!!!!
...
>> Ako definišeš neku promenljivu tipa float ali u main() funkciji ne
>> vršiš nikakve dodele, promene vrednosti, štampanje i sl. te
>> promenljive, onda optimizator jednostavno ne učita float.h...
>> Međutim nije mi jasno zašto optimizator ne proverava funkciju scanf..
Izgleda da sam se ja toliko bavio tom MSC optimizacijom da se sada sve
"neobičnosti" pripisuju njoj ;)
Uključivanje .H datoteke u program nije posao optimizatora niti se njenim
uključivanjem uključuje floating point support - u datoteci su prosto
deklaracije i uvek se obrađuju. Problem je u tome što treba iz LIB datoteka
ubaciti u program deo koda koji se bavi realnim promenjivima a to se postiže
tako što se na nekom mestu u programu pojavljuje bilo kakva fp operacija. To
*neko mesto* mora biti dostupno kompajleru za analizu. Pošto je funkcija scanf
deklarisana tako da prima *promenjiv* broj parametara, kompajler jednostavno
nema načina da se upusti u analizu o kakvim se stvarno podacima radi - dovoljno
je da njihove adrese prenese na stek.
Ovakav stav može da se kritikuje (zar ih zaista nešto košta da provere da i
neki od tih parametara nije float?, mada ako unutar format stringa nema %f onda
čak i da je parametar float tipa, fp support nije potreban, znači trebalo bi
analizirati i format string što bi bilo totalno ne C-ovski!) ali svakako nije
bag.
Pozdrav, zz
cccc.62aleksa,
Klasicno resenje kod scanf i printf funkcija je
da se obavezno linkuje i floating-point podrska,
jer se (u principu) ne zna sta ce sve biti u
format stringovima u toku izvrsavanja programa.
Ovde su u Microsoft-u ocigledno pravili trikove, da
izbegnu znacajno povecanje .EXE programa koji ne
rade floating-point samo zbog toga sto ove
(cesto koriscene) funkcije nekada koriste floating-point.
Posto se u tvom programu nije pojavila nijedna
floating-point operacija, nije bilo ni linkovanja.
Sve je to, naravno, posledica nesposobnosti operativnog
sistema.
Na pristojnijim OS imas stvari kao sto je linkovanje
u toku izvrsavanja.
Naravno, cela prica pada u vodu ako u knjizi (knjigama?)
za MS C 6.0 nigde ne stoji opis ovakvog ponasanja.
Ako stoji, vazi pravilo "It's not a bug, it's a feature!".
U svakom slucaju, ovo sto si opisao nije neko iznenadjenje.
Kad muvas, moras da poznajes okruzenje.
cccc.63zzivotic,
>> Naravno, cela prica pada u vodu ako u knjizi (knjigama?)
>> za MS C 6.0 nigde ne stoji opis ovakvog ponasanja.
>> Ako stoji, vazi pravilo "It's not a bug, it's a feature!".
Pa, po ovoj klasifikaciji, mogao bi biti i bag kompajlera, ali i bag u
uputstvu ;) Naime, u uputstvu se ekplicitno pominju printf i scanf funkcije ali
iz objašnjenja koje je dato sledi da linkovanja neće biti samo u slučaju kada
se specifikacija *nalazi unutar* format stringa a u programu *nema ni jedne*
float promenjive. Ovo je očigledna besmislica jer nema razloga da se ovim
slučajem uputstvo bavi pa verujem da se ipak radi o bagu u uputstvu. Uostalom,
ko ima MSC 6.0 može da proba QH R6002.
Pozdrav,zz
cccc.64vkostic,
Jedan hitam problem vezan za MSC 5.0 ili 6.0 (Chetka uporno
odbija da mi vrati uputstva pa sam bespomocan):
- Da li postoje funkcije za ukljucivanje/iskljucivanje
interapta - nesto kao enable() i disable() kod TC-a?
- Kako da masinksa rutina vrati long? 16 bita u AX, a
preostalih 16 u koji registar?
Pozdrav, V.K.
cccc.65aleksa,
> - Kako da masinksa rutina vrati long? 16 bita u AX, a
> preostalih 16 u koji registar?
Dosad je uvek bilo u DX.
> - Da li postoje funkcije za ukljucivanje/iskljucivanje
> interapta - nesto kao enable() i disable() kod TC-a?
Imas bas te (prototipovi su u DOS.H, ali mislim da ti nesto i ne
trebaju).
Ovo je sigurno za 5.0, a valjda nisu menjali.
cccc.66ppekovic,
> > - Da li postoje funkcije za ukljucivanje/iskljucivanje
> > interapta - nesto kao enable() i disable() kod TC-a?
>Imas bas te (prototipovi su u DOS.H, ali mislim da ti nesto i ne
>trebaju).
>
>Ovo je sigurno za 5.0, a valjda nisu menjali.
Ima i na MS C 6.00 _enable() i _disable(). VladoK pogledaj help, ima čak i
primer ako hoćeš.
Paya
cccc.67vkostic,
>> VladoK pogledaj help, ima čak i primer ako hoćeš.
A odakle mi HELP? Nemam 5 MB prazno na disku da instaliram MSC, a
i ne istalira mi se samo radi programa od 20 linija. Obicno
koristim TC.
No, stvar je resena. Chetka mi je NAJZAD vratio uputstva pa sa
pogledao. _disable i _enable upravo rade stvar.
Moram jos jedanput da pustim VELIKI URLIK OCAJANJA nad onim sto
rade Microsoft i Borland. Zasto ne standardizuju biblioteku
funkcija ??? Zasto se u TC pise enable() i disable(), a u MSC
_enable() i _disable() ???? Zar nije moglo isto? A takvih primera
ima jos milion.
Pozdrav, V.K.
cccc.68mknezic,
Prebacio sam arhiver LZW sa SEZAM-a. Kompajlirao sam ga pod DOS-om i
pod SCO XENIX-om i to radi bez problema. Medjutim kada sam ga prebacio
na VAX-a i pokušao da kompajliram javio mi je sledeću grešku:
void *malloc();
%CC-E-VOIDNOTFUNC, "malloc" is not declared to be a function;
only functions may be declared "void".
Da li neko zna u čemu je problem?
Mirko
cccc.69alazic,
Treba mi hitno spisak datoteka koje ýp koristi Quick C iz MS C 5.1▀Ú─▀ ÚÚ─╗´Ď
isto tako mi je potrebna datoteka QC.INI - imao sam tesku havariju sa
disketama. Unapred hvala
cccc.70sgoran,
Volume in drive D has no label
Volume Serial Number is 1150-16E5
Directory of D:\MSC\BIN
QLIB DOC 12047 03-07-88 5:10a
QC EXE 326656 03-07-88 5:10a
QCL EXE 28065 03-07-88 5:10a
QLIB EXE 24557 03-07-88 5:10a
QC HLP 50649 03-07-88 5:10a
QCL HLP 1456 03-07-88 5:10a
QC INI 32 03-19-90 6:19p
QLIB INI 2905 03-07-88 5:10a
QUICKLIB OBJ 7917 03-07-88 5:10a
9 File(s) 8034304 bytes free
Javi mi kako da ti dostavim QC.INI.
Pozdrav SGoran.
cccc.71milan,
Ko zna koji kompajler imas, mozda se malloc kod njega ne zove tako
vec malloc-ove funkcije obavlja alloc ili calloc ili ko zna sta jer
sve price o ANSI compatibilnosti nisu uvek tacne.
Prosto pravilo glasi:
IF EVERYTHING ELSE FAILS, PLEASE READ THE MANUAL !
Pozdrav, Milan
cccc.72alazic,
>>Javi mi kako da ti dostavim QC.INI]
Molio bih te da to ucinis preko Sezama (skoro svaki dan se javljam) ako
hoces kao prikacenu datoteku uz poruku ili kao licnu postu. Rekao sam da mi je
stvar veoma hitnaÚ▀Ú pa ti prepustam kako god zelis. Hvala u svakom slucaju.
cccc.73sgoran,
Izvinjenje za kasnjenje, nisam bio u BGD-u.
Ali bolje ikad nego nikad.
Pozdrav ( prespori) SGoran.
qc.inicccc.75alexa,
>> Kako da allociram blok memorije veci od 64k:
>> 1) Na ANSI C-u ??
>> 2) Na prastarom C-u koji ide uz XENIX System V ??
2) Nikako. Alociraj više manjih blokova. Blok od 64Kb ili manje možeć
alocirati pomoću brkctl() funkcije. Problem je u virtuelnom režimu
rada 286 procesora.
1) Teško da to ANSI može da odredi - to pre svega zavisi od
operativnog sistema. Uostalom, da li uopšte postoji ANSI standard za
C?
Ja sam do sada video 'ANSI C' kompajlere koji se očigledno ne slažu
oko sopstvenog jezika. Zanima me da li je ANSI konačno objavio
STANDARD
(a ne nacrt) i da li je povukao svoju molbu da proizvođači kompajlera
prestanu da se hvale kako im proizvodi podržavaju ANSI C standard,
jer
isti ne postoji, a nacrt se menja?
cccc.76dejanr,
>> > Kako da allociram blok memorije veci od 64k:
>> > 2) Na prastarom C-u koji ide uz XENIX System V ??
>> 2) Nikako. Alociraj više manjih blokova. Blok od 64Kb ili manje
>> možeć alocirati pomoću brkctl() funkcije. Problem je u
>> virtuelnom režimu rada 286 procesora.
Znači, i na Unixu 64K limit :(
Eh, a kako lepo radi high c... :)
cccc.77alexa,
>> Znai, i na Unixu 64K limit :(
>> Eh, a kako lepo radi high c... :)
Na UNIXu naravno limita nema, ali na 286-ici nema pomoći.
Ne znam šta bi tvoj high c mogao da uradi na 286 procesoru -
pretpostavljam da radi samo na 386-ici, a XENIX/UNIX na 386-ici
nema nikakvih problema - ima 'ravnu' memoriju!
cccc.78dejanr,
Sorry, nisam video da je računar AT.
Pozdrav,
Dejan
cccc.79maleksic,
>> Uostalom, da li uopste postoji ANSI standard za C?
Nemam pojma, moguce da jos nije skrpljen do kraja (verovatno niko
ne zeli da donese neki standard koga ce vreme pregaziti za
godinu dana - seti se nesrecnog "FORTRAN-a 77");
Pod ANSI standardom za sada smatram ono sto pise u drugom izdanju
"The C Programming Language" - Kernighan & Ritchie (1988.).
Izmedju ostalog, tamo pise da se usvajanje ANSI standarda ocekuje
u 1988. godini. U jednom nasem prevodu te knjige takodje pise da je
standard vec odobren!?
cccc.80dejanr,
==========
borland/long.messages #29, from tweiss, 2272 chars, Fri Dec 7 18:32:35 1990
----------
TITLE: Code to detect graphics display type
/*
TITLE: Code to determine graphics adapter type.
The following code will detect and report on which of the following
graphics display adapters are in the current system:
MDA, HGC, CGA, EGA, VGA
SuperVGAs will be detected as VGAs.
*/
#include <stdio.h>
#include <dos.h>
#define UBYTE unsigned char
#define USHORT unsigned int
#define FAR far
/* Display Types */
UBYTE DisplayType;
#define DISPLAY_MONO 0x10U
#define DISPLAY_COLOR 0x20U
#define DISPLAY_MDA 1U
#define DISPLAY_HERC 2U
#define DISPLAY_CGA 3U
#define DISPLAY_EGA 4U
#define DISPLAY_VGA 5U
USHORT FAR *ScreenPtr;
#define MONO_ADDR 0xB0000000
#define COLOR_ADDR 0xB8000000
void cdecl main()
{
unsigned int i, holdstat;
char *ptr1, *ptr2;
/* Get address of screen memory */
if (peek(0x40,0x63) == 0x3B4)
{
ScreenPtr = (USHORT FAR *)MONO_ADDR;
DisplayType = DISPLAY_MONO;
}
else
{
ScreenPtr = (USHORT FAR *)COLOR_ADDR;
DisplayType = DISPLAY_COLOR;
}
/* Get Current Display Type: */
_BX = 0xFF10;
_AX = 0x1210;
geninterrupt(0x10);
if (_BX != 0xFF10) /* Bios installed */
{
_AX = 0x1A00;
_BX =0xFFFF;
geninterrupt(0x10);
if (_BX != 0xFFFF) DisplayType |= DISPLAY_VGA;
else DisplayType |= DISPLAY_EGA;
}
else if (DisplayType & DISPLAY_MONO)
{
holdstat = inp(0x3BA);
for (i = 0; i <= 10000; i++)
{
if ((inp(0x3BA) & 0x80) != (holdstat & 0x80))
{ DisplayType |= DISPLAY_HERC; break; }
}
if (!(DisplayType & DISPLAY_HERC)) DisplayType |= DISPLAY_MDA;
}
else DisplayType |= DISPLAY_CGA;
switch(DisplayType & 0xF0)
{
case DISPLAY_MONO: ptr1 = "Monochrome"; break;
default: ptr1 = "Color"; break;
}
switch(DisplayType & 0x0F)
{
case DISPLAY_MDA:
ptr2 = "MDA (Monochrome Display Adapter)";
break;
case DISPLAY_HERC:
ptr2 = "HGC (Hercules Graphics Card)";
break;
case DISPLAY_CGA:
ptr2 = "CGA (Color Graphics Adapter)";
break;
case DISPLAY_EGA:
ptr2 = "EGA (Enhanced Graphics Adapter)";
break;
case DISPLAY_VGA:
ptr2 = "VGA (Video Graphics Array)";
break;
}
printf("Your adapter is set up as a %s %s\n", ptr1, ptr2);
}
cccc.81vkostic,
TC 2.0 versus MSC 6.0
---------------------
(TC glatko pobedio!!)
Nameravam da napravim vrlo opsiram benchmark raznih C kompajlera - TC
2.0, TC++, MSC 5.0 i MSC 6.0. U igri su brzina kompajliranja, duzina
programa i brzina izvrsavanja.
Za probni program izabrao sam Z80DIS. To je inteligentni Z80 disasembler
koji sam letos napisao. Program je idealan za test kompajlera, narocito
za moc optimizacije. Program prvo ucita ulazni fajl (20K), zatim se samo
petlja sa integer matematikom (nema nigde FP brojeva), pointerima,
stringovima, nizovima i baferima. Na kraju proizvede izlazni fajl od
730K. Snimanje izlaznog fajla na disk traje relativno vrlo kratko u
odnosu na to koliko vremena treba programu da izvrsi disasembliranje.
Inace, Z80DIS je vrlo inteligentni disasembler koji je u stanju da sam
razdvoji program od podataka, obelezi svaki pocetak potprograma, sve
skokove, generise cross reference tabele, itd.
Za pocetak ovo je kratak test TC 2.0 versus MSC 6.0.
Evo rezultata (vrlo su zanimljivi):
┌─────────────────────────┬─────────┬───────┬────────┬─────────────────────┐
│ Compiler and │ │ │ Exec │ │
│ command line │ Compile │ Size │ time │ Rezultat rada │
Ă═════════════════════════ě═════════ě═══════ě════════ě═════════════════════Á
│ TCC -G -O -Z -a -r │ │ │ │ │
│ max opt. for speed │ OK │ 45606 │ 7'30'' │ OK │
├─────────────────────────┼─────────┼───────┼────────┼─────────────────────┤
│ CL /qc │ │ │ │ │
│ quick compile, no opt. │ OK │ 46121 │ --- │ Program blokirao │
├─────────────────────────┼─────────┼───────┼────────┼─────────────────────┤
│ NO FLAGS │ │ │ │ │
│ default │ OK │ 41931 │ 7'50'' │ OK │
├─────────────────────────┼─────────┼───────┼────────┼─────────────────────┤
│ CL /Ot /Gs │ │ │ │ │
│ optimize for time, │ │ │ │ │
│ remove stack probes │ OK │ 41883 │ 7'51'' │ OK │
├─────────────────────────┼─────────┼───────┼────────┼─────────────────────┤
│ CL /Ox /Oa /Oz /Gr /Gs │ │ │ │ │
│ max_opt, fastcall con- │ │ │ │ │
│ vention, remove stack │ │ │ │ Kompajler nece │
│ probes │ ERROR │ --- │ --- │ da prevede program │
├─────────────────────────┼─────────┼───────┼────────┼─────────────────────┤
│ CL /Ox /Oa /Oz /Gs │ │ │ │ │
│ max_opt,remove stack │ │ │ │ Jedna mala greska u │
│ probes) │ OK │ 42587 │ 7'13'' │ izlaznom fajlu │
└─────────────────────────┴─────────┴───────┴────────┴─────────────────────┘
Brzinu kompilacije nisam merio, izmericu je kada budem testirao i TC++.
U svakom slucaju, po tom pitanju TC je sampion u odnosu na MSC.
Sa TC 2.0 nije bilo nikakvih problema - sve je glatko radilo.
Sa MSC 6.0 je bilo puno problema.
Prvo, jedan pokusaj kompilacije nije uspeo. Drugo, /qc opcija je
proizvela program koji je blokirao. Trece, maximalna optimizacija je
prizvela neispravan izlazni fajl - bila je jedna greska. Dosta sitna
greska, ali ipak greska.
Sve u svemu, TC je po meni glatko pobedio:
- Prevodi MNOGO MNOGO brze.
- Program radi brze (rezultat 7'13'' koji je postigao MSC ne
priznajem zbog greske u izlaznom fajlu).
- Ne pravi nikakve brljotine za razliku od MSC-a koji je od 5
pokusaja uspeo da radi ispravno samo 2 puta.
Jedino gde je MSC pobedio je duzina programa, i to ne za mnogo - 9%.
Nastavak testa sa TC++ sledi cim nadjem vremena.
V.K.
cccc.82alexa,
Sledeći put obrati pažnju na to šta znače opcije koje si zadao (tj.
pročitaj priručnik) : /Oa teško da si smeo da zadaš ...; za neke
druge ne znam šta znače.
cccc.83vkrstonosic,
Vlado, da li se meni cini ili si ti testirao program koji je bio razvijan u
Turbo C-u. Mi smo pravili neke testove i rezultati su bili sasvim drugaciji.
cccc.84vkostic,
>> Sledeći put obrati pažnju na to šta znače opcije koje si zadao
>> (tj. pročitaj priručnik)
Procitao sam prirucnik par puta i to jos odavno. (doduse, za verziju 5.1).
>> /Oa teško da si smeo da zadaš ...
Nisam bas siguran da nisam smeo. Usput, program je kompilovao ddincic i
nije mi bas jasno zasto je to stavljao. Ja licno izbegavam /Oa. Nameravam da
izvrsim jos par testova, pa cu tacno ustanoviti dali je /Oa pravilo problema.
cccc.85vkostic,
>> Vlado, da li se meni cini ili si ti testirao program koji
>> je bio razvijan u Turbo C-u.
Program jeste bio razvijan u Turbo C-u, ali to nije nikakav presudan
elemenat - u programu nema *nikakvih* prljavih trikova koji bi bolje
radili sa TC nego sa MSC.
>> Mi smo pravili neke testove i rezultati su bili sasvim drugaciji.
Sve zavisi sta program radi. Vec sam opisao sta Z80DIS radi. Za tu
konkretnu aplikaciju se MSC nije bas proslavio u odnosu na TC. Mozda je
MSC mnogo bolji ako se radi sa FP brojevima, na primer. Z80DIS nema
nigde FP brojeve.
Jednostavno, imao sam program koji je odavno gotov, testiran i radi.
Interesovalo me da vidim koji ce kompajler za taj konkretan slucaj dati
najbolje rezultate.
Probacu jos TC++. Sve mi govori da ce na primeru Z80DIS programa TC++
dati najbolje rezultate od svih kompajlera.
Inace, ja i ddincic upravo sprovodimo jos jedan benchmark, pa cemo da
vidimo kako ce na tom novom primeru MSC i TC proci.
cccc.86cuba,
Svojevremeno je neko pisao o nedovrsenosti ANSI standarda za C.
E standard vise nije draft vec je usvojen, te ce biti tokom meseca
na raspolaganju za sve zainteresovane. ISO standard sledi, kazu da ce
izaci pocetkom godine.
Izvor informacije je "The C Users Journal" januarski broj.
Za zainteresovane mogu raci da ANSI C standard (X3.159-1989)? kosta
USD 50. Ako ima zainteresovanih adresa je :
ANSI Sales Dept.
1430 Broadway
New York NY 10018
PS postatarina nije ukljucena ;>
Pozdrav, Miroslav
cccc.87vkostic,
Microsoft vs Borland - Part II
------------------------------
Znam da cu ponovo da izazovem gnev ljubitelja MSC-a!
Ovo su novi benchmark rezultati. TC 2.0, TC++ i MSC 6.0 su bili na testu.
Ovog puta sam merio i brzinu prevodjenja. Test program je i dalje Z80DIS.
┌────┬─────────────────────────┬─────────┬───────┬────────┬──────────────────┐
│ │ Compiler and │ Compile │ │ Exec │ │
│ No │ command line │ time │ Size │ time │ Rezultat rada │
Ă════ě═════════════════════════ě═════════ě═══════ě════════ě══════════════════Á
│ │ TCC 2.0 │ │ │ │ │
│ 1 │ default │ 25'' │ 45622 │ 7'47'' │ OK │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ TCC 2.0 -G -O -Z -a │ │ │ │ │
│ 2 │ max opt. for speed │ 25'' │ 45606 │ 7'39'' │ OK │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ TCC ++ │ │ │ │ │
│ 3 │ default │ 30'' │ 44312 │ 7'23'' │ OK │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ TCC ++ -G -O -Z -a │ │ │ │ │
│ 4 │ max opt. for speed │ 31'' │ 44248 │ 7'30'' │ OK │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ CL 6.0 │ │ │ │ │
│ 5 │ default │ 2'53'' │ 41931 │ 7'51'' │ OK │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ CL 6.0 /qc │ │ │ │ ERROR: │
│ 6 │ quick compile │ 34'' │ 46121 │ -- │ program blokirao │
├────┼─────────────────────────┼─────────┼───────┼────────┼──────────────────┤
│ │ CL 6.0 /Ox │ │ │ │ ERROR: greska u │
│ 7 │ max optimization │ 3'33'' │ 42555 │ 7'13'' │ izlaznom fajlu │
└────┴─────────────────────────┴─────────┴───────┴────────┴──────────────────┘
Testovi pokazuju par cudnih stvari:
- U proslom benchmark testu program kompilovan sa TC uz max
optimizaciju je radio 7'30'' a sada 7'39''. Odakle ova razlika
nemam pojma. Mozda sam negde pogresio u menenju, mozda sam se
igrao sa nekim parametrima - nemam pojma, a sada ni vremena da to
proveravam.
- Novi TC++ je pokazao da malo sporije prevodi od TC 2.0 ali da
program radi malo brze.
- Program preveden sa TC++ sa default parametrima je za divno cudo
radio brze nego sa optimizacijom. To sam u cudu dva puta
proveravao i zaista je tako.
- MSC je jos jednom dokazao kako Microsoft to voli sporo - sporo
prevodi da ne moze sporije. Ipak, svetla tacka je opcija /QC. Na
zalost, Z80DIS preveden sa tom opcijom se blokirao. Ddincic me
uporno ubedjuje da on redovno koristi tu opciju i da nikada nije
imao problema. Poslao sam mu source za Z80DIS pa neka proveri.
- MSC je uspeo da napravi kraci program od TC, a sa opcijom /Ox i
vrlo brz. Na zalost, rezulta rada programa je bio neispravan.
Postoji doduse parametar da se iskljuci "unsafe" optimizacija, ali
nisam stigao da se igram sa time.
- MSC je po svemu pokazao da je vrlo lep kompajler ali spor i dosta
nesiguran.
Do sada je moj omiljeni kompajler bio TC 2.0. Po mom iskustvu radi se o
vrlo brzom i sigurnom kompajleru. Imao sam zaista vrlo vrlo malo
problema sa njim.
TC++ jos nisam koristio - trenutno ne radim nikakav projekat na C-u.
Rezultati benchmark testova pokazuju da vredi preci sa TC 2.0 na TC++ ne
zbog objektnog programiranja nego zbog malo vece brzine. Pitanje
pouzdanosti TC++ kompajlera za mene ostaje jos uvek otvoreno. Moci cu da
se izjasnim tek posle intenzivne upotrebe.
MSC ne nameravam da koristim (mada ga imam instaliranog na disku) iz
razloga sto je neprihvatljivo spor i nepouzdan po mom misljenju. Istina,
moze se koristiti opcija /QC radi brzine kompajliranje dok se program
razvija, ali pitaj boga dali ce program 100% ispravno raditi u *svim*
granama kada se posle kompiluje sa /Ox.
ZZ je sada preuzeo stafetu. Rezultati njegovih testova (takodje sa
Z80DIS) ce biti vrlo interesantni. On ipak ima vise iskustva sa MSC od
mene.
V.K.
cccc.88ljupco,
Juce mi je TC prijavio
Initiall error
Please report to Borland
a zatim me izbacio u DOS. Na ekranu je bilo jos
exit error = 3, winerror = 0
Nemam nekog iskustva sa TC-om, ali me ipak interesuje u cemu je stvar.
Pogledao sam uputstvo, Appendix B, Compiler Error Messages, Fatal Errors i
nisam nista nasao.
Nije previse vazno, ali ako neko zna...
cccc.89gww.,
Pretpostavljam da je u pitanju "Internal error" a ne "Initiall error". Ali
nema veze. U svakom slučaju to ili je problem da je TC "ukršen", ili imas
neku specijalnu kombinaciju hardvera koje TC nije mogao da shvati ili, što
ume da se dešava, zbog pada ili skoka napona ti se izbombarduje memorija
ili si stvarno našao rupu. Nije jasno koji je TC u pitanju, ali ako je u
pitanju TC++ pogledaj kako ti je setovana EMS memorija (ako je imas).
Uzgred to nije normalna greška pa je ni nema u spisku.
cccc.90ivujanic,
Molba za bilo kojeg kolegu koji ima uputstvo za Turbo C i
sat vremena.
Potreban mi je opis načina doturanja parametara u funkcije. Dakle
sve što je potrebno da se funkcija u asembleru "zakači" za TC.
Unapred hvala strpljivom!
Ivica
cccc.91zzivotic,
>> Potreban mi je opis načina doturanja parametara u funkcije. Dakle
>> sve što je potrebno da se funkcija u asembleru "zakači" za TC.
Nije baš potrebno sat vremena :)
Naime, prenos parametara kod TC-a je verovatno potpuno isti kao i kod MSC-a.
Koristi se sledeći metod. Kada napišeš sledeći poziv:
funkcija(a,b,c,d..)
onda se to prevodi kao:
push d
push c
push b
push a
call funkcija
sub sp,4
a unutar funkcije se dešava sledeće:
funkcija proc near
push bp
mov bp,sp
mov ax,[bp+4] ; a
mov ax,[bp+6] ; b itd.
Offset +4 važi kod memorijskih modela sa near pozivima, povećava se za 2
kod far poziva jer su na steku 4 bajta povratne adrese.
Dve stvari su kakteristične:
- Parametri se na stek 'guraju' s desna u levo - ovim se omogućava prenos
promenjivog broja parametara
- Čišćenje steka *ne radi* funkcija već pozivni program (vidi ono call
funkcija) iz istog razloga jer kod promenjivog broja parametara funkcija
zapravo ne zna koliko toga ima na steku.
Dakle, ako piše svoju funkciju na asembleru i treba iz C-a da preneseš
parametre u nju, onda to izgleda ovako:
; int funkcija( int a, int b..)
funkcija proc near
push bp
mov bp,sp
push si ; ovo pos uslovom da koristiš register dekl. ili opt.
push di ; u funkciji koja pozivu ovu
mov ax,[bp+4] ; a
.... itd, pa na kraju
pop di
pop si
pop bp
mov ax,ret_value
funkcija endp
Ovo je samo osnova, postoji mnogo detalja koji bojim se da ne mogu stati u
poruku čak ni za sat. Moraš znati šta se dešava sa segmentnim registrima
(obično je DS konstantan i pokazuje na default data seg, dok ES možeš slobodno
da menjaš), kako se prenose ostale vrednosti i kako se vraćaju iz funkcije i
koje registre smeš da menjaš (uglavnom ne smeju na izlazu da promene vrednost
DS i BP).
Ako imaš neko konkretno pitanje od ovih...
Pozdrav, zz
P.S. Pade mi na pamet - verujem da je i TC kao i MSC u stanju da generiše
ASM program iz C programa (pogledaj opcije TCC-a). Sa malo proba brzo ćeš
shvatiti kako ceo mehanizam funkcioniše.
cccc.92ivujanic,
Zorane, svaka čast za brz odgovor. Puno ti hvala. A što se
opcija TCC-a tiče, da imam uputstva ne bih tebe gnjavio.. :(
Ali biće i to uskoro...
Nego, ima li neko da predlozi nekog domaćeg distributera za
C++. Znate i sami kako je sa inostranstvom kad nemaš kartice, a i ko ih
ima, uglavnom ima American Express, a to je k'o i da ih nema.
Dakle, trazi se distributer za C++.
Ivica
P.S. još jednom hvala zzivoticu.
cccc.93zzivotic,
>> A što se opcija TCC-a tiče, da imam uputstva ne bih tebe gnjavio.. :(
Zar TCC nema nešto poput TCC /help? Koliko se sećam jedna od prvih verzija
je to imala i dobiješ spisak opcija sa sasvim pristojim objašnjenjen - negde
treba da stoji i Generate Assembly Listing ili nešto poput toga. Prevedeš
program sa tom opcijom i na disku se nađe čist .asm fajl.
Pozdrav, zz
cccc.94dsavic,
Firma Marand iz Ljubljane je generalni zastupnik Borlanda za
Jugoslaviju. Oni prodaju Turbo C++, naravno, i Turbo Pascal 6.0 i sve
ostalo. Inače, TP 6.0 (bez Professional verzije) košta 2.880 dinara -
platiš na njihov račun i dobiješ za manje od sedam dana. Ovo je
provereno - valjda bi isto bilo i sa Turbo C++. Za svaki slučaj,
treba ih pozvati i pitati šta imaju na lageru.
Pozdrav, Duško Savić.
cccc.95ivujanic,
Hvala Dušku Saviću. Za Marand sam čuo i sa njima razgovarao, ali sam
ipak hteo da čujem neka praktična iskustva.
Ivica
cccc.96ljupco,
Mozda je i bio "Internal error", ne mogu biti 100% siguran jer se je
ekran odmah obrisao. Medjutim ono exit error = 3 winerror = 1 je sigurno.
Radi se o TC2.0, EMS memorija nije bila setovana (384K extended memorije bila
su pretvorena u RAM disk pomocu vdisk.sys), a u memoriji su jos bili Ced,
Backscrl i Norton Guide.
cccc.97gww.,
" - Parametri se na stek 'guraju' s desna u levo - ovim se omogućava
" prenos promenjivog broja parametara
Ne, ovim se jednostavno lakše tretiraju parametri jer se jednostavnim
pop-ovanjem čitaju parametri redom (tj. s leva na desno).
Zapravo, ova osobina je mnogo bitnija za portabilnost C-a. Razmislite o
sledećem programu (ili još bolje prvo ga kompajlirajte i izvršite pa tek
onda razmislite):
#include <stdio.h>
int i;
main()
š
i=6;
while (i<=15)
š
printf("%2d- %2d %2d %2d %2d %2dĐn",i,i--,i--,i--,i--,i--);
i=i+6;
ć
return(0);
ć
Uz komentar da je ovaj program napisala moja devojka tokom jednog našeg
razgovora o programiranju i dobro me bacila u razmišljanje o portabilnosti
i čudnim putevima ljudskog razmišljanja. Alexa mi je potom rekao da se isti
princip (push s desna u levo) upotrebljava i kod XENIXA te izgleda da je
takav način generalan. Uzgred, koliko se sećam, i Turbo pascal koristi isti
princip, s razlikom pascal konvencije, da pozvana funkcija čisti stek.
cccc.98alexa,
Ipak je važniji razlog taj što se može raditi sa promenljivim brojem
parametara (kao što reče zz).
cccc.99rlazic,
Od pre par dana sam na Sezamu, pa se (tek) sada uključujem u razgovor.
Pročitavši prethodne poruke, zaključio sam da se niko ne bavi C++-om
(usput, ovo "-om" mi glupo deluje, pa jel' ima neko predlog?).
Jedino u vezi s tim je bilo Vladino testiranje Turbo C++-a nekim
programom u C-u, napisavši da će ga bolje pogledati kad bude imao vremena.
Pošto imam dosta iskustva u radu sa pomenutim kompajlerom (ceo
školski raspust sam proveo s njim), odlučio sam da vam prenesem neka
zapažanja. Da krenem redom:
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. Moguće je da se Borland ponovo "hakerisao", ali je isto tako
moguće da je ncc/fastkey nešto ubrljao.
Svoje utiske o radnoj okolini (IDE:) sam već izneo u Svetu
kompjutera, pa ne bih sada o tome. Par stvari koje valjaju je
poboljšani search/replace sistem i (konačno!) ljudsko obeležavanje
bloka pomoću Shift+strelice, a ne nekim tamo CtrlKB i CtrlKK.
Takođe, lepa je stvar mogućnost biranja između prethodnih unosa u
search/replace i ostalim dialog box-ovima.
Dalje, Turbo C++-ova (opet ovo ++-) mogućnost korišćenja EMS memorije
me je prilično obradovala, pa sam se zaleteo i dogurao do 70kB source
fajla, na šta je kompajler pri kraju kompajliranja (pre linkovanja)
odgovorio porukom Fatal error: Out of memory. To me je zaista
razočaralo - izgleda da Turbo C++ koristi EMS memoriju samo za svoje
swap-ovanje iz osnovnog RAM-a i time oslobodi još najviše stotinjak
kilobajta, a da kompajliranje i dalje vrši u osnovnoj memoriji.
Dakle, EMS vam služi samo kao brzi hard disk, jer se inače (ako nema
EMS-a) Turbo C++ swap-uje na njega. Pitam se ja onda: koja je korist
od 2MB EMS memorije i zašto Get Info prijavljuje 2MB EMS in use.
Jedan od ozbiljnih bagova je pogrešno funkcionisanje ifstream::open
funkcije (otvaranje fajla). Naime, navođenje argumenta ios::nocreate
bi (prema uputstvu i help-u) trebalo da kaže funkciji da prijavi
grešku ukoliko fajl ne postoji (da ga ne kreira), a da poziv uspe ako
fajl postoji. Međutim, to UOPŠTE ne radi.
Prilikom dibagiranja programa ugrađenim dibagerom, stvar je KRITIČNA.
Nebrojeno puta mi se dešavalo da se kompajler jednostavno zablokira
(ne moj program, već kompajler), ili da "u sred" rad izbaci gomilu
đubreta na ekran i tek se onda zablokira (zanimljivo, a? B() - to je
valjda radi vizuelnog efekta - da mi ne bude dosadno tokom rada.
Pri dinamičkoj alokaciji memorije (na tome se bazirao moj program -
simulator paralelnog procesiranja), Turbo C++ se (za divno čudo)
dobro pokazao - to je bilo "osetljivo" mesto Turbo C-a 2.00.
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. U
uputstvu piše:
"When a program exits, a chek is made to determine if the contents of
the first few bytes of whitin the program's data segment have
changed. These bytes would never be altered by a working program. If
they have been changed, the message "..." is displayed to inform you
that (most likely) a value was stored to an uninitialized pointer. ..."
To je O.K. (vrednost neinizijalizovanog pointera je NULL=0) i to je
prvi put i bilo po sredi (lako sam ga naš'o).
Međutim, kada mi se ova (!#$&%) poruka drugi put pojavila, bio sam
siguran da program radi perfektno, pa sam se začudio. Pošto mi nikako
nije uspevalo da utvrdim gde mi se "first few" lokacija data segmenta
ubrlja, ubacio sam u glavnu petlju stalno testiranje prvih stotinjak
lokacija, ali se NIŠTA nije dešavalo.
Na kraju sam lepo uzeo Turbo Debugger 1.00 i iš'o kroz program sve
dok nisam stigao do poziva exit(0) funkcije (svo vreme je sve bilo
O.K) i ustanovio da je ona ta koja ubrlja data segment i posle sama
prijavi grešku (da su mi sad pri ruci programeri Turbo C++-a ...).
Uglavnom, stvar sam sredio pozivanjem funkcije _exit(0), koja ništa
ne dira (po uputstvu), nego lepo odmah izađe u DOS.
(Možda je sve ovo u vezi sa dinamičkom alokacijom memorije, nisam
podrobnije pogledao.)
Što se brzine kompajliranja tiče, osetno je manja u odnosu na Turbo C
2.00 (po odokativnoj proceni oko 50%). Ovo nemojte previše čvrsto da
shvatite, jer nisam ništa merio - samo mi se čini. Naravno, to je i
dalje daleeekooo u odnosu na MSC 6.00 :))).
Na kraju, zaključio sam sledeće:
Pošto se većina prosečnih korisnika razmišlja da li da pređe na Turbo
C++ i nastavi programiranje u C-u, mislim da se to ne isplati -
kompajler je sporiji, radna okolina ne nudi ništa revolucionarno
(kako se stalno naglašava), biblioteka C funkcija nije značajnije
proširena, mnoštvo bagova je prisutno, ...
Š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). Radna okolina je (kao i kod svih
Borlandovih programa) relativno konforna, biblioteka C++ funkcija je
više nego bogata (posebno bih izdvojio I/O operacije). Ipak,
nabrojani bagovi (verovatno njihov maaaliii deo) zaista kvare utisak
i prikazuju Turbo C++ kao prilično nepouzdan kompajler, ali se sa
svim tim ipak nekako (kad se već mora) može izaći na kraj.
Još da kažem (tj. napišem) da se nisam previše "hakerisao", kao ni u
Turbo C-u 2.00, (izuzimajući nekoliko rezidentnih programčića), pa ne
mogu ništa da zaključim o pouzdanosti kompajlera prilikom DOS/BIOS
poziva (brljanje registara i sl.).
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). Tačno je da je tako nešto neophodno
pri pisanju drajvera za tastature, možda Z80 disasemblera i sličnih
stvari. U stvari, hoću da kažem da nije u redu da smatraš "ozbiljnim"
programima samo taj tip programa koji ti pišeš.
Programerski pozdrav, Ranko Lazić
cccc.101alexa,
Nisam radio sa Borlandovim C++-om, ali mi je neverovatno da sama
bibliotečka funkcija exit() tek tako izbrlja po memoriji.
Pretpostavljam da se u C++-u u toku završavanja rada (tj. u exit()-u)
pozivaju destruktori za promenljive definisane izvan procedura.
Verovatno si pogrešio u nekom destruktoru, ili si pogrešno shvatio
u kom redosledu se pozivaju destruktori.
cccc.102gww.,
Ne, ponvaljam metod smeštanja parametara na stek nije bitan za prenos
promenljivog broja parametara. Važna je druga osobina da program koji
poziva funkciju čisti stek (tako pozivana funkcija zapravo i nezna koliko
joj je parametara poslato, što će svaki C potvrditi ako nema prototipa
funkcije). Jedini preduslov je da pozvana funkcija ne menja stek pointer.
Metod smeštanja (s desna na levo samo omogućuje lakši rad, tj čitanje
redom) U principu kod svakog procesora moguće je stek pointer prebaciti u
neki indeksni registar. Ovo je karakteristično za PC kompajlere a onda
praktično parametrima pristupa indeksno. Zato i nema veze metod smeštanja.
Ovakav metod (s desna na levo) je lakši jer je prvi parametar na vrhu steka
a drugim metodom (s leva na desno) bi se morala predati informacija o
adresi prvog parametra (u nekom od indeksnih registara). No, kao što sam u
primeru naveo to (s desna na levo) može doći u konflikt sa ljudskim
razmišljanjem (pogotovo zapadnjaka, koji čitaju s leva u desno).
P.S. Zamalo da si me "ubedio" Alexa :))
cccc.103mtadic,
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,
>>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,
Slič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,
Š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,
Program 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,
>> 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,
>> 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,
>> 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,
>> 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,
>>Š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.,
Da 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.,
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. 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,
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,
>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.,
"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.,
pretpostavimo 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,
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,
> 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,
>>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.,
Aha, pa su parametri "ispod" BP a auto varibaile "iznad" ako sam dobro
shvatio. Lepo i jednostavno.
cccc.127gww.,
O.K. treba da se zna!
cccc.128rlazic,
>> 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,
>> 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,
>> 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,
>> 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,
>>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.,
>> 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.,
& 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,
>> Č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,
>> " 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,
>>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,
Ajde 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,
>>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,
Molim 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.,
Š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,
Za 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,
>> Š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,
Ta 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,
>> 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,
Kod 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,
>> 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,
>> 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,
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,
>> 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.,
Eh 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,
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.,
Zaš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,
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.,
Zaš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,
> 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,
Odlič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,
Da li si probao da zoves nekada na 1-800-... ? ;>>>
cccc.174nkbog,
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,
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,
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,
Tako 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,
> 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,
> 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,
Hvala. 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,
> 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,
I 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,
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,
> 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,
> 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,
> 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,
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,
probaj 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,
> 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,
Probaj 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,
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,
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,
>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,
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,
Š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,
(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,
>> #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,
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.
cccc.209nkbog,
>> _asm retf
Umesto _asm za TC treba asm. Ovo bi trebao da prevede i TC sam.
NB.
cccc.210ljupco,
Kada kompajliram sa tcc, koje opcije su znacajnije: one upisane u
fajl turboc.cfg ili one koje zadam u komandnoj liniji (ukoliko se "sudare")?
cccc.211djelovic,
One iz komandne linije.
cccc.212djelovic,
Mučilo me je što u čatu ne vidim šta drugi kori-
snici pišu dok ja otkucavam svoju poruku. Zato sam napra-
vio chatter.exe koji deli ekran na dva dela:
Gornji prozor prikazuje šta se dešava u sistemu,
a u donjem se vrši editovanje linije koja će sledeća biti
poslata. Mogu se koristiti i kursorski tasteri.
Iz programa se izlazi sa ESC.
Usage: chatter <port> Primer: chatter 4
U Telix-u je program najbolje instalirati kao
download protokol, jer se tako najlakše startuje. Čujem
da telemate-u ovako nešto nije potrebno, ali njega izbega-
vam zbog bug-a u ZMODEM-u.
Uz program ide i source. Chantrajte.
cccc.213igor.mil,
Imam problem sa povezivanjem modula pisanih u Turbo C-u i asembleru
Da ne bih mnogo objasnjavao, evo konkretnog primera:
/**** TESTASM.C ***********************************************/
#include <stdio.h>
int asmfunc(int); /* funkcija pisana u asembleru, prihvata
argument po vrednosti i vraca ga
pomnozenog sa 2 */
main()
{
int i;
float f = 2.5; /* ovo dummy promenljiva */
i = asmfunc(4); /* poziv koji vreca rez. 2*4 = 8 */
printf("%d\n", i); /* ova naredba se normalno izvrsi */
printf("%f", f); /* ova naredba daje gresku
(vidi dole u tekstu) */
}
;**** ASMFUNC.ASM *********************************************
dosseg
.model small
.code
_asmfunc proc
push bp
mov bp,sp
mov ax,[bp+4]
add ax,ax
pop bp
ret
_asmfunc endp
public _asmfunc
end
;********************************************************************
Glavni program je preveden sa:
tcc -c -ms -f testasm
Modul ASMFUNC je preveden sa:
tasm /e /mx asmfunc
Povezani su sa:
tlink /c c0s testasm asmfunc,,testasm,cs maths emu
Navedene operacije ne daju nikakve greske ili upozorenja.
Kada se ovako dobijen program izvrsi na ekranu se dobije:
8
printf : floating point formats not linked
Abnormal program termination
Ukratko, ukoliko je neki od modula asemblerski, sve normalno radi dok
ne dodje do prve printf naredbe koja ispisuje vrednost neke
floating-point promenljive kada se dobija navedena run-time greska,
bez obzira na to kakvi su ti asemblerski moduli, odnosno dali pozivaju
emulator fp-a ili ne.
Korisceni softver je: TASM v1.01, TLINK v2.0 i TCC v2.01.
Pozdrav
---Igor
cccc.214braca,
Uzmi novi Borland C++ 2.0 :))
Ja sam ga skoro dobio i čisto iz radoznalosti sam probo i sve radi
ok, napominjem da nisam ništa pipnuo osim imena kompajlera (sad se
zove bcc).
Ne znam da li si uradio patch za taj TC, ima nekih bugova koje je
čini mi se Borland sam "ispravio", tj. skoro na svim BBS-ovima ima
patch koji sređuje bugove, a koliko se sećam, ovo je upravo jedan od
njih.
Pozdrav,
Braca
cccc.215ljupco,
Kako da fout (FILE *fout) nekako "usmerim" na ekran (i da li se
ekran naziva stream stdout?), pa da kasnije svi ispisi u programu koji
stampaju u fout u stvari stampaju na ekran?
cccc.216djelovic,
Dobio sa kritiku da chatter ne radi sa 2400 modemima. Ko ima
source neka izbaci comm_setparam (131) - on pravi sranja, a ionako
je nepotreban kada se program poziva iz telix-a (program koristi
LCOMM koji je modifikovan da radi i sa COM3 i COM4). Za one koji
nemaju sve što treba za rekompilaciju, evo nove EXE verzije:
chatter.zipcccc.217igor.mil,
> skoro na svim BBS-ovima ima
> patch koji sreduje bugove
Gde da ga nadjem?
Pozdrav
---Igor
cccc.218drakce,
Hvala djelovicu za CHATTER. To je ono sto je falilo Telix-u da postane
najbolji :). Prilazem mali script file kojim mozemo definisati makro
za pozivanje CHAT-a.
Pozdrav od Dragana
chat.zipcccc.219beast,
Dali Turbo c++ ima svoj editor?Ja nikako da ga nadjem :)
cccc.220nkbog,
> Kako da fout (FILE *fout) nekako "usmerim" na ekran (i da li se
> ekran naziva stream stdout?), pa da kasnije svi ispisi u programu koji
> stampaju u fout u stvari stampaju na ekran?
Sa:
fout=fopen("CON","w");
"stdout" je standardni "stream" izlaza, a to je CON, ili ono na sta preusmeris
u komandnoj liniji.
NB.
cccc.221ljupco,
fout=stdout
cccc.222nesavic,
Pozdrav svim C-easima,imam jedan problem.
Nabavi sam skoro novi TC i kada otkucam C:\TC on mi javi nesto u stilu
nije pronasao *.TC,e pa lepo.
Ja sad uzmem TCINST pa lepo prepravim sve a ono opet nema *.TC,
startujem ja TCCONFIG i sve lepo on zavrsi i stvori fajl TCCONFIG.TC,i
ja sav srecan ocekujuci da ce sada raditi ponovo startujem TC,a on
opet nema *.TC.
Pomagajte,ortaci,sta da radim.
Pozdrav,NESA!
cccc.223djelovic,
>> Nabavio sam skoro novi TC...
Piratu. Sramoto. Komunisto. :). Ti nam leb uzimaš. Sada ćemo svi
da te bojkotujemo i ti ćeš da se mučiš sa tim TC-om. :)
cccc.225djelovic,
Sorry. Počinjem sve više da ličim na svoju majku :). U meniju
Options/Directories unesi gde ti se nalaze fajlovi, a zatim snimi
konfiguraciju.
cccc.226ljupco,
Postoji li nacin da pre nego sto izadjem iz turbo dibagera snimim sve
prekidne tocke i promenjive koje pratim, da ne bih morao sledeci put kad
udjem u td da sve opet rucno postavljam.
cccc.227ivujanic,
> Postoji li nacin da pre nego sto izadjem iz turbo dibagera snimim sve
>prekidne tocke i promenjive koje pratim, da ne bih morao sledeci put kad
>udjem u td da sve opet rucno postavljam.
Ne stigoh celo uputstvo da pročitam (ispiti..), ali ta stvar
je i mene mučila i mogu ti reći da, po svemu sudeći, ne može.
Ljudi iz Borlanda su za tu svrhu namenili nešto drugo:
Execution History & Keystroke Recording
Turbo Debugger has a special feature called the execution history
that keeps track of each instruction as it is executed (provided you
are tracking into the code), adn also, if you want, recordes the
keystrokes you intpu to get to a given point in your program.
...
The execution history only keeps track of instructions that have
been executed with the Trace Into (F7) or the Instruction Trace command
(Alt-F7). It also tracks for Step Over, as long as you donžt encounter
one of the instruction listed on page 89. As soon as you use the Run
command or execute an interrupt, the execution history is deleted.
(To već znaš, tako u stvari funkcioniše bactracking)
The Keystroke Recording pane
... you can quickly execute back to a given point in your program,
if you have keystroke recording enabled.
Keystroke recording works in conjuction with the reverse program
execution capability to give you different ways of recovering to a
previous point in your debbuging session. It keeps a record of all the
keys that you press, both when youžre issuing commands to Turbo Debbuger
and when youžre interacting with the program you are debbuging. The
keystrokes are recorded ina file named progname.TDK, where progname is the
name of the program you are debbuging.
Use the bottom pane of the Execution History window to reply keystrokes
and recover to a previos point in your session.
...
The -k command-line option enables keystroke recording. You can also
use TDINST to set the default to On.
Eto toliko! Ako ti tlika kompleksnost ne treba, uvek ostaje ono
neelegantno petljanje sa Macro-ima, koji rade na vrlo sličan način kao
i Keystroke Recording.
Ivica
cccc.228ppekovic,
Mali bug u MSC 6.0 compiler-u.
==========================
microsoft/msc #4469, from blaszczak, 677 chars, Sun Jun 9 08:51:47 1991
--------------------------
TITLE: Compiler Bug
I found a bug in the Microsoft C compiler. You have these files
in your directory:
MYFILE.C
MYFILE.OBJ
and you have MYFILE.OBJ write-protected. If you go in and change
MYFILE.C, and then recompile it, the compiler will not be able to
open MYFILE.OBJ to overwrite the old version and compile the new
version.
The problem is that the compiler makes an error message about the
temporary directory being out of space, rather than not being able to
open the object file.
Not likely to bite you, but you're also not likely to see "compiler
out of temporary space" and think "Oh, I must have left my old .OBJ
file write-protected".
.B ekiM
Paya
cccc.229ljupco,
Hvala ti!
cccc.230nesavic,
Hello World,
Problem : TC 2.00
Resenje : Neka mi se javi neko ko ima sve odgov. .H datoteke i neka mi
objasni ovu gresku koja se javlja i kod najprostijeg programa.
Invalid Obj record in C0S.OBJ
Unapred zahvalan,NeSa!
cccc.231igor.mil,
> Problem : TC 2.00
> Neka mi se javi neko ko ima sve odgov. .H datoteke
imam ih.
> Invalid Obj record in C0S.OBJ
daj malo vise podataka, na primer, dali se desava u radu sa integrated env.
ili iz komandne linije i.t.d.
pozdrav
---igor
cccc.232jtitov,
Ako bi neko bio ljubazan da ovaj program iz Rxx prevede i vrati ga u exe (com)
obliku. Nemam C compiler, a program mi se čini korisnim.
cal.ccccc.233igor.mil,
═> Ako bi neko bio ljubazan da ovaj program iz Rxx prevede i vrati ga u exe
(com)
> obliku.
Izvoli
pozdrav
---igor
cal_exe.zipcccc.234alexa,
> Invalid Obj record in C0S.OBJ
Verovatno ti ne valja linker (tj. koristiš neku bajatu verziju).
Druga mogućnost je da ti ne valja C0S.OBJ :)
cccc.235jtitov,
> igor.mil, 15.06.Sub 16:53, 160 chr
> Odgovor na 6.232, jtitov, 15.06.Sub 15:18
>Izvoli
Igore, tvoj sam dužnik. HVALA!
Pozdrav, Jura.
cccc.236nesavic,
Ma valja sve,rekao sam Invalid OBJ record...
I to kaze i kod najjednostavnijeg programa...
NeSa!
cccc.237igor.mil,
> Ma valja sve,rekao sam Invalid OBJ record...
> I to kaze i kod najjednostavnijeg programa...
Pre svega, ukoliko na ovakav nacin iznosis svoj problem, ne treba da
ocekujes da ce neko biti u stanju da ti pomogne, s obzrom da jednostavo
nemamo nikakvih podataka.
Medjutim, posto sam ja covek dobre volje, evo pokusaj sa mojim
C0S.OBJ.
pozdrav
---igor
c0s.objcccc.238alexa,
> Ma valja sve,rekao sam Invalid OBJ record...
> I to kaze i kod najjednostavnijeg programa...
Stariji DOS linkeri upravo ovo kažu za objektne module - proizvode
novijih Microsoftovih kompajlera. Razlog je u tome što su uvedeni
novi tipovi zapisa u objektnom modulu. Zato ipak nije bez veze moja
pretpostavka.
Pošto tvoj linker ima problema sa nekim modulom koji se UVEK linkuje,
nije ni čudo što dobijaš tu poruku za svaki program. Naravno,
postoji mogućnost i da je taj objektni modul stvarno oštećen.
cccc.239nesavic,
Hvala,probacu sada!
cccc.240nesavic,
Probao sam i tropa...
Nece ni sa tvojim,tj javlja gresku Linkera,a zatim se izgubio i
poceo da trazi GRAPHICS.LIB,
ma dileja,poludeo totalno....
Moracu izgleda da uzmem ponovo sve...
Ipak hvala,NeSa!
cccc.241ljupco,
Dali je moguce komunikaciju sa nekom (odredjenom) datotekom
preusmeriti da ide preko neke korisnicke rutine (uslovno receno drajver za tu
datoteku)? Ne znam dali sam jasan, ali recimo zelim da uvek kad nesto zeli da
uradi (cita/upisuje od/u) sa nekom datotekom, pre nego sto uradi to, skoci na
neku moju rutinu?
Mislim da je na turbo pascalu moguce legalno instalirati
svoj drajver za ekran (svi writeln-ovi da idu preko njega - napis "Sedam
prljavih trikova" (ZZ), pointer na drajver za ekran Usroutptr). Treba mi
nesto takvo, ali za datoteke.
cccc.242djelovic,
Možeš da zameniš neki DOS-ov interrupt koji radi to što ti treba
svojom rutinom. Ako ne znaš kako, piši. Takođe, budi malo precizniji
što se tiče toga šta sa datotekom tačno želiš da radiš, tj., koje
rutine ćeš koristiti za komunikaciju sa dat.
cccc.243ljupco,
> Takode, budi malo precizniji
> sto se tice toga sta sa datotekom tacno zelis da radis, tj.,
Zelim da kada program X otvori datoteku pod imenom IME, program Y
koji je rezidentan svu komunikaciju (citanje, zapisivanje, ispitivanje
statusa eof) programa X recimo preusmeri u RAM - o tome prog X pojma nema i
sto se njega tice upisuje/cita na disk a ne u RAM. Ali samo datoteka IME ide
u RAM - ostale datoteke prog Y ne dira.
> koje
> rutine ces koristiti za komunikaciju sa dat.
Hteo bih da koristim rutine koje operisu sa pointerom na datoteku
FILE * , fopen, fprintf, fscanf, fclose i t.d.
cccc.244zzivotic,
>> Zelim da kada program X otvori datoteku pod imenom IME, program Y
>> koji je rezidentan svu komunikaciju (citanje, zapisivanje, ispitivanje
>> statusa eof) programa X recimo preusmeri u RAM - o tome prog X pojma nema i
>> sto se njega tice upisuje/cita na disk a ne u RAM. Ali samo datoteka IME ide
>> u RAM - ostale datoteke prog Y ne dira.
Ono što je i dalje malo nejasno iz tvog pitanja je da li to treba da bude
potpuno nezavisan program TSR tipa koji treba da radi ispod bilo kog drugog
programa? Ako je tako, onda je problem rešiv ali sa nešto napora.
Radi se o tome da bi trebalo preuzeti glavni DOS interapt 0x21 i dopisati
kod koji kontroliše nekoliko funkcija - open/create/read/write/close. Ako treba
da radi baš sa bilo kojim programom onda bi trebalo izmeniti ne samo funkcije
bazirane na handle mehanizmu već i one starije FCB tipa. Takođe bi trebalo
presresti i IOCTL funkciju zbog nekih njenih usluga koje mnogi programi koriste
(pre svega da ispitaju tip uređaja na kome je datoteka - disk ili je character
device u pitanju). Sve ovo ipak deluje malo 'sumnjivo' za realizaciju.
Ono što me u stvari buni u tvom pitanju je analogija koji su pomenuo sa
TP-om. Iz nje bi se moglo zaključiti da trebi treba zapravo modul koji možeš
ulinkovati sa *svojim* programom tako da ostatak programa može biti nezavisan
od njega a da se modul aktivira na specijalno ime datoteke. Ako je ovo tačno,
problem je rešiv daleko lakše.
Pozdrav, zz
cccc.245djelovic,
Možda bi trebao da pogledaš C++, čiji tokovi (streams, manje-više
isto što i FILE) mogu da budu i u memoriji. Ako je to ono što ti
treba???
cccc.246ljupco,
> Ono sto me u stvari buni u tvom pitanju je analogija koji su pomenuo sa
> TP-om. Iz nje bi se moglo zakljuciti da trebi treba zapravo modul koji mozes
> ulinkovati sa *svojim* programom tako da ostatak programa moze biti nezavisan
> od njega a da se modul aktivira na specijalno ime datoteke. Ako je ovo tacno,
> problem je resiv daleko lakse.
Da, tacno tako - modul koji se ulinkuje sa glavnim programom i koji
se aktivira na specijalno ime datoteke.
cccc.247djelovic,
Napravi u jednom fajlu tvoje rutine tipa:
FILE *myopen (char *name, char *atr);
char fgetc (FILE *fi)č
.
.
.
koje će da opšte sa memorijom. Onda u heder datoteku (.h) koju ćeš
*uvek* uključivati poslednju staviš nešto kao:
#define open(s,l) (strcmp (s, SPECNAME) ? open (s, l) : myopen (s, l)
itd. Ne znam da li ovakav #define radi (open u def i u impl.), ali
ako radi, onda bi trebalo da završi posao. Ipak ti preporučujem da
pređeš na C++ jer on ima "legalne" mehanizme za ovo.
p.s. fali zagrada u define
cccc.248djelovic,
u prethodnoj poruci treba da stoji mygetc (FILE *fi);. on-line :(
cccc.249zonjic,
Na koji nacin se moze ostvariti (konverzioni karakter ili...?) da mi scanf
vrati vrednost 0 kada ne unesem ni jedan broj?
Unose se int-ovi... Uslov mi izgleda ovako i hteo bih izlazak iz petlje kada se
samo <enter> otkuca : while(scanf("%d", &x)!=0) {...
Probao sam sa while("%[^\n]d....... ali to vraca kodove karaktera (│49, 50.....
cccc.250igor.mil,
> Na koji nacin se moze ostvariti (konverzioni karakter ili...?) da mi scanf
> vrati vrednost 0 kada ne unesem ni jedan broj?
> Uslov mi izgleda ovako i hteo bih izlazak iz petlje kada se
> samo <enter> otkuca : while(scanf("%d", &x)!=0) {...
Funkcije scanf vraca broj promenljivih za koje je uspesno izvrseno
ucitavanje i konverzija. Znaci 0 ce vratiti samo ako dodje do
greske u ucitavanju prvog argumenta.
Posto scanf ignorise white space, u koje spada i '\n' karakter, to
sto ti zelis nije moguce izvesti na taj nacin.
Ja sam za slican problem upotrebio sledece resenje:
/*==== pocetak listinga ===============================*/
...
int x;
char xstring[MAXDIGITS];
...
/* ovde pocinje tvoja while petlja */
while (1)
{
/* format %[^\n] znaci da je '\n' TERMINATOR ulaznog stringa */
fflush(stdin);
scanf ("%[^\n]", xstring);
if(xstring[0]=='\0') break;
x = atoi(xstring);
...
}
...
/*==== kraj listinga ===============================*/
Poziv funkcije fflush je, bar u mom programu, i sa Turbo C
kompajlerom bio neophodan, do cega sam dosao metodom pipanja, i
nemam jasnu predstavo zabog cega. Bez njega je scanf ucitavao samo
pri prvom prolazu kroz petlju (?!). Moduce da je to zbog toga sto
sam nize u petlji koristio getche funkciju, pa je ona nekoga
zbunjivala. Probaj bez fflush, mozda ce da radi.
Treba obratiti paznju na to da ce atoi(xstring) vratiti 0 i
ukoliko 'xstring' ne predstavlja broj. Ako je potrebna kontrola
ulaza, treba umesto poziva atoi funkcije staviti:
if(sscanf(xstring, "%d", &x)==0) input_error();
Pozdrav
---igor
cccc.251mmihajlovic,
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> Poziv funkcije fflush je, bar u mom programu, i sa Turbo C
> kompajlerom bio neophodan, do cega sam dosao metodom pipanja, i
> nemam jasnu predstavo zabog cega. Bez njega je scanf ucitavao samo
> pri prvom prolazu kroz petlju (?!). Moduce da je to zbog toga sto
> sam nize u petlji koristio getche funkciju, pa je ona nekoga
> zbunjivala. Probaj bez fflush, mozda ce da radi.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Funkcija scanf() je prilicno neprijatna i razlicito se ponasa
zavisno od implementacije (kompajlera). Ako imamo sledecu
komandu:
scanf("%d", &number);
otkucamo li neki broj i <Enter> scanf ce nas broj dodeliti
promenljivoj number ali ce ostaviti newline karakter u baferu.
Ovo se moze prevazici na nekim sistemima ako eksplicitno zadamo
citanje newline karaktera:
scanf("%d\n", &number);
ali na MSDOS-u ovo ne radi, bar ne sa kompajlerima sa kojima ja
imam iskustava (MS, TC, TS, ZT, HC). Buduci da je u navedenom
delu programa:
scanf ("%[^\n]", xstring);
eksplicitno zadato citanje stringa DO newline karaktera, koji je u
drugom prolazu prvi karakter u baferu stdin, fflush() je neophodan.
U svakom slucaju, funkciju scanf() treba izbegavati koliko god je
moguce jer je ona jedna od najvecih funkcija run-time biblioteke i
nepotrebno povecava (usporava) program. Navedeni primer je daleko
bolje uraditi koristenjem gets() i atoi() funkcija:
/*==== pocetak listinga ===============================*/
int x;
char xstring[MAXDIGITS]; /* Ne zaboravi prostor za '\0' na kraju */
/* ovde pocinje tvoja while petlja */
while (1)
{
gets (xstring);
if(xstring[0]=='\0') break;
x = atoi(xstring);
...
}
/*==== kraj listinga ===============================*/
MM
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
E
cccc.252docke,
Ima li neko bilo kakvih iskustava sa Zortech C++ om.Šta može .kolko vredi ,
neko poređenje sa Borlandovim C++ i sl.
Bilo šta da ste čuli napišite ,jer prema nekim napisima u inostranstvu (čittaj
reklamama) izgleda da je na našim prostorima ovaj ptoizvod neopravdano
zapostavljen.
Pozdrav Docke
P.S. nije ptoizvod nego proizvod
cccc.253djelovic,
Imam AWK 3.00. Da li to nekoga zanima, jer ne bi da ga šaljem bez
veze. Inače, stvar je strašna!
cccc.254igor.mil,
> Imam AWK 3.00. Da li to nekoga zanima, jer ne bi da ga saljem bez
> veze.
Ako je za neki MS-DOS compiler (preferably Turbo C), salji obavezno!
pozdrav
---igor
cccc.255djelovic,
Nemam source, već preveden program. Pošto smatram da program
zaslužuje da se nađe u PCSOFT, nalepiću ga uz ovu poruku.
Inače, što se tiče teme o piratstvu, mislim da je moderator bio u
pravu što je uklonio fajl koji bi *možda* (mada je malo verovatno,
ali treba imati princip) mogao da donese neprilike SEZAM-u. Ipak se
slažem da je većina ljudi hipokritski (da li se tako kaže?? :) )
nastrojena po tom pitanju. Ko je poslao lovu za sav shareware koji
ima? Ko je ikada poslao donaciju autoru PD programa? Budimo realni,
čovek plaća samo ono što mora (svaka čast izuzecima)? Primer sa
knjigama i video kasetama je sasvim u redu.
awk300.zipcccc.256maleksic,
Hej!
Da li netko zna: da li postoji translator sa FORTRAN77 sourca
na ANSI C source, a da radi na PC-ju, naravno ??
Drugim rijecima: treba mi program koji za ulazne podatke ima
standardni FORTRAN77 source fajl, a posle obrade da se dobije
odgovarajuci source na ANSI C-u?
cccc.257djelovic,
Ne znam za FORTRAN, ali znam da ima za basic, pa ako te zanima,
daću ti adresu. Ako nabaviš ovo za fortran, *obavezno* javi, i meni
treba.
cccc.258mmihajlovic,
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> Da li netko zna: da li postoji translator sa FORTRAN77 sourca
> na ANSI C source, a da radi na PC-ju, naravno ??
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Naravno! Postoje bar dva vrlo dobra.
PROMULA.FORTRAN ($495) FOR_C oko($600)
PROMULA Developement Corporation COBALT BLUE Co.
3620 N. High St. Suite 301 2940 Union Ave, Suite C
Columbus, Ohio 43214 San Hose, California 95124
tel (614)263-5454 tel (408)723-0474
fax (408)377-7648
Oba su (barem prema prikazima) izvrsna mada licno mislim da
je PROMULA bolji izbor zbog sledeceg: Uz njega dobijate
run-time lib. sa oko 150 funkcija za rad sa memorijom,
posto je primarna namena ovog translatora da omoguci rad
velikih FORTRAN aplikacija na 640K DOS-u. Npr.
DIMENSION A(10000,20),B(10000,20)
bukvalno preveden (sto FOR_C i radi) bi dao:
static float a[20][10000], b[20][10000];
Pod DOS-om je ovo neupotrebljio. E, ovde PROMULA omogucava
da se sve varijable koje su vece od neke zadate vrednosti
tretiraju kao virtualne i njihovo referenciranje povlaci
disk I/O (obzirom da je skoro izasla verzija 3.0 za
pretpostaviti je da sad tu ima koristenja EMS, XMS itd).
Pomocu ovog programa je nekakav model za distribuciju
elektricne energije u nisko naponskoj mrezi spusten sa IBM
mainframe-a gde je uzimao 3M core memorije na obican PC pod
DOS-om, i davao identicne rezultate (bar prema prikazu
proizvodjaca). Dalje, FORTRANSKA COMMON naredba, posebno
ako je vezana sa EQUIVALENCE je izrazito neprijatna za
prevod na C. PROMULA ovde nudi cak cetiri varijante
prevoda, zavisno sta se desava sa COMMON blokom. FOR_C
tretira COMMON blok uvek kao lokalni pointer na strukturu.
Da se razumemo, ja NEMAM ni jedan od ovih translatora, ali
imam gomilu prikaza i reklamnih materijala za oba. Prilicno
je jednodusna ocena da je PROMULA.FORTRAN bolji. Sa druge
strane COBALT BLUE ima FOR_C++ i FOR_STRUCT. Za prvi je
jasno sta je, dok drugi od vaseg spageti FORTRANSKOG
programa (a vecina ih je takva) pravi potpuno struktuirani
kod.
Ako bilo ko ima ove programe, OBAVEZNO neka mi se javi
buduci da sam VRLO zainteresovan za tako nesto. Cak sam
zainteresovan za, eventualnu zajednicku kupovinu uz podelu
troskova, jer svaka investicija u software od preko $400 u
nasim uslovima mi se cini suludom. Kod Prog. paradisea se
moze naci i za ispod $400.
MM
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
cccc.259maleksic,
>> ...ali znam da ima za basic ..
Na zalost, treba mi bas za FORTRAN
cccc.260maleksic,
>> > Da li netko zna: da li postoji translator sa FORTRAN77 sourca
>> > na ANSI C source, a da radi na PC-ju, naravno ??
>> Naravno! Postoje bar dva vrlo dobra.
>>
>> PROMULA.FORTRAN ($495) FOR_C oko($600)
Meni je vazno da proizvedeni C source bude sto standardniji (strogo
po ANSI-ju) da bi bio portabilan na razne sisteme. Podrska raznim
FORTRAN-skim prosirenjima (do while, end do, ...i raznim drugim
prosirenjima koja se stidljivo najavljuju za novi standard FORTRANA)
takodje je dobrodosla. Naravno, podrazumeva se da je obavezno podrzan
kompletan standardni FORTRAN77.
Koji je translator bolji ako se ovo sve uzme u obzir?
cccc.261mmihajlovic,
> Meni je vazno da proizvedeni C source bude sto standardniji (strogo
> po ANSI-ju) da bi bio portabilan na razne sisteme. Podrska raznim
> FORTRAN-skim prosirenjima (do while, end do, ...i raznim drugim
> prosirenjima koja se stidljivo najavljuju za novi standard FORTRANA)
I jedan i drugi imaju mogucnost da izvrse translaciju u cist C.
U kojoj meri je on ANSI (a u kojoj K&R) nisam uspeo da iskopam.
U svakom slucaju ja bih uvek pre uzeo PROMULA.FORTRAN posebno
zbog egzibicija sa COMMON blokovima (ko nije rucno prebacivao
C u FORTRAN ne zna koje su to muke) a i zbog cene. Uz to PROMULA
(nova verzija) nudi mogucnost rada sa gotovo svim dijalektima
FORTRAN-a.
MM
P.S. Vec su polako poceli da se javljaju interesenti
za zajednicku kupovinu.
cccc.262mmihajlovic,
Prvo moram da se izvinim zbog nekih netacnosti u porukama 6.258 6.261.
Cena PROMULA.FORTRAN-a za PC je neverovatnih $995 ! :((((
razgovarao sam sa vlasnikom i on tvrdi da sada (verzija 3.0)prevodi
100% bilo koji FORTRAN dijalekat u cist ANSI C (i ovo sam saznao).
Za te pare se dobija izvorni kod za run-time lib. sada pitanje odnosa
cena/pouzdanost (ili procennat dobrog prevodjenja) ostaje otvoreno.
Cege, izgleda nista od nase kupovine.
MM
cccc.263sgopcevic,
Zdravo,
Sa Sezama sam pruzeo datoteku r064ume.zip u kojoj su dati
programi iz umetka racunara 64 - PROZORI NA C-U
1./
Prilikom kompajliranja programa MENU.C u message prozoru
pojavile su mi se sledece poruke:
Warning:d:\tc\exec\menu.c 556: non-portable pointer
assignement in function directory
Warning:d:\tc\exec\menu.c 755: non-portable pointer
assignement in function ch_dir
i kursor je u editor prozoru u oba slucaja stao na liniju
u kojoj je pisalo:
fblp=0x00ff; /*inicijalizacija pointera */
2./
Posto sam predhodno uspesno kompajlirao datoteku lowfn.c
pokusao sam da formiram biblioteku rac.lst samo od ove datoteke.
Po izvrsenju naredbe:
TLIB d:\tc\lib\rac.lib +d:\tc\exec\lowfn.c, rac.lst
prijavljena mi je greska:
error:record kind, 0x2E found, expected theadr or lheadr
Sta znace ove greske i sta da radim?
Sgopcevic
cccc.264alexa,
> Prilikom kompajliranja programa MENU.C u message prozoru
> pojavile su mi se sledece poruke:
>
> Warning:d:ĐtcĐexecĐmenu.c 556: non-portable pointer
> assignement in function directory
> Warning:d:ĐtcĐexecĐmenu.c 755: non-portable pointer
> assignement in function ch_dir
>
> i kursor je u editor prozoru u oba slucaja stao na liniju
> u kojoj je pisalo:
>
> fblp=0x00ff; /*inicijalizacija pointera */
Pa, ovde je kompajler pošteno odradio svoj posao - ovo jeste
neportabilno, ali nemoj mnogo oko toga da se sekiraš.
Portabilno je u okviru PC-ja pod DOS-om.
> TLIB d:ĐtcĐlibĐrac.lib +d:ĐtcĐexecĐlowfn.c, rac.lst
>
> prijavljena mi je greska:
>
> error:record kind, 0x2E found, expected theadr or lheadr
Ja nisam nikad koristio TLIB, ali nešto mi govori da u biblioteku
treba da ubaciš lowfn.obj, a ne lowfn.c :)
cccc.266zonjic,
A da nije to SW za MSC a ti pokusao da compilujes TC-om ili obratno?
cccc.267zonjic,
Moze li neko da mi kaze sta ovde (ovdi) ne valja?
DUMMYINT.C
#include <stdio.h>
#include <dos.h>
#define INTR 0x1c
void interrupt (*starivektor)(void);
char *s;
void interrupt novivektor(void)
{
int x, y;
x=wherex();
y=wherey();
gotoxy( 1, 1);
printf("Rade");
gotoxy( x, y);
starivektor();
}
void main()
{
starivektor = getvect(INTR);
setvect(INTR, novivektor);
}
cccc.268zonjic,
Verovatno zbog toga sto se DOS poziva i u printf (kad smo vec u DOS-u).
Nesto manje problema proizvodi funkcija putch(char c), ali kada se izvrsi
program, a zatim zatrazi dir racunar blokira...
Ne znam gde je caka. (da li treba da ostane putch i da li uopste ovo moze da se
lako izvede?)
cccc.269sgopcevic,
>Ja nisam nikada koristio TLIB ali mi nesto govori da u biblioteku treba da
>ubacis lownfn.obj umesto lownfn.c
Primedba je bila OK. Umesto lowfn.c u naredbi TLIB stavio sam lownf.obj i uspeo
sam da formiram biblioteku RAC.LIB.
Medjutim sada mi se pojavio drugi problem.U fazi linkovanja programa dobijam
poruku:
Linking error:undefined symbol '_ime' in modul IME_MODULA
iako su u programu u include naredbi navedene datotke ime.h sa path-om koje
sadrze potrebne funkcije a formirana biblioteka se nalazi u odgovarajucem
direktorijumu c:\tc\lib. Pri formiranju biblioteke drzao sam se upustva iz
umetka u racunarima br 64 -Pozori na c-u od funkcije do biblioteke.
Da mozda ne fali jos nesto u upustvu ?
sgopcevic
cccc.270sgoran,
Konacno !!!
Postao sam vlasnik (registrovani) Borland C++. Svim nevernim Tomama
u inat. Uzgred ako se neko cuje sa Bulajom, kazite mu da je i njegov
paket stigao.
_
Ushiceni pozdrav SGoran.
cccc.271mmilosevic,
Help!
Zna li neko kako da setujem mod 0x13 -> ( dec ) 19( 320x200 ,256colors)
u TC 2.00.
u TC 2.00.
U Help-u nema odgovarajuci mod , poludeo saCak sam bio primoran
da radim u MSC 5.1 da bi uradio neki glupigramcic u tom modu.
Ako neko ima resenje, neka napise poruku ili neka posalje na
MMILOSEVIC.
Unapred hvala, MMILOSEVIC
Aleksandar Milosevic
cccc.272mmihajlovic,
Evo moje varijente FileFind-a. U poredjenu sa Nortonivim
FF-om postoje neke minimalne razlike u formatu ispisa i
nacinu zadavanja parametara ali se one mogu prilagoditi
obzirom da je dat izvorni kod. Program je pisan u C-u i
regularno se kompajlira po MSC i TC uz postavljen normalni
warning level. Komentari su dati na engleskom a formatiranje
sourcea je radjeno u 'CLEAR+ for C'. Mozete ga prilagodjavati
po svom ukusu. Pa, srecno.
MM
mff.zipcccc.273mmilosevic,
Imam jedan problem oko TC-a 2.00.
Nedavno sam preuzeo drajver za VGA sa 256 boja,
SVGABGI.ZIP ( valjda u konf. grafika ) .
Instalirao sam ga u svom programu, i neki
moji mali programi su normalno radili ali
sa 256 boja.
E, sad, uzeo sam BGIDEMO.C i tu instalirao
mod 320x200 sa 256 boja. U pocetku je radilo,
ali sto sam ga vise kompajlirao nisam dobijao
INFO tekst na pocetku programa i nisam dobijao
ni linije, nije ni radio putimage i getimage
demo.
Medjutim, nije tu problematika.Problem je u
tome sto u TC-u nema adekvatna rutina za
setovanje paleta.Takva jedina funkcija je
setrgbcolor i setrgbpalette.Ali uvek kada
ga ubacim u program LINKER prijavljuje gresku.
( mislim za setrgbcolor i setrgbpalette ).
Onda sam pokusao da napisem program
u asembleru koji RED,GREEN,BLUE komponentu
pretapa u jednu boju preko interapta 0x10
i on je radio bez problema.
Ali ne lezi vraze, BGI driver ne priznaje
nikakve rutine koje ne koriste njegov drjver.
Na kraju , da vas ne davim, kratko i jasno
treba mi rutina koja ce tri komponente,
RED , GREEN , BLUE pretvoriti u jednu boju.
Sve sam pokusao i nista mi ne ide od ruke.
Unapred HVALA , MMilosevic
Milosevic Aleksandar
cccc.274djelovic,
Da ne idem previše opširno, imaš odgovarajući interrupt pod
BIOS-om koji možeš da pozoveš sa int86 (...). Ako se u to ne razumeš,
reci pa ću ja da se ovde rasplinem na par strana. Takođe, ako imaš
vremena, download-uj ona tri fajla sa tekstovima o interruptima, pa
šmekni malo - ima mnogo zanimljivih stvari.
cccc.275mmihajlovic,
Ova (Turbo)C funkcija resetuje racunar (warm boot).
reboot()
{
*(unsigned int far*)0x472=0x1234; /* Za cold boot promeniti 1234
u nesto drugo */
__emit__(0xea,0,0,0xff,0xff); /* Asemblerski kod za jmp FFFF:0000 */
}
MM
cccc.276mmilosevic,
E, djelovicu, nisi morao da Úse ─mucis, nasao sam resenje
jos odavno, sa intr 0x10, funkcija 0x10 i podfunkcija 0x10,
( valjda ide tako , akoÚ se jos secam ).Ono sto sam napisao
su gluposti, ali coveka lako navede na to.Na primer pokusaj umesto
initgraph() da upotrebis intr 0x10, ah=0x00, al=0x13( setuj bilo koji
mod Ę, u ovom sl▀ucaju Šš.─320x200 , 256 boja ).
I u programu ─upotrebi par njegovih funnkicija za crtanje, cirlce...
Startujes program, i truba, javlja gresku, jer nisi isao preko
initgraph() koji setuje DRIVER!
To me je navelo da pomislim da je TC usko ogranicen samo na svoje
funkcije koje su opet nadovezane za drajver.Medjutim, nijeako
, nedavno sam napravio program za prikazivanj GIF slicica, i
obicnih slicica skinuti sa nekimŇü GRABOM.
Eto , to je to, a sto se tice oneÚ rutine preko Úintr 0x10
nemoras da brines takve prljave fore i trikove sam odavno
prevaziso !!!! :))) ( he! he! he ! ).
Ajde dosta sam zabalavio , pozdraqv od MMILOSEVIC-a
Aleksandar Milosevic
cccc.277mjova,
evo jednog zanimljivog pitanja za one koji se ovim bave.
shell-ovanjem nekog programa pomoću funkcije spawn, child proces
obavezno zauzme 64k. ima li možda neko rešenje koje zahteve manje
memorije? nema potrebe da rezerviše ceo segment radi programa od
nekoliko k. ili možda ima?
mislim da se problem može rešiti brljanjem po standardnim
bibliotekama, mada to nije neko rešenje.
----------------(child.c)----------------
#include<process.h>
#include<stdio.h>
main(void) {
printf("vrno je %i", spawnl(P_WAIT, "mi.com", NULL));
}
----------------(child.c)----------------
Type Paragraphs Bytes Owner
---- ---------- ----- -------------
Prog 047B-0528h 2784 047Bh 4DOS 4DOS
Prog 057C-0614h 2448 057Ch ANSI POFF /B50 /Q
Prog 062B-162Ah 64k 062Bh CHILD E:\TC\FUNC\CHILD.COM:\TC\FUNC\MI.COM
Prog 1641-9FFFh 551k 1641h MI E:\TC\FUNC\MI.COM
Extended (AT/286/386) memory. Available: 912k
XMS driver version 02.00 (05.11). HMA exists.
Expanded memory (EMM 4.0) at page frame E000h
3680k total ( 2768k used + 912k free).
vrno je 0
šule
cccc.278djelovic,
Reci za šta ti to treba, pa da ga izbegnemo ako možemo. Takođe,
probaj da pročitaš uputstvo za TC++/Izlazak u shell, jer je tu bilo
nešto na tu temu. Znam i da može da se ostavi i manje, samo se ne
sećam kako ide. Još jednom: Zašto?
cccc.279zzivotic,
>> shell-ovanjem nekog programa pomoću funkcije spawn, child
>> proces obavezno zauzme 64k. ima li možda neko rešenje
>> koje zahteve manje memorije? nema potrebe da rezerviše
>> ceo segment radi programa od nekoliko k. ili možda ima?
>> mislim da se problem može rešiti brljanjem po standardnim
>> bibliotekama, mada to nije neko rešenje.
O ovome je bilo reči u "R". U startup modulu (CRT0.ASM) je difinisano da
program uvek alocira 64K čak i ako mu treba manje - uglavnom zbog prostora na
near heap-u. Ne znam kako bi se stvar rešila kod COM programa, ali ako
generišeš EXE fajl, možeš da upotrebiš LINK prekidač /CP (CPARMAXALLOC ili tako
nekako) kojim možeš ograničiti taj 'višak'. Nakon:
link child /CP:1;
Program će zahtevati samo jedan pasus više nego što mu je minimalno
neophodno. Ovo se sve odnosi na Microsoft ali pretpostavljam da i TC radi
slično.
Pozdrav, zz
cccc.280bojt,
>> link child /CP:1;
>> Program će zahtevati samo jedan pasus više nego što mu je
>> minimalno neophodno.
Neće! Pokušaće da stavi samo jedan pasus, i ukoliko je to manje
od broja potrebnih pasusa, usvojiće broj potrebnih pasusa.
Medjutim, ovaj princip se, bar po mom iskustvu, pokazao prilično
nepouzdanim, jer se dešava da program pukne kod otvaranja (više)
fajlova i slično. Po onome koliko sam ja imao prilike da ispitam
taj problem, optimum je staviti 30-50 pasusa više nego što je
programu potrebno. To se ne može postići opcijom /CP kod
linkovanja, već se pomoću EXEHDR pročita koliko je ekstra pasusa
potrebno programu (Extra paragraphs needed), pa na to dodati
30-50 i onda promeniti traženi broj ekstra pasusa (Extra
paragraphs wanted) sa EXEHDR /MAX:n file.exe
Što se tiče opcije /CP, evo šta kaže dokumentacija:
Syntax: /CP[ARMAXALLOC]:number
This option sets the maximum number of 16-byte paragraphs needed
by the program when it is loaded into memory. The field <number>
can contain any integer from 1 to 65,535. This option is valid
only when linking DOS programs.
The operating system uses this value when allocating space for
the
program before loading it. The option is useful when you want to
execute another program from within your program and you need to
reserve space for it.
Without this option, LINK sets the request to 65,535 paragraphs.
This request always fails (it exceeds DOS limits); and the
operating system allocates the largest possible contiguous block
of memory. With the /CP option, you can adjust the allocation to
the specific needs of your program.
If you set <number> to less than the minimum number of
paragraphs
needed by the program, LINK ignores your request and sets the
value equal to whatever the program requires. To free more
memory
for programs compiled in the medium- and large-memory models,
link
with /CP:1. This leaves no space for the near heap.
NOTE: You can use the EXEHDR utility to change the maximum
allocation space after a program has been linked.
cccc.281mjova,
>> Reci za šta ti to treba, pa da ga izbegnemo ako možemo. Takođe,
>> probaj da pročitaš uputstvo za TC++/Izlazak u shell, jer je tu bilo
>> nešto na tu temu. Znam i da može da se ostavi i manje, samo se ne
>> sećam kako ide. Još jednom: Zašto?
Originalno uputstvo nemam, ali imam Complete Reference Turbo C/C++ od
(Herbert Schildt). U toj knjizi nisam našao ništa zanimljivije o tom
problemu.
A što mii to treba? Pa vidi ovako, radim nešto što ima svega nekoliko
kb (oko 5). Takav program nema potrebe da zauzme 64k, naročito ako se
poziva iz nekog programa. Osnovna ideja je da mi treba vrlo krtatak
program u memoriji.
mjova
cccc.283zzivotic,
>> Neće! Pokušaće da stavi samo jedan pasus, i ukoliko je to
>> manje od broja potrebnih pasusa, usvojiće broj potrebnih
>> pasusa.
U pravu si, moja greška.
>> Medjutim, ovaj princip se, bar po mom iskustvu, pokazao
>> prilično nepouzdanim, jer se dešava da program pukne kod
>> otvaranja (više) fajlova i slično. Po onome koliko sam ja
>> imao prilike da ispitam taj problem, optimum je staviti
>> 30-50 pasusa više nego što je programu potrebno.
Princip nije nepouzdan - ono što je nepouzdano je kod koji generiše
kompajler (u tvom slučaju fortran?) kada se nađe u situaciji da nema ni bajta
slobodne memorije. Ipak, kod C-a (MS) izgleda da stvari nisu tako čiste -
skineš maxmem i nema više memorije na near heap-u. Pogledaću detaljnije o čemu
se radi...
Pozdrav, zz
cccc.284mjova,
>> near heap-u. Ne znam kako bi se stvar rešila kod COM programa, ali ako
>> generišeš EXE fajl, možeš da upotrebiš LINK prekidač /CP (CPARMAXALLOC
>> ili tako nekako) kojim možeš ograničiti taj 'višak'. Nakon:
da, program će biti EXE formata jer mi tako više odgovara, ali nisam
baš ubeđen da TLINK ima takav prekidač :(
mjova
cccc.285zzivotic,
>> da, program će biti EXE formata jer mi tako više
>> odgovara, ali nisam baš ubeđen da TLINK ima takav
>> prekidač :(
Bez obzira, sa EXEHDR-om možeš naknadno da uradiš na gotovom EXE fajlu isto.
Pozdrav, zz
cccc.286mmihajlovic,
> Moze li neko da mi kaze sta ovde (ovdi) ne valja?
>
> DUMMYINT.C
Priznajem da gledajuci ovaj program od sume nisam video drvece.
Tek kad sam pogledao generisani asemblerski kod postalo je jasno.
Problem je u tome sto interrupt service ne vrsi switch na lokalni
stack, te se ne mogu koristiti lokalne varijable niti pozivi bibliotekama.
MM
cccc.287sgopcevic,
Da li moze neko da mi pomogne?
U fazi linkovanja programa dobijam poruku:
Linking error:undefined symbol '_ime' in modul IME_MODULA
iako su u programu u include naredbi navedena datotka *.h sa path-om koji
sadrzi potrebne funkcije a formirana biblioteka se nalazi u odgovarajucem
direktorijumu c:\tc\lib.
Biblioteku sam formirao na osnovu upustva iz umetka u racunarima br 64 -Prozori
na c-u od funkcije do biblioteke od A. Radovanovica.
Da mozda ne fali nesto u upustvu ?
sgopcevic
cccc.289djelovic,
Sumnjam na dve stvari:
1) Nisi ubacio biblioteku u projekat.
2) Preveo si biblioteku iz *.C fajlova a pokušavaš da je koristiš
iz *.CPP fajlova. Ovo ne radi zato što C++ koristi nešto što se zove
name mangling, tj. funkciju look (int x, char *p) prevodi u nešto kao
look_intchp. Ovo možeš izbeći ako koristiš extern "C" direktivu,
šmekni malo *.h fajlove koji dolaze uz kompajler, imaš to u njima.
P.S. Možda nešto zaista fali. Uradi search za to što ne dostaje u
source-u biblioteke.
cccc.290igor.mil,
>> Biblioteku sam formirao na osnovu upustva iz umetka u racunarima br
>> 64 -Prozori
>> na c-u od funkcije do biblioteke od A. Radovanovica.
>>
>> Da mozda ne fali nesto u upustvu ?
Rekao bih da si u pravu. Upravo sam pogledao taj umetak i nisam
pronasao da je receno da za svaki program koji koristi funkcije iz
bibloteke RAC.LIB ili bilo koje nestandardne biblioteke, a prevodi se
iz integrisane okoline TC-a, treba formirati odgovarajuci .PRJ fajl.
Na primer, ako se glavni program zove GLAVNI.C, tada treba formirati
fajl GLAVNI.PRJ sa sledecim sadrzajem:
GLAVNI
RAC.LIB
Ovaj fajl se aktivira preko opcije "Project Name" menija "Project",
gde treba upisati "GLAVNI.PRJ".
Sada ce sve lepo da radi, samo treba pritisnuti F9...
Pozdrav od Igora
cccc.291igor.mil,
Pitanje za poznavaoce TC-a:
"Cemu sluzi opcija /E - create extended dictionary programa TLIB?"
Pozdrav od Igora
cccc.292sgopcevic,
Igore hvala. Uspeo sam da formiram exe fajl na osnovu tvoga uputstva
pozdrav od spira
cccc.293nesic,
Rešavanje ovog problema sam već jednom objašnjavao
(odgovor na poruku 8.199 u konferenciji PC.SOFT). Ali
niko da sada nije bio ljubazan da mi da odgovor na
pitanje "Da li je pomoću tog BGI drajvera moguće pozvati
neki mod koji nije 300x200x256?". Imam VGA karticu sa 1MB
memorije i valjda bih mogao sebi da priuštim i mod
800x600x256. Kako?
Inače, ja nemam baš taj drajver koji ti spominješ,
već neki VGA256 koji sam pokupio iz neke igre pisane u
Turbo Pascal-u (ili Turbo C-u).
Evo kako ja postavljam paletu u Turbo Pascal-u, a ti
to prepevaj u C.
uses
dos, crt, graph;
type
colortype=record
r,g,b:byte;
end;
vgapalettetype=array[0..255] of colortype;
procedure vgasetallpalette(var p:vgapalettetype);
var
regs:registers;
begin
with regs do
begin
ax:=$1012;
bx:=$0000;
cx:=$0100;
es:=seg(p);
dx:=ofs(p);
end;
intr($10,regs);
end;
{$f+}
function detectvga256:integer;
var
detecteddriver:integer;
suggestedmode:integer;
begin
detectgraph(detecteddriver,suggestedmode);
if (detecteddriver=vga) or (detecteddriver=mcga) then
detectvga256:=grok
else
detectvga256:=grerror;
end;
{$f-}
var
autodetectpointer:pointer;
driver,mode:integer;
errorcode:integer;
colornum:integer;
palette:vgapalettetype;
begin
autodetectpointer:=@detectvga256;
driver:=installuserdriver('vga256',autodetectpointer);
driver:=detect;
mode:=3;
initgraph(driver,mode,'');
errorcode:=graphresult;
if errorcode<>grok then
begin
writeln('Error:',grapherrormsg(errorcode));
halt;
end;
for colornum:=0 to getmaxcolor do
begin
palette[colornum].r:=colornum div 1;
palette[colornum].g:=colornum div 2;
palette[colornum].b:=colornum div 4;
end;
vgasetallpalette(palette);
for colornum:=0 to getmaxcolor do
begin
setcolor(colornum);
line(colornum,0,colornum,getmaxy);
end;
repeat until keypressed;
closegraph;
end.
Pozdrav, Nešić
cccc.294iri.ic,
Pronasao sam u Dr.Dobb's Journal - u prikaz jednog, izgleda, izvrsnog library-a
za user interface ( u C-u) od Al Stevens-a. Library je public domain i dostupan
je na Telepathu i na CompuServe-u ( Library 0, DDJ forum). Zove se DFLATn.ARC
(n oznacava verziju). Probao sam ga pokupiti sa TELEPATH-a (jer je besplatan),
ali ne ide . Losa je komunikacija i na ekranu dobijam samo zvrljotine. Ako neko
zeli doci do ovog library-a, a uspije pristupiti TELPATHU ili ima pristup na
CompuServe bilo bi dobro da ga pokupi i stavi ga na SEZAM ili da mi barem
ostavi poruku, pa da se dogovorimo kako ga mogu dobiti
Broj telepatha je 991 415 364 8315 (1200/2400 N 8 1 )....
Unaprijed hvala na pomoci..... Pozdrav od IRI.IC
cccc.295braca,
Eve ga DFLAT3. Stvarno izgleda majstorski!
cccc.296bulaja,
DFLAT3 je prebacen u \ibmpc\misc direktorijum.
Hvala na prilogu.
cccc.297iri.ic,
Hvala Bulaji i Braci na pomoci !
Kada dobijem i uputstva za DFLAT3, ostaviti cu ih na SEZAMU.
cccc.298braca,
Uputstva su nekoliko poslednjih (i budućih) članaka Ala Stivensa u DDJ!
cccc.299rakim,
Kako ugasiti cursor na terminalu (terminfo - unix C)?
rakim
cccc.300zkehler,
Vrlo je frustrirajuće kada na izgled odličnu telefonsku vezu
sa USA pokvari brojač impulsa. Glas ide, ali modem preživljava
teške trenutke. Što je vrlo interesantno, izgleda da na američkoj
strani modem ne prima toliko đubreta, jer se BBS-ovi ne bune.
Zoran
cccc.303djelovic,
Viva C! Pre neki dan sam uzeo program iz ATARIST direktorijuma i
prebacio ga na PC-a za 10 min., a program je imao i grafiku. Ex,
kolko mi treba da jedan program prebacim sa 360-ice na PC fortran...
cccc.304ppekovic,
Evo liste i opisa bug-ova MSC-a 6!!!
Paya
c60probs.zipcccc.305djelovic,
Kako se interpretiraju naredbe tipa *c = *c++? (tj. kojim
redosledom?). Da li je ovo definisano standardom ili zavisi od
kompajlera?
cccc.306georgd,
Da li neko koristi cross C za mikroprocesor 8051,
mene bi narocito radovao susret sa nekim ko koristi
implenentaciju C-51 firme Keil GmbH (ili Franklin
Softvare USA).
Pozdrav! GeorgD
cccc.307igor.mil,
> Kako se interpretiraju naredbe tipa *c = *c++?
Ne vidim kakvog bi smisla imala ova naredba, ali po mom misljenju,
redosled akcija je sledeci:
- kopira se sadrzaj memorijske lokacije na koju u kazuje c u lokaciju
na koju ukazuje c (isto kao *c = *c;)
- inkrementira se sadrzaj lokacije na koju ukazuje c.
sve u svemu *c = *c++ je ekvivalentno sa *c++
pozdrav od Igora
cccc.308ivujanic,
Da se ljudi ne bi palili i trošili impulsne na niztovarenje mc20.zip, source-a
C kompajlera, da vas obavestim da tamo do source-a nema ni traga ni glasa. To
je samo demo, dakle već preveden kompajler, .EXE program, i već prevedena
biblioteka. Ako hoćete source, tamo stoji jedna adresa na koju treba da kanete
neki US$ autoru...
E, sysadmi, sram vas bilo! Promenite onaj tekst uz file...
Ivica
cccc.309ppekovic,
>> Da se ljudi ne bi palili i trošili impulsne na niztovarenje mc20.zip,
>> source-a C kompajlera, da vas obavestim da tamo do source-a nema ni traga
>> ni glasa. To je samo demo, dakle već preveden kompajler, .EXE program, i
>> već prevedena biblioteka. Ako hoćete source, tamo stoji jedna adresa na
>> koju treba da kanete neki US$ autoru...
Sorry 10E2000 puta. Greška je moja. Ni sam neznam koliko me je
ljudi molilo da im nađem negde source za neki C kompajler. Našao sam
na TRICKLE-u ali tamo se uopšte ne pominje da je to samo 'demo' source.
Pošto ovih dana i nemam baš preterano vremena (ispiti) nisam detaljno
pogledao o čemu se radi već sam samo proverio ispravnost arhive,
pokrenuo sve exe-e i com-ove i ustanovio da nema grešaka i pogledao
početka onof text fajla i u njemu, na početku, piše lepo da je unutra
kompletan source i tralalala. Uz to još sam video gomilu .C i .H -ova
i eto... Ko bi sve predvideo.
Izvinjavam se svima još jednom, ali ...
Paya
cccc.310bulaja,
│Da se ljudi ne bi palili i trosili impulsne na niztovarenje mc20.zip,
│source-a C kompajlera, da vas obavestim da tamo do source-a nema ni traga
│ni glasa. To je samo demo, dakle vec preveden kompajler, .EXE program, i
│vec prevedena biblioteka. Ako hocete source, tamo stoji jedna adresa na
│koju treba da kanete neki US$ autoru...
│
│E, sysadmi, sram vas bilo! Promenite onaj tekst uz file...
└───
Ne da ce biti promenjen text uz file nego se file (najverovatnije) biti
obrisan. Ali cu zato verovatno staviti Small C u direktorijum (nisam
gledao da li je onaj u orci kompletan, ali svejedno cu nabaviti ceo).
cccc.311todorp,
Hi!
Da li neko zna kako se poziva interrupt iz C-a (turbo C-a)?
Pozdrav od Todora.
cccc.312djelovic,
Imaš više f-ja za pozivanje interrupta, sve počinju sa int, pa
potraži u helpu TC-a. Npr int86x...
cccc.313vasiljevic,
Zna li neko neki dobar nacin za pribavljanje neke literature ili bilo cega u
vezi sa grafikom u C-u>
Marko (the asker)
cccc.314alexa,
Radi se o naredbi (izrazu)
*c = *c++
> - inkrementira se sadrzaj lokacije na koju ukazuje c.
E pa neće biti - ni na jednom C-u na koji sam naišao nije se
inkrementirao sadržaj lokacije, nego se inkrementirao c.
Ubeđen sam da je ovo 'zakucano' u listi prioriteta (++ pre
* dereferencing-a), samo mi se ne da da sada kopam po knjigama.
Upravo zato i originalno pitanje - da li će se inkrementiranje
izvršiti pre ili posle dodeljivanja.
Mislim da će se uvek prvo izračunati desna strana, pa tek posle
leva (lvalue), i na kraju izvršiti dodeljivanje (ovo sve, naravno,
na apstraktnom - konceptualnom nivou).
cccc.315djelovic,
> Tužna vest, ali naredba *c = *c++ ne radi ništa! Što se
> tiče redosleda za * i ++, nema priče - prvo ide ++. Ono što je
>mene zanimalo je da li će neki kompajler prevesti ovo kao:
> 1. Uzmi *c
> 2. Povećaj c
> 3. Stavi uzeti sadržaj na c
> Međutim, izgleda da se ++ izvršava tak kada se izvrši ceo
>izraz. Ovo nije slučaj sa pozivanjem f-ja (za razliku od makroa):
> Kako rezultat nekog izraza biva stavljen na stek (s desna na levo),
> tako se izvršavaju ++ i --. Probajte recimo:
> a = 5;
> printf ("%d %d", a, a++);
>
> *** Extreme caution! *** Ovakva igrica ne radi sa makroima,
> so kids, don't do this at home! Handle with care! ...
cccc.317zormi,
* Zna li neko neki dobar nacin za pribavljanje neke
* literature ili bilo cega u vezi sa grafikom u C-u>
Ima na BBS-ovima dosta biblioteka funkcija u C-u.
Baš sam juče video na EXEC-u nešto za rad sa PCX
i VGA... Videću šta mogu da učinim.
cccc.318mjova,
> *c = *c++
slabo snam C ali jednom prilikom imao sam sličan problem. naravno da
sam pitao ZZ-a i on mi reče da se "++ ispred" izvršava PRE *CELOG*
izraza a "++ iza" POSLE *CELOG* izraza (što meni tad nije bilo logično).
znači da se prvo izvrši *c = *c (što nema smisla), a zatim se izvrši ++.
e, sad, šta je operand to je drugo pitanje. kako ++ ima viši prioritet
od * sledi da će se uvećati c (pointer) (pretpostavljam da je ranije
definisan), a zatim će se 'podići' vrednost na koju pokazuje c.
tako, pretpostavljam (nisam probao), da ono gore znači isto što i
*c++. koliki je smisao da to stoji samo u redu nije bitno.
može sve da se promeni zagradama, ovako: (*c)++.
cu, mjova.
cccc.319alexa,
> Tužna vest, ali naredba *c = *c++ ne radi ništa!
U stvari, nema garancije. Prosto, kompajleri koje si gledao
verovatno vole da prvo izračunaju levu stranu, pa posle desnu
kod infiksnih operatora (mislim na '=' u ovom slučaju).
cccc.320djelovic,
Ma, ja se slažem sa citiranima ZZ-om: -- se izvršava pre
celog izraza, a ++ posle celog izraza... Međutim, gde je tu onda
optimizacija?!? C je i pravljen po principu: "Što da opterećujemo
mašinu, ovi konji će to i onako sami uraditi... :)", međutim ovakav
redosled ubija optimizaciju za ++ i --. Ništa mi nije jasno! :(
cccc.321mjova,
> Ma, ja se slažem sa citiranima ZZ-om: -- se izvršava pre
> celog izraza, a ++ posle celog izraza... Međutim, gde je
nemoj pogrešno da me shvatiš, radi se o tome da položaj znaka ++ ili
-- određuje kad će se izvršiti. koji je znak u pitanju nema veze! ako
je znak (INC ili DEC) PRE operanda onda se prvo izvrši znak, ako je
operand IZA onda posle. kako su istog prioriteta ++ i -- pravilo važi
za oba operatora podjednako.
> Međutim, gde je tu onda optimizacija?!?
kao što vidiš, optimizacija je vrlo nezgodna :). optimizacija se
sastoji u tome da ne moraš da stavljaš red c += 1 (ili c -= 1) ispred
ili iza izraza. kako u C-u možeš u okviru jedne linije da napraviš
svašta, onda je ++ (ili --) dobra stvar i često se koristi.
mislim da si imao primer ispravnog programa koji ne radi tačno :)
cu, mjova.
cccc.322djelovic,
>nemoj pogrešno da me shvatiš, radi se o tome da položaj znaka ++
>ili
>-- određuje kad će se izvršiti. koji je znak u pitanju nema veze!
>ako je znak (INC ili DEC) PRE operanda onda se prvo izvrši znak,
>ako je operand IZA onda posle. kako su istog prioriteta ++ i --
>pravilo važi za oba operatora podjednako.
ISUSE! Izgleda da je došlo do kratkog spoja između mog mozga i
mojih ruku. Of course you are right, to sam sve vreme i mislio kada
sam pričao ove gluposti. Kamen mi u usta. Međutim, moja misao oko
optimizacije još uvek stoji: ++ i -- nemaju svrhe po pitanju
optimizacije. Naime, to o čemu ti pričaš je jednostavna kratkoća
pisanja koja doprinosi da listing bude kraći (i teži za razumevanje
:)), a optimizacija bi se svela na to da se takva naredba izvrši brže
nego su prefiksni operatori izbačeni u red više a postfiksni u red
niže. Naravno, još uvek postoji optimizacija samog kompajlera, ali
zašto onda koristiti C? Paskal je lakši za razumeti :).
cccc.323bulaja,
Evo izvoda iz dokumentacije za cbase - database lib. Meni izgleda
Ok, dat je kompletan source, pa ce se verovatno naci danas-sutra u
\ibmpc\program direktorijumu (ARJovana je oko 250K pa ce biti
podeljena na dva dela).
Citadel 90/06/21
----------------------------------------------------------------------
| cbase - The C Database Library |
| Version 1.0 |
----------------------------------------------------------------------
cbase is a complete multiuser C database file management library,
providing indexed and sequential access on multiple keys. It features
a modular design, comprising four individual libraries:
cbase - C database library
lseq - doubly linked sequential file management library
btree - B+-tree file management library
blkio - block buffered input/output library
cbase internally uses lseq for record storage and btree for inverted
file index storage, which in turn use blkio for file access and
buffering; blkio is analagous to stdio but based on a file model more
appropriate for structured files such as used in database software.
...
cbase Features
--------------
Portable:
- Written in strict adherence to ANSI C standard.
- K&R C compatibility maintained.
- All operating system dependent code is isolated to a small portion
of the blkio library to make porting to new systems easy.
- UNIX and MS-DOS currently supported.*
Buffered:
- Both records and indexes are buffered using LRU (least recently
used) buffering.
Fast and efficient random access:
- B+-trees are used for inverted file key storage.
- Multiple keys are supported.
- Both unique and duplicate keys are supported.
Fast and efficient sequential access:
- B+-trees also allow keyed sequential access.
- Records are stored in doubly linked lists for non-keyed sequential
access.
- Both types of sequential access are bidirectional.
Multiuser:
- Read-only locking.
Other:
- Text file data import and export.
- Custom data types can be defined.
- Marker used to detect corrupt files when opened.
- Reference documentation is in standard UNIX manual entry format,
including errno values.
cccc.324prvul,
Povodom onoga teksta o UNIX-u i C-u (znate, onaj :)))))))):
ZZ reče da C neće da proguta ovo:
for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
Pošto mislim da bi to prošlo, jel' može da mi se objasni gde je greška?
M.
P.S. Pitao bih ja ovo ranije, ali sam bio zagubio tekst...
cccc.325djelovic,
samo R- i e- treba da se zamene sa R-- i e--, i to će ti progutati
svaki ANSI kompajler. Stariji kompajleri i bez toga...
cccc.326ppekovic,
>> ZZ reče da C neće da proguta ovo:
>> for(;P("Đn"),R-;P("đ"))for(e=C;e-;P("_"+(*u++/8)%2))P("đ "+(*u/4)%2);
>>
>> Pošto mislim da bi to prošlo, jel' može da mi se objasni gde je greška?
Mislim da je najjednostavnije probati da se ovaj red, naravno dopunjen
još nekim osnovnim stvarima, izkompajlira nekim od kompajlera.
Paya
cccc.327prvul,
>> samo R- i e- treba da se zamene sa R-- i e--, i to će ti progutati
>> svaki ANSI kompajler. Stariji kompajleri i bez toga...
Da, jedino to je i meni bilo sumnjivo, ali sam pretpostavio da će C
(onaj Ričijev) da e- shvati kao e-1 (tako bi bilo u skladu sa filozofijom
C-a)...
cccc.328alexa,
> for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("|
"+(*u/4)%2);
** **
Mislim da je ovo sve sto smeta; naravno, i kada se to promeni
(na primer, u --) potrebno je da simboli koji se koriste
budu prethodno definisani ili deklarisani na odgovarajuci nacin.
Tek ce u tom slucaju ovo 'proci' kompilaciju.
for (; P("\n"), R--; P("|"))
for (e = C; e--; P("_" + (*u++ / 8) % 2) )
P("| " + (*u/4) % 2);
Mozda ovako izgleda prihvatljivije? Istina, tesko da ima nekog
smisla (mada, ko zna? mozda bi se mogao napraviti primer).
cccc.329prvul,
>>Mislim da je ovo sve sto smeta; naravno, i kada se to promeni
>>(na primer, u --) potrebno je da simboli koji se koriste
>>budu prethodno definisani ili deklarisani na odgovarajuci nacin.
>>Tek ce u tom slucaju ovo 'proci' kompilaciju.
A da li bi možda ipak e- prošlo? Ja mislim da bi trebalo, kao
što rekoh, kao e-1...
M.
cccc.330alexa,
Ne bi prošlo. Za to služi '--'. Isto tako ne bi prošlo ni '+'
umesto '++'.
cccc.331prvul,
>>Ne bi prošlo. Za to služi '--'. Isto tako ne bi prošlo ni '+'
>>umesto '++'.
Naravno da 'R-' nije isto što i 'R--'. 'R--' uradi sledeće: 'R=R-1',
dok bi 'R-' trebalo da uradi 'R-1', npr. posle izvršenja:
int R,I;
R=5;
I=R-;
trebalo bi da bude R==5 i I==4...
Po ANSI-ju ne znam, ali po Ričiju, trebalo bi...
M.
cccc.332igor.mil,
> Radi se o naredbi (izrazu)
> * c = *c++
> > - inkrementira se sadrzaj lokacije na koju ukazuje c.
> E pa nece biti - ni na jednom C-u na koji sam naisao nije se
> inkrementirao sadrzaj lokacije, nego se inkrementirao c.
U pravu si. Ja sam imao pogresno ubedjenje da * ima visi prioritet
od ++. Medjutim to nije tacno. Nije tacno ni obrnuto. Imaju
ISTI prioritet, i oba su desno asocijativna. Znaci redosled
izvrsavanja zavisi od medjusobnog polozaja, to jest izvrsi ce se
prvo onaj na koji se naidje sa desne strane.
Kao ilustracija, evo prevoda nekoliko C naredbi:
=== 1 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
mov ax,word ptr [si] ; *c = *c++;
mov word ptr [si],ax
inc si
inc si
=== 2 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
inc si ; *c = *++c;
inc si
mov ax,word ptr [si]
mov word ptr [si],ax
=== 3 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
inc word ptr [si] ; *c = ++*c;
mov ax,word ptr [si]
mov word ptr [si],ax
====================================================================
U prvom primeru, o kome je i bila rec, operator ++ se izvrsava prvi,
medjutim, posto je u pitanju postfix, njegovo izvrsavanje je
implicitno, efekat u vidu inkrementiranja pointera 'c' se javlja tek
na kraju izracunavanja izraza.
pozdrav, Igor
cccc.333alexa,
> Naravno da 'R-' nije isto što i 'R--'. 'R--' uradi sledeće:
'R=R-1',
> dok bi 'R-' trebalo da uradi 'R-1', npr. posle izvršenja:
>
> int R,I;
> R=5;
> I=R-;
>
> trebalo bi da bude R==5 i I==4...
> Po ANSI-ju ne znam, ali po Ričiju, trebalo bi...
Ovo si negde, valjda, sanjao. Prvo pročitaj tog Ričija.
cccc.334prvul,
>>Ovo si negde, valjda, sanjao. Prvo pročitaj tog Ričija.
Pa da sam siguran, ne bih ni pitao (ima 5 godina od kada sam
učio C (uzgred, iz Ritchie&Kernihan ;), a nisam ga mnogo koristio).
M.
P.S. Ipak ću morati da probam.
cccc.335mirkot,
Evo nesto na temu zvezdice i plusici:
The unary operators associate from right to left, so
*ptr++
applies first the ++ and then the * which increments the pointer.
This only determines that the ++ applies to ptr, rather than to
*ptr. For the ++ and -- operators, position also must be used.
Since ++ follows ptr, it is applied to ptr after the pointer is
used in the expression.
Mirko
cccc.336dnikolic,
Zna li ko nacin za koriscenje svih 640K memorije iz TC-a?
Objasnjenje: treba mi recimo 300K memorije, izvrsim dinamicku alokaciju
i dobijem pokazivac na prvi bajt tog prostora. Pokusao sam sa kombinacija
ma tipa farcoreleft, farmalloc itd. ali ne radi..
dnikolic
cccc.337djelovic,
>Zna li ko nacin za koriscenje svih 640K memorije iz TC-a?
>Objasnjenje: treba mi recimo 300K memorije, izvrsim dinamicku
alokaciju
Čuj, farmalloc bi trebao da završi stvar. E, sad: Možda na sistemu
nemaš upošte tih 300Kb! Probaj da program startuješ van Integrisane
okoline TC-a, a ako ni to ne radi, moraš da koristiš Overlay-r (TC)
ili VROOM (TC++). Ako ti kojim slučajm farmalloc iz biblioteke ne
radi, mislim da možeš da se snađeš sa par uzastopnih malloc-a, mada
to ne mogu da ti garantujem, to je radilo na TP-u, a na TC-u smo
dobili farmalloc. Probaj.
P.S. Ovo je kucano iz glave i on-line. Ako problem leži negde drugde,
a ja samo pisao gluposti, reci, pa ću ja opet pisati nove gluposti
on-line :).
cccc.338djelovic,
Moze li neko ko ima TC++ da mi napise kako izgleda polje
Command line dijaloga New/Modify_transfer koji se dobija iz
options/transfer menija za Turbo debugger i Turbo assembler. Naime,
ja sam pravio neke akrobacije sa translator programima itd., pa sam
ova sva programa obrisao iz transfera, a sada mi je komfornije da
radim s njima iz TC++a, nego da svaki put izlazim u shell, pa...
cccc.339ppekovic,
Dežurni bugolovac opet jaše ;)
Petljam se ja tako sa PGCHART LIB-om iz MSC-a 6.00. Za neupućene, to je
biblioteka za izuzetno lako kreiranje raznoraznih dijagrama, pitica, itd. itd.
I tako, napišem ja jedan jednostavan programčić koji za zadate podatke i
tip dijagrama iscrtava dijagram. Ali vraga, prolikom linkovanja prijavljuje
mali mion nedefinisanih simbola. I tu ja čeprkam, zavirujem itd. itd. i
slučajno provalim da chart funkcije neće da rade sa llibca.lib već jedino sa
llibce.lib. Ok. kažem ja i ulinkujem sve ponovo sa llibce. Sve prođe bez
problema. Sav veseo startujem program, ...vraga, neće. Zablokirao mi se
računar.
Tu ja isprobam sve i svašta, rezidentni programi, virusi, greške u mom
programu, 386MAX, etc. etc. ma kakvi.
Ajde reko da vidim dal će primer iz help-a da radi. Probam prvo da ga
ulinkujem sa llibca, reko čisto da vidim dal radi, ..jok. Znači, sa llibca 100%
neće da radi. Ok. nastavim dalje, ulinkujem sa llibce i sve prođe bez grešaka
warninga i sličnih zezalica. Startujem program, oooooops, block, klik, klik,
klik.
E tu ti ja pošandrcam i odem u Programers Work Bench (uh kako ga mrzim), i
dam mu da iskompjalira, linkuje itd. etc. program. Startujem ga, kad on
radi???!!! E tu ti ja tek poludim. Reko verovatno sam pogrešio parametre.
I sad da vas ne gnjavim baš previše probo ja parametre iste kao u pwb i na
kraju dođem do jedne jedine stvari koja se razlikovala kod command line
compajliranja i pwb c. a to je memory model. Naime, ja sam radio u large modelu
(trebalo mi), a u pwb-u u small modelu.
Probam ja iz komandne linije da sve sredim u small modelu. Proradi bez
greške.
Probam u large. Neće. Probam compact. Radi, ali ne zadugo, posle par
secundi zablokira se računar. Probam u Medium. Radi, ooops block. ;((((
Dakle, može chartovi, al samo u small modelu i samo slibce.
Paya
cccc.340maleksic,
>> i slucajno provalim da chart funkcije nece da rade sa llibca.lib
>> vec jedino sa
...
>> Probam u large. Nece. Probam compact. Radi, ali ne zadugo, posle par
>> secundi zablokira se racunar. Probam u Medium. Radi, ooops block. ;((((
>> Dakle, moze chartovi, al samo u small modelu i samo slibce.
??
Pa kako ti izgleda komandna linija kojom linkujes program?
A jesi li probao druge memorijske modele iz PWB-a?
cccc.341ppekovic,
>>Pa kako ti izgleda komandna linija kojom linkujes program?
>>A jesi li probao druge memorijske modele iz PWB-a?
Probao sam sve moguće switch-eve. Isključio sam optimizacije itd. itd. ali
ništa. Probao sam i iz PWB-a sve modele ali program korektno radi samo u small
modelu.
Da ponovim još jednom, program je primer za chartove iz help-a msc-a 6.0.
I tako krenuh ja malopre da čeprkam po programu uz pomoć CV-a i korak po
korak, imam šta da vidim: illegal instruction. Opaaaaaaa. A najveći je fazon
što greška nije ni u jednoj od funkcija za rad sa chartovima već u strcpy
funkciji ?????!!!!! Rešim ja taj problem definisanjem stringa u koji se kopira
neki tekst (naslov chart-a) kao _far (manite logiku). Međutim, opet novi
problem: illegal instruction (opet!!) ali sad na funkciji getch(). E tu sam već
digao ruke. Ispade da sve chart funkcije korektno rade, ali sve ostale kada
rade uz njih u large modelu ne rade kako treba. Zanimljivo, vrlo zanimljivo.
Paya
cccc.342alexa,
> Ispade da sve chart funkcije korektno rade, ali sve ostale kada
> rade uz njih u large modelu ne rade kako treba.
Jeste, rade kako treba, samo što imaju i neke uzgredne efekte,
tj. brljaju negde po memoriji (a na neke od brljotina si naleteo
u kodu).
Pretpostavljam da je u pitanju loše pisan kod, koji ne uzima u
obzir da ne mora biti sizeof(char *) == sizeof(int), niti da
(char *)0L == (char *)0. Ova dva primera sam dao kao najčešće
probleme na koje sam nailazio kad sam prebacivao razne UNIX
programe na XENIX 286. I onda je small model radio dobro (kad je
sve moglo da se 'ugura' u small model :)
Šta misliš o ovakvoj interpretaciji?
cccc.343ppekovic,
>>Ispade da sve chart funkcije korektno rade, ali sve ostale
>>kada rade uz njih u large modelu ne rade kako treba. Zanimljivo,
>>vrlo zanimljivo.
Uradio sam jedan XRD MSC-a i ponovo ga instalirao i sad cela stvar savršeno
radi. Nemam pojma u čemu je bio problem, al da me je namučio to jeste i posebno
zbunio. Tja, idemo dalje ...
Paya