cccc.315djelovic,
-> #314, alexa> Tužna vest, ali naredba *c = *c++ ne radi ništa! Što se
> tiče redosleda za * i ++, nema priče - prvo ide ++. Ono što je
>mene zanimalo je da li će neki kompajler prevesti ovo kao:
> 1. Uzmi *c
> 2. Povećaj c
> 3. Stavi uzeti sadržaj na c
> Međutim, izgleda da se ++ izvršava tak kada se izvrši ceo
>izraz. Ovo nije slučaj sa pozivanjem f-ja (za razliku od makroa):
> Kako rezultat nekog izraza biva stavljen na stek (s desna na levo),
> tako se izvršavaju ++ i --. Probajte recimo:
> a = 5;
> printf ("%d %d", a, a++);
>
> *** Extreme caution! *** Ovakva igrica ne radi sa makroima,
> so kids, don't do this at home! Handle with care! ...
cccc.317zormi,
-> #313, vasiljevic* Zna li neko neki dobar nacin za pribavljanje neke
* literature ili bilo cega u vezi sa grafikom u C-u>
Ima na BBS-ovima dosta biblioteka funkcija u C-u.
Baš sam juče video na EXEC-u nešto za rad sa PCX
i VGA... Videću šta mogu da učinim.
cccc.318mjova,
-> #314, alexa> *c = *c++
slabo snam C ali jednom prilikom imao sam sličan problem. naravno da
sam pitao ZZ-a i on mi reče da se "++ ispred" izvršava PRE *CELOG*
izraza a "++ iza" POSLE *CELOG* izraza (što meni tad nije bilo logično).
znači da se prvo izvrši *c = *c (što nema smisla), a zatim se izvrši ++.
e, sad, šta je operand to je drugo pitanje. kako ++ ima viši prioritet
od * sledi da će se uvećati c (pointer) (pretpostavljam da je ranije
definisan), a zatim će se 'podići' vrednost na koju pokazuje c.
tako, pretpostavljam (nisam probao), da ono gore znači isto što i
*c++. koliki je smisao da to stoji samo u redu nije bitno.
može sve da se promeni zagradama, ovako: (*c)++.
cu, mjova.
cccc.319alexa,
-> #315, djelovic> Tužna vest, ali naredba *c = *c++ ne radi ništa!
U stvari, nema garancije. Prosto, kompajleri koje si gledao
verovatno vole da prvo izračunaju levu stranu, pa posle desnu
kod infiksnih operatora (mislim na '=' u ovom slučaju).
cccc.320djelovic,
-> #319, alexa Ma, ja se slažem sa citiranima ZZ-om: -- se izvršava pre
celog izraza, a ++ posle celog izraza... Međutim, gde je tu onda
optimizacija?!? C je i pravljen po principu: "Što da opterećujemo
mašinu, ovi konji će to i onako sami uraditi... :)", međutim ovakav
redosled ubija optimizaciju za ++ i --. Ništa mi nije jasno! :(
cccc.321mjova,
-> #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
nemoj pogrešno da me shvatiš, radi se o tome da položaj znaka ++ ili
-- određuje kad će se izvršiti. koji je znak u pitanju nema veze! ako
je znak (INC ili DEC) PRE operanda onda se prvo izvrši znak, ako je
operand IZA onda posle. kako su istog prioriteta ++ i -- pravilo važi
za oba operatora podjednako.
> Međutim, gde je tu onda optimizacija?!?
kao što vidiš, optimizacija je vrlo nezgodna :). optimizacija se
sastoji u tome da ne moraš da stavljaš red c += 1 (ili c -= 1) ispred
ili iza izraza. kako u C-u možeš u okviru jedne linije da napraviš
svašta, onda je ++ (ili --) dobra stvar i često se koristi.
mislim da si imao primer ispravnog programa koji ne radi tačno :)
cu, mjova.
cccc.322djelovic,
-> #321, mjova>nemoj pogrešno da me shvatiš, radi se o tome da položaj znaka ++
>ili
>-- određuje kad će se izvršiti. koji je znak u pitanju nema veze!
>ako je znak (INC ili DEC) PRE operanda onda se prvo izvrši znak,
>ako je operand IZA onda posle. kako su istog prioriteta ++ i --
>pravilo važi za oba operatora podjednako.
ISUSE! Izgleda da je došlo do kratkog spoja između mog mozga i
mojih ruku. Of course you are right, to sam sve vreme i mislio kada
sam pričao ove gluposti. Kamen mi u usta. Međutim, moja misao oko
optimizacije još uvek stoji: ++ i -- nemaju svrhe po pitanju
optimizacije. Naime, to o čemu ti pričaš je jednostavna kratkoća
pisanja koja doprinosi da listing bude kraći (i teži za razumevanje
:)), a optimizacija bi se svela na to da se takva naredba izvrši brže
nego su prefiksni operatori izbačeni u red više a postfiksni u red
niže. Naravno, još uvek postoji optimizacija samog kompajlera, ali
zašto onda koristiti C? Paskal je lakši za razumeti :).
cccc.323bulaja,
Evo izvoda iz dokumentacije za cbase - database lib. Meni izgleda
Ok, dat je kompletan source, pa ce se verovatno naci danas-sutra u
\ibmpc\program direktorijumu (ARJovana je oko 250K pa ce biti
podeljena na dva dela).
Citadel 90/06/21
----------------------------------------------------------------------
| cbase - The C Database Library |
| Version 1.0 |
----------------------------------------------------------------------
cbase is a complete multiuser C database file management library,
providing indexed and sequential access on multiple keys. It features
a modular design, comprising four individual libraries:
cbase - C database library
lseq - doubly linked sequential file management library
btree - B+-tree file management library
blkio - block buffered input/output library
cbase internally uses lseq for record storage and btree for inverted
file index storage, which in turn use blkio for file access and
buffering; blkio is analagous to stdio but based on a file model more
appropriate for structured files such as used in database software.
...
cbase Features
--------------
Portable:
- Written in strict adherence to ANSI C standard.
- K&R C compatibility maintained.
- All operating system dependent code is isolated to a small portion
of the blkio library to make porting to new systems easy.
- UNIX and MS-DOS currently supported.*
Buffered:
- Both records and indexes are buffered using LRU (least recently
used) buffering.
Fast and efficient random access:
- B+-trees are used for inverted file key storage.
- Multiple keys are supported.
- Both unique and duplicate keys are supported.
Fast and efficient sequential access:
- B+-trees also allow keyed sequential access.
- Records are stored in doubly linked lists for non-keyed sequential
access.
- Both types of sequential access are bidirectional.
Multiuser:
- Read-only locking.
Other:
- Text file data import and export.
- Custom data types can be defined.
- Marker used to detect corrupt files when opened.
- Reference documentation is in standard UNIX manual entry format,
including errno values.
cccc.324prvul,
Povodom onoga teksta o UNIX-u i C-u (znate, onaj :)))))))):
ZZ reče da C neće da proguta ovo:
for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
Pošto mislim da bi to prošlo, jel' može da mi se objasni gde je greška?
M.
P.S. Pitao bih ja ovo ranije, ali sam bio zagubio tekst...
cccc.325djelovic,
samo R- i e- treba da se zamene sa R-- i e--, i to će ti progutati
svaki ANSI kompajler. Stariji kompajleri i bez toga...
cccc.326ppekovic,
-> #324, prvul>> ZZ reče da C neće da proguta ovo:
>> for(;P("Đn"),R-;P("đ"))for(e=C;e-;P("_"+(*u++/8)%2))P("đ "+(*u/4)%2);
>>
>> Pošto mislim da bi to prošlo, jel' može da mi se objasni gde je greška?
Mislim da je najjednostavnije probati da se ovaj red, naravno dopunjen
još nekim osnovnim stvarima, izkompajlira nekim od kompajlera.
Paya
cccc.327prvul,
-> #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...
Da, jedino to je i meni bilo sumnjivo, ali sam pretpostavio da će C
(onaj Ričijev) da e- shvati kao e-1 (tako bi bilo u skladu sa filozofijom
C-a)...
cccc.328alexa,
-> #324, prvul> for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("|
"+(*u/4)%2);
** **
Mislim da je ovo sve sto smeta; naravno, i kada se to promeni
(na primer, u --) potrebno je da simboli koji se koriste
budu prethodno definisani ili deklarisani na odgovarajuci nacin.
Tek ce u tom slucaju ovo 'proci' kompilaciju.
for (; P("\n"), R--; P("|"))
for (e = C; e--; P("_" + (*u++ / 8) % 2) )
P("| " + (*u/4) % 2);
Mozda ovako izgleda prihvatljivije? Istina, tesko da ima nekog
smisla (mada, ko zna? mozda bi se mogao napraviti primer).
cccc.329prvul,
-> #328, alexa>>Mislim da je ovo sve sto smeta; naravno, i kada se to promeni
>>(na primer, u --) potrebno je da simboli koji se koriste
>>budu prethodno definisani ili deklarisani na odgovarajuci nacin.
>>Tek ce u tom slucaju ovo 'proci' kompilaciju.
A da li bi možda ipak e- prošlo? Ja mislim da bi trebalo, kao
što rekoh, kao e-1...
M.
cccc.330alexa,
-> #329, prvulNe bi prošlo. Za to služi '--'. Isto tako ne bi prošlo ni '+'
umesto '++'.
cccc.331prvul,
-> #330, alexa>>Ne bi prošlo. Za to služi '--'. Isto tako ne bi prošlo ni '+'
>>umesto '++'.
Naravno da 'R-' nije isto što i 'R--'. 'R--' uradi sledeće: 'R=R-1',
dok bi 'R-' trebalo da uradi 'R-1', npr. posle izvršenja:
int R,I;
R=5;
I=R-;
trebalo bi da bude R==5 i I==4...
Po ANSI-ju ne znam, ali po Ričiju, trebalo bi...
M.
cccc.332igor.mil,
-> #314, alexa> Radi se o naredbi (izrazu)
> * c = *c++
> > - inkrementira se sadrzaj lokacije na koju ukazuje c.
> E pa nece biti - ni na jednom C-u na koji sam naisao nije se
> inkrementirao sadrzaj lokacije, nego se inkrementirao c.
U pravu si. Ja sam imao pogresno ubedjenje da * ima visi prioritet
od ++. Medjutim to nije tacno. Nije tacno ni obrnuto. Imaju
ISTI prioritet, i oba su desno asocijativna. Znaci redosled
izvrsavanja zavisi od medjusobnog polozaja, to jest izvrsi ce se
prvo onaj na koji se naidje sa desne strane.
Kao ilustracija, evo prevoda nekoliko C naredbi:
=== 1 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
mov ax,word ptr [si] ; *c = *c++;
mov word ptr [si],ax
inc si
inc si
=== 2 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
inc si ; *c = *++c;
inc si
mov ax,word ptr [si]
mov word ptr [si],ax
=== 3 ==============================================================
mov word ptr [bp-2],1 ; int x=1;
lea si,word ptr [bp-2] ; int *c = &x;
inc word ptr [si] ; *c = ++*c;
mov ax,word ptr [si]
mov word ptr [si],ax
====================================================================
U prvom primeru, o kome je i bila rec, operator ++ se izvrsava prvi,
medjutim, posto je u pitanju postfix, njegovo izvrsavanje je
implicitno, efekat u vidu inkrementiranja pointera 'c' se javlja tek
na kraju izracunavanja izraza.
pozdrav, Igor
cccc.333alexa,
-> #331, prvul> Naravno da 'R-' nije isto što i 'R--'. 'R--' uradi sledeće:
'R=R-1',
> dok bi 'R-' trebalo da uradi 'R-1', npr. posle izvršenja:
>
> int R,I;
> R=5;
> I=R-;
>
> trebalo bi da bude R==5 i I==4...
> Po ANSI-ju ne znam, ali po Ričiju, trebalo bi...
Ovo si negde, valjda, sanjao. Prvo pročitaj tog Ričija.
cccc.334prvul,
-> #333, alexa>>Ovo si negde, valjda, sanjao. Prvo pročitaj tog Ričija.
Pa da sam siguran, ne bih ni pitao (ima 5 godina od kada sam
učio C (uzgred, iz Ritchie&Kernihan ;), a nisam ga mnogo koristio).
M.
P.S. Ipak ću morati da probam.
cccc.335mirkot,
Evo nesto na temu zvezdice i plusici:
The unary operators associate from right to left, so
*ptr++
applies first the ++ and then the * which increments the pointer.
This only determines that the ++ applies to ptr, rather than to
*ptr. For the ++ and -- operators, position also must be used.
Since ++ follows ptr, it is applied to ptr after the pointer is
used in the expression.
Mirko
cccc.336dnikolic,
Zna li ko nacin za koriscenje svih 640K memorije iz TC-a?
Objasnjenje: treba mi recimo 300K memorije, izvrsim dinamicku alokaciju
i dobijem pokazivac na prvi bajt tog prostora. Pokusao sam sa kombinacija
ma tipa farcoreleft, farmalloc itd. ali ne radi..
dnikolic
cccc.337djelovic,
>Zna li ko nacin za koriscenje svih 640K memorije iz TC-a?
>Objasnjenje: treba mi recimo 300K memorije, izvrsim dinamicku
alokaciju
Čuj, farmalloc bi trebao da završi stvar. E, sad: Možda na sistemu
nemaš upošte tih 300Kb! Probaj da program startuješ van Integrisane
okoline TC-a, a ako ni to ne radi, moraš da koristiš Overlay-r (TC)
ili VROOM (TC++). Ako ti kojim slučajm farmalloc iz biblioteke ne
radi, mislim da možeš da se snađeš sa par uzastopnih malloc-a, mada
to ne mogu da ti garantujem, to je radilo na TP-u, a na TC-u smo
dobili farmalloc. Probaj.
P.S. Ovo je kucano iz glave i on-line. Ako problem leži negde drugde,
a ja samo pisao gluposti, reci, pa ću ja opet pisati nove gluposti
on-line :).
cccc.338djelovic,
Moze li neko ko ima TC++ da mi napise kako izgleda polje
Command line dijaloga New/Modify_transfer koji se dobija iz
options/transfer menija za Turbo debugger i Turbo assembler. Naime,
ja sam pravio neke akrobacije sa translator programima itd., pa sam
ova sva programa obrisao iz transfera, a sada mi je komfornije da
radim s njima iz TC++a, nego da svaki put izlazim u shell, pa...
cccc.339ppekovic,
Dežurni bugolovac opet jaše ;)
Petljam se ja tako sa PGCHART LIB-om iz MSC-a 6.00. Za neupućene, to je
biblioteka za izuzetno lako kreiranje raznoraznih dijagrama, pitica, itd. itd.
I tako, napišem ja jedan jednostavan programčić koji za zadate podatke i
tip dijagrama iscrtava dijagram. Ali vraga, prolikom linkovanja prijavljuje
mali mion nedefinisanih simbola. I tu ja čeprkam, zavirujem itd. itd. i
slučajno provalim da chart funkcije neće da rade sa llibca.lib već jedino sa
llibce.lib. Ok. kažem ja i ulinkujem sve ponovo sa llibce. Sve prođe bez
problema. Sav veseo startujem program, ...vraga, neće. Zablokirao mi se
računar.
Tu ja isprobam sve i svašta, rezidentni programi, virusi, greške u mom
programu, 386MAX, etc. etc. ma kakvi.
Ajde reko da vidim dal će primer iz help-a da radi. Probam prvo da ga
ulinkujem sa llibca, reko čisto da vidim dal radi, ..jok. Znači, sa llibca 100%
neće da radi. Ok. nastavim dalje, ulinkujem sa llibce i sve prođe bez grešaka
warninga i sličnih zezalica. Startujem program, oooooops, block, klik, klik,
klik.
E tu ti ja pošandrcam i odem u Programers Work Bench (uh kako ga mrzim), i
dam mu da iskompjalira, linkuje itd. etc. program. Startujem ga, kad on
radi???!!! E tu ti ja tek poludim. Reko verovatno sam pogrešio parametre.
I sad da vas ne gnjavim baš previše probo ja parametre iste kao u pwb i na
kraju dođem do jedne jedine stvari koja se razlikovala kod command line
compajliranja i pwb c. a to je memory model. Naime, ja sam radio u large modelu
(trebalo mi), a u pwb-u u small modelu.
Probam ja iz komandne linije da sve sredim u small modelu. Proradi bez
greške.
Probam u large. Neće. Probam compact. Radi, ali ne zadugo, posle par
secundi zablokira se računar. Probam u Medium. Radi, ooops block. ;((((
Dakle, može chartovi, al samo u small modelu i samo slibce.
Paya
cccc.340maleksic,
-> #339, ppekovic>> i slucajno provalim da chart funkcije nece da rade sa llibca.lib
>> vec jedino sa
...
>> Probam u large. Nece. Probam compact. Radi, ali ne zadugo, posle par
>> secundi zablokira se racunar. Probam u Medium. Radi, ooops block. ;((((
>> Dakle, moze chartovi, al samo u small modelu i samo slibce.
??
Pa kako ti izgleda komandna linija kojom linkujes program?
A jesi li probao druge memorijske modele iz PWB-a?
cccc.341ppekovic,
-> #340, maleksic>>Pa kako ti izgleda komandna linija kojom linkujes program?
>>A jesi li probao druge memorijske modele iz PWB-a?
Probao sam sve moguće switch-eve. Isključio sam optimizacije itd. itd. ali
ništa. Probao sam i iz PWB-a sve modele ali program korektno radi samo u small
modelu.
Da ponovim još jednom, program je primer za chartove iz help-a msc-a 6.0.
I tako krenuh ja malopre da čeprkam po programu uz pomoć CV-a i korak po
korak, imam šta da vidim: illegal instruction. Opaaaaaaa. A najveći je fazon
što greška nije ni u jednoj od funkcija za rad sa chartovima već u strcpy
funkciji ?????!!!!! Rešim ja taj problem definisanjem stringa u koji se kopira
neki tekst (naslov chart-a) kao _far (manite logiku). Međutim, opet novi
problem: illegal instruction (opet!!) ali sad na funkciji getch(). E tu sam već
digao ruke. Ispade da sve chart funkcije korektno rade, ali sve ostale kada
rade uz njih u large modelu ne rade kako treba. Zanimljivo, vrlo zanimljivo.
Paya
cccc.342alexa,
-> #341, ppekovic > Ispade da sve chart funkcije korektno rade, ali sve ostale kada
> rade uz njih u large modelu ne rade kako treba.
Jeste, rade kako treba, samo što imaju i neke uzgredne efekte,
tj. brljaju negde po memoriji (a na neke od brljotina si naleteo
u kodu).
Pretpostavljam da je u pitanju loše pisan kod, koji ne uzima u
obzir da ne mora biti sizeof(char *) == sizeof(int), niti da
(char *)0L == (char *)0. Ova dva primera sam dao kao najčešće
probleme na koje sam nailazio kad sam prebacivao razne UNIX
programe na XENIX 286. I onda je small model radio dobro (kad je
sve moglo da se 'ugura' u small model :)
Šta misliš o ovakvoj interpretaciji?
cccc.343ppekovic,
-> #341, 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