PCSOFT

09 Nov 1989 - 22 Sep 1991

Topics

  1. bios (50)
  2. ms.dos (492)
  3. unix (322)
  4. os.2 (5)
  5. jezici (125)
  6. cccc (343)
  7. clipper (273)
  8. turbo.pascal (247)
  9. tools (219)
  10. grafika (189)
  11. programiranje (156)
  12. tekst.procesori (164)
  13. word.perfect (222)
  14. ventura (216)
  15. windows (270)
  16. spec.softver (212)
  17. virusi (255)
  18. zastita (44)
  19. knjige (61)
  20. razno (668)
  21. mreze (75)
  22. ms.word (42)
  23. nabavka (153)
  24. baze.podataka (60)
  25. radne.tabele (2)
  26. van.teme (17)
  27. 4dos (25)

Messages - cccc

cccc.1 dejanr,
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.2 lgavrilovic,
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.3 zzivotic,
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.4 ilja,
7 zvezdica????? Nemoguce! Pa zasta bi tako nesto bilo potrebno?
cccc.5 vkostic,
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.6 lgavrilovic,
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.7 vkostic,
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.8 zzivotic,
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.9 bjankovic,
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.10 vkostic,
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(&regs,&regs); Medjutim, to je Microsoft-u smetalo zato sto funkcija DOS-a 2F zabrlja DS registar. Kada sam napisao: regs.h.ah=0x2F; intdosx(&regs,&regs,&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.11 dbulat,
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.12 vkostic,
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.13 bojanp,
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.14 vkostic,
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.15 dejanr,
>> 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.16 vkostic,
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.17 vkostic,
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.18 vkostic,
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.19 lgavrilovic,
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.20 vkostic,
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.21 vkostic,
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.22 vkostic,
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.23 vkrstonosic,
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.24 godza,
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.25 cuba,
YACC, LEX UNIX utility Kome treba dokumentacija, mogu je iskopirati iz prirucnika za HP UNIX, vazi i za RATFOR, LINT, itd Cuba
cccc.26 amiler,
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.27 bojanp,
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.28 vkostic,
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.29 majkl,
>> 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.30 majkl,
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.zip
cccc.31 amiler,
>> - 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.32 majkl,
>> 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.33 dejanr,
Izašao je Microsoft C 6.0. Pogledajte FORUM/MICROB poruka 25.70. Dejan
cccc.34 dgergelj,
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.35 dkovac,
 ű 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.36 pbeciric,
TURBO C 2.0 HELP!!! Kako da linkujem program pisan u Turbo C-u sa BGI-om? Pozdrav, Predrag Beciric
cccc.37 caka,
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.38 braca,
Evo ti traženi fajlovi tc.zip
cccc.39 caka,
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.40 dbasaric,
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.41 vkostic,
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.42 dbasaric,
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.43 vkostic,
>> +---------------------------------------+ >> đ 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.asm
cccc.44 dbasaric,
Da li bi neko mogao da mi zipuje TLINK ( samo da nije verzija 2.0 ). Denis
cccc.45 vkostic,
>> Da li neko moze da mi zip-uje TLINK? Moze, javi se na 011 426-569.
cccc.46 bjankovic,
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.47 senadm,
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.48 vkostic,
>> 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.49 vkostic,
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.50 dejanr,
>> - 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.51 kanda,
>> 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.52 zzivotic,
Š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.53 dejanr,
>> 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.54 dejanr,
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.55 dejanr,
========================== 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.56 mdasic,
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.57 zzivotic,
>> 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.58 bojt,
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.59 aleks,
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.60 ppekovic,
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.61 zzivotic,
>> 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.62 aleksa,
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.63 zzivotic,
>> 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.64 vkostic,
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.65 aleksa,
> - 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.66 ppekovic,
> > - 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.67 vkostic,
>> 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.68 mknezic,
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.69 alazic,
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.70 sgoran,
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.71 milan,
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.72 alazic,
>>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.73 sgoran,
Izvinjenje za kasnjenje, nisam bio u BGD-u. Ali bolje ikad nego nikad. Pozdrav ( prespori) SGoran. qc.ini
cccc.75 alexa,
>> 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.76 dejanr,
>> > 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.77 alexa,
>> 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.78 dejanr,
Sorry, nisam video da je računar AT. Pozdrav, Dejan
cccc.79 maleksic,
>> 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.80 dejanr,
========== 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.81 vkostic,
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.82 alexa,
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.83 vkrstonosic,
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.84 vkostic,
>> 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.85 vkostic,
>> 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.86 cuba,
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.87 vkostic,
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.88 ljupco,
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.89 gww.,
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.90 ivujanic,
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.91 zzivotic,
>> 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.92 ivujanic,
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.93 zzivotic,
>> 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.94 dsavic,
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.95 ivujanic,
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.96 ljupco,
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.97 gww.,
" - 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.98 alexa,
Ipak je važniji razlog taj što se može raditi sa promenljivim brojem parametara (kao što reče zz).
cccc.99 rlazic,
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.101 alexa,
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.102 gww.,
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.103 mtadic,
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.104 ppekovic,
>>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.105 rlazic,
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.106 rlazic,
Š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.107 rlazic,
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.108 rlazic,
>> 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.109 kale,
>> 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.110 ppekovic,
>> 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.111 rlazic,
>> 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.112 ppekovic,
>>Š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.113 gww.,
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.114 gww.,
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.115 gww.,
ppekovic i rlazic, molim vas kao i sve ostale da unesete malo kolegijalnog ponašanja u diskusije. Ocenjivanje tudjeg kvaliteta nikad nije zahvalna rabota. Ispravljanje zabluda jeste korisno, ali uvek se može staloženo i argumentovano odbraniti svoj stav, ali i prihvatiti tudje mišljenje ako se čovek nadje u zabludi. 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.116 alexa,
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.117 alexa,
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.118 mtadic,
>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.119 gww.,
"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.120 gww.,
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.123 alexa,
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.124 alexa,
> 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.125 kanda,
>>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.126 gww.,
Aha, pa su parametri "ispod" BP a auto varibaile "iznad" ako sam dobro shvatio. Lepo i jednostavno.
cccc.127 gww.,
O.K. treba da se zna!
cccc.128 rlazic,
>> 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.129 rlazic,
>> Kod separatnog kompajliranja i linkovanja sa debug informacijama >> TLINK 3.0 se nepovratno zakuca (to bih voleo da neko vidi šta je sa >> tim). 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.130 rlazic,
>> 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.131 rlazic,
>> 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.132 ppekovic,
>>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.133 gww.,
>> Kod separatnog kompajliranja i linkovanja sa debug informacijama >> TLINK 3.0 se nepovratno zakuca (to bih voleo da neko vidi šta je sa >> tim). 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.134 gww.,
& 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.135 rlazic,
>> Č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.136 rlazic,
>> " 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.137 ppekovic,
>>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.zip
cccc.138 bojt,
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.139 ppekovic,
>>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.140 dejanr,
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.141 gww.,
Šta zapravo TC++ odsvapuje u EMS? Vrlo čudno je za DOS program da ima 800K. Kako se zapravo nalouduje takav program, jedini moj logičan zagljučak da negde ima zapisano koliki zapravo kod treba da se nalouduje a ostalo je neka vrsta overlaya. 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.142 rlazic,
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.143 rlazic,
>> Šta zapravo TC++ odsvapuje u EMS? Vrlo čudno je za DOS program da >> ima 800K. Kako se zapravo nalouduje takav program, jedini moj >> logičan zagljučak da negde ima zapisano koliki zapravo kod treba >> da se nalouduje a ostalo je neka vrsta overlaya. 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.146 bjirecek,
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.147 mperovic,
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.148 dtadic,
Ta adresa se vec vise puta pojavljivala na Sezamu. Evo je opet: TKP "Sahinpasic" Livanjska 74 Sarajevo tel. 071/212-333, 275-574 ┼
cccc.149 miki,
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.150 dgrbic,
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.151 dgrbic,
Ima li neko neka iskustva sa Power C kompajlerom (od MIX Software)? Grba.
cccc.152 pjero,
Poruka je u datoteci handle.sez hendle.sez
cccc.153 dgrbic,
Ima li neko source nekog C ili Pascal kompajlera? (Small C ili slicno) Grba
cccc.154 vkostic,
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.155 zzivotic,
>> 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.156 kaza,
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.157 vkostic,
>> 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.158 vkostic,
>> 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.159 vkostic,
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.161 bojt,
>> 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.162 gww.,
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.164 alexa,
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.165 gww.,
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.166 alexa,
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.167 gww.,
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.168 alexa,
> 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.169 zonjic,
Postavio sam pitanje na temi TP o programu za ulepsavanje source-a u pascalu, ovde ostavljam to isto, samo za C. Rade cb.zip
cccc.170 djelovic,
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.171 braca,
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.172 djelovic,
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.173 sstakic,
Da li si probao da zoves nekada na 1-800-... ? ;>>>
cccc.174 nkbog,
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.zip
cccc.175 braca,
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.177 djelovic,
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.178 sstakic,
Tako vec moze! Pozdrav Srdjan
cccc.179 ppekovic,
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.180 djelovic,
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.181 djelovic,
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.182 alexa,
> 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.183 alexa,
> 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.184 djelovic,
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.185 alexa,
> 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.186 djelovic,
I ja isto mislim da su Borlandovci sami odlučivali. Hvala u svakom slučaju.
cccc.187 ljupco,
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.188 ljupco,
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.189 ljupco,
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.190 ljupco,
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.191 djelovic,
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.192 alexa,
> 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.193 ljupco,
> 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.194 ljupco,
> 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.195 djelovic,
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.196 djelovic,
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.197 sradman,
Molim nekog da mi prenese iskustva sa BORLAND C++ 2.0,posto namjeravam da ga nabavim.
cccc.198 nkbog,
> 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.199 kaza,
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.200 ljupco,
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.201 djelovic,
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.202 ivujanic,
>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.203 ljupco,
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.204 ivujanic,
Što više proučavam Borland C++ to me više prijatno iznenađuje. Mislili su na sve žive konfiguracije računara, na sve žive probleme na koje možete naići... Čak i linker i asembler postoje u verziji za protected mode! Normalno i profiler, a debugger može da radi standardno, u 286 modu (digne se u hi-RAM) ili da pređe u 386 mode i za vašu aplikaciju napravi pravu malu 8086 virtuelnu mašinu (na žalost tada neće ići software tipa QEMM ili 386ČMAX, jer je tada mašina već u virtuelnom modu). Stvarno je potrebno iščitati kompletna uputstva, jer je šteta da vam rešenje problema leži pod nogama a da niste ni znali. A sada ono što je vrlo bitno: brzina i veličina koda. Što se brzine tiče, nisam imao na raspolaganju ništa što bi mi sigurno pokazalo brzinu koda, pa je dobrodošao neko ko ima neki program koji je već koristio da bi poredio dosadašnje kompajlere da isti zakači na mail pa ćemo videti. A što se koda tiče, manji je za oko 8% od Turbo C-a. Mrzi me da instaliram Turbo C++. Dakle oni koji su već poredili dosadašnje kompajlere i sačuvali su rezultate dobro su došli da vidimo koliko je dobro ovo novo čedo. Ivica
cccc.205 kaza,
(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.206 djelovic,
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.207 nkbog,
>> #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.208 djelovic,
Mali lapsus: trebalo je call far ptr dummy, i sve je OK. Compiler proizvodi .ASM fajl koji dalje mora da se prevede ručno, jer izgleda TASM 1.0 koji je ugrađen u TC++ ne može da se snađe sa forward referencama.
cccc.209 nkbog,
>> _asm retf Umesto _asm za TC treba asm. Ovo bi trebao da prevede i TC sam. NB.
cccc.210 ljupco,
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.211 djelovic,
One iz komandne linije.
cccc.212 djelovic,
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.213 igor.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.214 braca,
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.215 ljupco,
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.216 djelovic,
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.zip
cccc.217 igor.mil,
> skoro na svim BBS-ovima ima > patch koji sreduje bugove Gde da ga nadjem? Pozdrav ---Igor
cccc.218 drakce,
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.zip
cccc.219 beast,
Dali Turbo c++ ima svoj editor?Ja nikako da ga nadjem :)
cccc.220 nkbog,
> 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.221 ljupco,
fout=stdout
cccc.222 nesavic,
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.223 djelovic,
>> 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.225 djelovic,
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.226 ljupco,
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.227 ivujanic,
> 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.228 ppekovic,
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.229 ljupco,
Hvala ti!
cccc.230 nesavic,
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.231 igor.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.232 jtitov,
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.c
cccc.233 igor.mil,
═> Ako bi neko bio ljubazan da ovaj program iz Rxx prevede i vrati ga u exe (com) > obliku. Izvoli pozdrav ---igor cal_exe.zip
cccc.234 alexa,
> 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.235 jtitov,
> 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.236 nesavic,
Ma valja sve,rekao sam Invalid OBJ record... I to kaze i kod najjednostavnijeg programa... NeSa!
cccc.237 igor.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.obj
cccc.238 alexa,
> 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.239 nesavic,
Hvala,probacu sada!
cccc.240 nesavic,
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.241 ljupco,
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.242 djelovic,
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.243 ljupco,
> 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.244 zzivotic,
>> 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.245 djelovic,
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.246 ljupco,
> 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.247 djelovic,
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.248 djelovic,
u prethodnoj poruci treba da stoji mygetc (FILE *fi);. on-line :(
cccc.249 zonjic,
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.250 igor.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.251 mmihajlovic,
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > 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.252 docke,
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.253 djelovic,
Imam AWK 3.00. Da li to nekoga zanima, jer ne bi da ga šaljem bez veze. Inače, stvar je strašna!
cccc.254 igor.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.255 djelovic,
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.zip
cccc.256 maleksic,
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.257 djelovic,
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.258 mmihajlovic,
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > 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.259 maleksic,
>> ...ali znam da ima za basic .. Na zalost, treba mi bas za FORTRAN
cccc.260 maleksic,
>> > 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.261 mmihajlovic,
> 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.262 mmihajlovic,
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.263 sgopcevic,
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.264 alexa,
> 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.266 zonjic,
A da nije to SW za MSC a ti pokusao da compilujes TC-om ili obratno?
cccc.267 zonjic,
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.268 zonjic,
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.269 sgopcevic,
>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.270 sgoran,
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.271 mmilosevic,
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.272 mmihajlovic,
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.zip
cccc.273 mmilosevic,
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.274 djelovic,
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.275 mmihajlovic,
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.276 mmilosevic,
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.277 mjova,
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.278 djelovic,
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.279 zzivotic,
>> 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.280 bojt,
>> 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.281 mjova,
>> 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.283 zzivotic,
>> 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.284 mjova,
>> 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.285 zzivotic,
>> 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.286 mmihajlovic,
> 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.287 sgopcevic,
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.289 djelovic,
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.290 igor.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.291 igor.mil,
Pitanje za poznavaoce TC-a: "Cemu sluzi opcija /E - create extended dictionary programa TLIB?" Pozdrav od Igora
cccc.292 sgopcevic,
Igore hvala. Uspeo sam da formiram exe fajl na osnovu tvoga uputstva pozdrav od spira
cccc.293 nesic,
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.294 iri.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.295 braca,
Eve ga DFLAT3. Stvarno izgleda majstorski!
cccc.296 bulaja,
DFLAT3 je prebacen u \ibmpc\misc direktorijum. Hvala na prilogu.
cccc.297 iri.ic,
Hvala Bulaji i Braci na pomoci ! Kada dobijem i uputstva za DFLAT3, ostaviti cu ih na SEZAMU.
cccc.298 braca,
Uputstva su nekoliko poslednjih (i budućih) članaka Ala Stivensa u DDJ!
cccc.299 rakim,
Kako ugasiti cursor na terminalu (terminfo - unix C)? rakim
cccc.300 zkehler,
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.303 djelovic,
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.304 ppekovic,
Evo liste i opisa bug-ova MSC-a 6!!! Paya c60probs.zip
cccc.305 djelovic,
Kako se interpretiraju naredbe tipa *c = *c++? (tj. kojim redosledom?). Da li je ovo definisano standardom ili zavisi od kompajlera?
cccc.306 georgd,
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.307 igor.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.308 ivujanic,
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.309 ppekovic,
>> 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.310 bulaja,
│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.311 todorp,
Hi! Da li neko zna kako se poziva interrupt iz C-a (turbo C-a)? Pozdrav od Todora.
cccc.312 djelovic,
Imaš više f-ja za pozivanje interrupta, sve počinju sa int, pa potraži u helpu TC-a. Npr int86x...
cccc.313 vasiljevic,
Zna li neko neki dobar nacin za pribavljanje neke literature ili bilo cega u vezi sa grafikom u C-u> Marko (the asker)
cccc.314 alexa,
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.315 djelovic,
> 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.317 zormi,
* 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.318 mjova,
> *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.319 alexa,
> 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.320 djelovic,
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.321 mjova,
> 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.322 djelovic,
>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.323 bulaja,
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.324 prvul,
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.325 djelovic,
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.326 ppekovic,
>> 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.327 prvul,
>> 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.328 alexa,
> 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.329 prvul,
>>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.330 alexa,
Ne bi prošlo. Za to služi '--'. Isto tako ne bi prošlo ni '+' umesto '++'.
cccc.331 prvul,
>>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.332 igor.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.333 alexa,
> 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.334 prvul,
>>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.335 mirkot,
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.336 dnikolic,
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.337 djelovic,
>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.338 djelovic,
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.339 ppekovic,
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.340 maleksic,
>> 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.341 ppekovic,
>>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.342 alexa,
> 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.343 ppekovic,
>>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