05.06.2013 Views

Programmare in C su Amiga (261 - digiTANTO.it

Programmare in C su Amiga (261 - digiTANTO.it

Programmare in C su Amiga (261 - digiTANTO.it

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

- coord<strong>in</strong>amento<br />

di Andrea de Prisco<br />

<strong>Programmare</strong> <strong>in</strong> C <strong>su</strong> <strong>Amiga</strong> (<strong>261</strong><br />

Cont<strong>in</strong>uiamo la nostra carrella fa Nella scorsa puntata avevamo proposto<br />

<strong>su</strong>lle strutture elementari utilizzate semplice esercizio ailo scopo di dida<br />

quadri e controlli. In questa mostrare come certi colori e modi grafipuntata<br />

parleremo di bordi.<br />

ci siano più adattati di altri qualora non<br />

si sappia con esattezza <strong>su</strong> che tipo di<br />

R<strong>it</strong>ornano <strong>in</strong>oltre la Scheda Tecnica<br />

fondo si stia opemndo, ,n pmtica si<br />

e la rubrica cr Casella Postaleii trattava di generare un fondo formato<br />

da rettangoli savrapposti di varie forme<br />

e colori, e qu<strong>in</strong>di di stampare <strong>su</strong> tale<br />

sfondo una frase qualunque utilizzando<br />

varie comb<strong>in</strong>azioni di colori e modi grafici.<br />

Owiamente questo esercizio serviva<br />

anche a farvi prendere confidenza con<br />

la struttura IntuiText presentata nella<br />

scorsa puntata.<br />

In figura 1 viene mostrato un possibi-<br />

le esempio della soluzione all'esercizio<br />

proposto. Naturalmente 1 1 vostro pro-<br />

gramma può essere molto differente da<br />

quello presentato. L'importante B che<br />

soddisfi i requis<strong>it</strong>i richiesti.<br />

La struttura del programma è molto<br />

semplice. Dopo te oramai classiche di-<br />

chiarative <strong>in</strong>iziali. il programma pr<strong>in</strong>cipa-<br />

le non fa altro che chiamare <strong>in</strong> sequen-<br />

za c<strong>in</strong>que sottoprogrammi. 11 primo e<br />

~ ~ . t . ~ m * ~ * ~ ~ a ~ s * * ~ ~ m * m * t ~ t l ~ ~ ~ a m a r n ~ * r n a ~ * x * t ~ h* . f ~ struct m * c . Iatuihssage ~ t ~ ~ l*S6;<br />

"* R.iylrariiare In C cm Aiiga (C) 1983 Oario & Judictbus - Rom (I) ** tydef rtruet IntufTmt ITm<br />

--_---.--_--_~--_----------------~------<br />

*a typdef rtruct TextAttr WA;<br />

'" Sehelstro dl m program df vl<strong>su</strong>allr~ziias dei testi «i<br />

ttL,:?l<br />

CI H l*<br />

*"**~~*m-*-tn*~*mtt~m***im*~mt******~~*n*"<br />

W hattwirtlche f<strong>in</strong>estna': df MI-, dl'&~ljllbk~~*,<br />

** di ~ ~ restaura airtiiatiw 0 4ntetlTrpt6, ,<br />

tipi a, attiva.<br />

%lnclda cexsdtypes.C<br />

~tuclds *i<strong>in</strong>u<strong>it</strong>lon/lntnlti~nba~~h7<br />

*I<br />

*fiw W WL W I I R I C L ~ E ~ U I ~ ~ ~ W I ~ ~ ~ G<br />

Wiiflda cgraphfcsIgfxhse.b<br />

Ili~clude dibrarlerIdos.b<br />

~etlne W ~ E C<br />

P<strong>in</strong>clilda +ots/all .h*<br />

atnclods -tdllb.b<br />

l<strong>in</strong>clrde


l il<br />

01 I* Efftttriam le chima di partm~a. '1<br />

DrawT<strong>it</strong>utf(); I* Ulssgrlaii m po' di miu *l<br />

Orawlcxti() ; p Scriviam un p' dl riba *I<br />

Let* 0: I* Va h-. E' tutto pronto. Mi4 'I<br />

ClasR11 01 P Flilto. Eliludlmn tutti. 'I<br />

1<br />

-"mt***t**ft+mft*.1Ht"*"f*mf"cm**rrcr~**m**t****.f***I**."**<br />

a*<br />

* Stmlli chlriate dl partenza<br />

*.l*m-tcl*cl-m*m-*-fHf~t.c.fI~cm~~t~m*~mam*CtI*Hf*/<br />

vnid StartRlI()<br />

long t:<br />

I ** Ilprs li libra-ie (Intu<strong>it</strong>lon & whlcs) i la f<strong>in</strong>ertra<br />

i; Intultlmhse I (stnict Ints<strong>it</strong><strong>in</strong>nBaPe *)Oprnllhy(1~IE,IUEY):<br />

if (1ntm<strong>it</strong>ioasasm - ILL) C1meR11~);<br />

resk I-WIYT:<br />

6fxhse = (Ztruct Gfxke +)(panlihrmy(GMME,6RCY);<br />

If (GlxBase - W) Clas~ll()i<br />

msk t* M-GFX:<br />

x - (struct iii- *)@mMndew(&mr):<br />

if (W - YULL) cl~llo:<br />

issk 1- HSK-MY:<br />

rp .<br />

UaaPOrfl I* wP.Tt pw la Qmtica *I<br />

up - ~Jererport; l* Porta utsnte per IOCR *f<br />

j**wa**tm*lr*m*ft**t**~rn**ffh**tft~~****tl*tmtffaw**~~~**~<br />

** W tuff: diselpii s casa<br />

fflH*ttC**e****HttH*HXtCCX*X~*H*~***1~~***ttCHHft~ttm*-*Cf<br />

votd DrarStuffO<br />

(<br />

1,Ji<br />

<strong>in</strong>t ~.ri.xM,Jll,~t,rt;<br />

SuthPsa(rp,rsnd()Kals);<br />

far (jdij4EPEaT; j++)<br />

I<br />

~****m**mmntm*>n4*ftt*t****-*ttt*+**<br />

*I<br />

** OMwTexti: test1 nbn a caso<br />

.I-*~ttf**~~*H*~*~**~a*-~f*tt*fftt*~*ff*~t*tt**~+mff<br />

vnld mT&s()<br />

I<br />

MCmicrocomputer n. 1 O - ottobre 1990<br />

W<br />

h.F~olrtmri = cm%;<br />

bnse.BafWeii -cali<br />

base.- - mi<br />

haaa.TopWga * UNE;<br />

he.IText - "COLO C W Yltim:<br />

Pri<strong>it</strong>TTs*t(rp,~se,B,O);<br />

haie.lkarilbda - JAltt:<br />

ba4a.TopEdge += LINE;<br />

Lwe.IText - .COLI Cm JAW;<br />

m<strong>it</strong>Ira*t(rp,ho,e);<br />

tiase.lkmhdo = COIIP-:<br />

hase.Top6dga t- LIRE;<br />

hse.ITe*t - .COL8 CNi UIWLE1BRH:<br />

Ri<strong>it</strong>ITsxt(rp,Wa.%,W):<br />

bnse.DmwWe = COIPLEEHTI IWFVID;<br />

basa.TipEdg~gs LIME;<br />

bare.lText - "WL0 COLI UIIIPL~MIIIIY~~~~D';<br />

PrfatlTtxt(rp,~se,B,B};<br />

base.Pr&m - J~M~~IIYL~~SYIDI<br />

base.Tapw +I LIME;<br />

bbss.ITaxt = "COW COLI JMI~IIIYEWID":<br />

PriatlTaxt(rp,Bbass,B.B):<br />

base.lffavllpde - JAlll;<br />

he.TapEdge n LXWEI<br />

hso.ITmxt = "rnU WL3 dRIIP;<br />

Prli<strong>it</strong>lText(rp,U~nse,S,B);<br />

- SAl(t:<br />

h . ~ s<br />

hTop*t +- UNE:<br />

base.IText - "WL2 WL3 JAID";<br />

klirtlText (rp,ke,8,B);<br />

bast.Drail(Dde 1 CBIPLb.Top&s<br />

c UNE:<br />

+~.ITUX~ - -FOU mu ~DIIP~*:<br />

k<strong>in</strong>t IText (rp,&base,I,B);<br />

base.tw- = ccwmml~rnrnv~~;<br />

base.TopEdge t= LI*<br />

ba~e.~~e*t m -mu WW WI~L~IE~(~~?HU~D-;<br />

*irrtrrsrt(rp,sbms.eS8)i<br />

bmie.ML = JMUITW~NERSYIDZ<br />

hse.TapEdge *I LI%,<br />

bara.mmt = "Cm UW JAH~~I~IYOISVID"~<br />

Pr<strong>in</strong>tiText(rp,2&ase,B,B) ;<br />

base.* - UIZIWW~VID;<br />

hs~.Top* n LIREI<br />

base.lText - "COU C0i.à WllWERWIO*:<br />

R<strong>in</strong>tlText(rp,&bse,B,B);<br />

1<br />

pm-m--m*ffcmmammf+mtm*icmrrnrr**rrtnmi*m*<br />

C" LetsSa: DK. Blicw pr<strong>in</strong>cipale di unire110<br />

m-~*t*mmtcl~t~~rnm~cl--*~-*cmIm1~rn~rnfC1Hf<br />

wid Latsh(wfd)<br />

l<br />

P<br />

H Sw~otjam la d a e-i i iettlariqci <strong>in</strong> attera del sircccsslw<br />

*/<br />

m E R I' Ciclm <strong>in</strong>ftfialtoi si <strong>in</strong>torarpe cm %-e&" '/<br />

I<br />

Figura 1 - Esercuio proposto nella 25* puntata,<br />

ft


.-<br />

B l B Z W 3 8 4 B 5 0 ~ 7 8 W 9 0<br />

e ~ l l l l l l l l t l l l l l l l l L<br />

- Drlglna del contenltm R IZR,l(l)<br />

vertiu! 2- YO (38,tB)<br />

S (68,38) V4 (88,39)<br />

SHRT LsttEdgdgs, Topme; I* Posizione relativa all'orlglne<br />

O F<br />

UBYi€ Frm<strong>it</strong>Pen. -: I* Penee per il tratto ed il f d a 'i2 (68,481<br />

m Ordwn; I' mh $raflcn v1 (#,48)<br />

EYrE Cnd: l* n- dì coordidata "I 58 -<br />

YIOIIT "m P coordlwte relativo a WtEbgeiiqEdgs *I -<br />

*ma Border fYexfIiirdar: P pumtatom d ?'altra str$ty v *I W - Cmten<strong>it</strong>are<br />

Ftp~Ia 2 - Border.<br />

Eoordlnatm<br />

1<br />

Assolute Ilelatiui i P Relative a V0<br />

ze - <strong>in</strong> n - e non sipificative<br />

ie-20 [la-te1 a - e<br />

38 - [i! i] 46<br />

60 - M<br />

68 - 38 49 E: - i: 29 bW t t 0 ~<br />

P - 30 6B - 20<br />

dtsagnande slrccesslvaments i segio<strong>it</strong>i ad i vertici squemti.<br />

Una volta tm<strong>in</strong>ato, se il caiipo Lxtbrder noa I nulla,<br />

LeftEd#e,Top~dga<br />

rtmct Lrder esempio -<br />

I<br />

1% m, I* Codlrate del vsrtiw zmv rispetttti I'origims'8<br />

Dtwdardsrl) chimd se stessa rlcorrfvamenti.<br />

void DmMordw I* Staw $1 bde nel raster <strong>in</strong> uaa mts posizione */<br />

struct RastPort *RsstPort , I' Datiharione del bordi *I<br />

struct uurder *@arder . I" nonlo di a-ra (anche una C&-) *I<br />

TopUfhet , f* Posizione dal1 'alto<br />

Ls<strong>it</strong>Offret I' Posizione da dnistra<br />

l, 9, JMi,<br />

4,<br />

I<br />

8. 2%<br />

30, 20,<br />

I* hlmi delle p- e mim grafico nirrmle *I<br />

I* Qmttro vmtici<br />

"t<br />

P V1 - &lo *artlee rlsptttm il vartice zero *I<br />

P W - Secondo vdiw r l w t o fl ve'rtffs zar0 *I<br />

P V1 - Tsrzo vrrt-e rlspMtm il vortice zero *I<br />

f* Y4 - m usrtlca rispetta 11 vertici zaro *I<br />

/* Won ci c m altrl bord!_collegati a questo *I<br />

Figura 4 - Draw BordeN.<br />

--<br />

p<br />

F~gum 3 - Dsf<strong>in</strong>izbne di un bordo<br />

. I-<br />

I'ultirno sono i sol<strong>it</strong>i StartAll() e Cloge-<br />

AIl() che sfruttano la tecnica delle maschere<br />

di controllo per l'apertura e la<br />

gnare <strong>su</strong>l fondo della f<strong>in</strong>estra. Come si<br />

vede <strong>in</strong> figura, è stata utilizzata la funzione<br />

rand() del Lattice C per calcolare<br />

le dimensioni ed i colori dei vari remngoli<br />

che famnno da sfondo al testo. Il<br />

il rettangolo degeneri <strong>in</strong> una l<strong>in</strong>ea. oggetti sono. come nel caso di Intui-<br />

La terza procedura serve a rendere i Text, strutture elementari utilizzabili d<strong>it</strong>esti.<br />

Per comod<strong>it</strong>d, ogni testo riporta ì rettamente o referenziabili da altri<br />

getti più complessi. In entrambì i casi,<br />

Itre. al comunque. esse fanno sempre riferimento<br />

ad un elemento conten<strong>it</strong>ore che<br />

deciso di utilizzare sempre la stessa rappresenta anche il sistema di coordistruttura<br />

IntuiText. nate nel quale vanno posizionate. Come<br />

La penultima procedura altro non B giB detto nella scorsa puntata, il punto<br />

che il ciclo di attesa dell'evento che del conten<strong>it</strong>ore rispetto al quale sono<br />

<strong>in</strong>dica che l'utente ha deciso di chiudere def<strong>in</strong><strong>it</strong>i tali oggetti si chiama orig<strong>in</strong>e.<br />

valore ottenuto da rand(] è r<strong>in</strong>ormalizza- la f<strong>in</strong>estra e term<strong>in</strong>are il programma.<br />

to nella gamma richiesta di valori utiliz- Dato che questo è l'unico evento che<br />

zando l'operatore modulo%. <strong>in</strong>oltre. per può arrivare alla porta IDCMP. come<br />

quello che riguarda le coord<strong>in</strong>ate dei specificato nella struttura NewW<strong>in</strong>verticì<br />

dei rettangoli. si B scelto di pren- dow, non c'e bisogno di una procedura<br />

dersi 10 pixel di bordo e di ev<strong>it</strong>are valori tipo HandleEvents(1.<br />

nulli sommando uno at ri<strong>su</strong>ltato detl'o- Nog entrerò ulteriormente nel dettabder<br />

La struttura Border non serve solo,<br />

come farebbe pensare il nome, a dise<br />

gnare cornici, ma 8 la base per rendere<br />

qualunque figura formata da segmenti<br />

perazione rand(]%latomax. Questo<br />

non è <strong>in</strong> effetti necessario, dato che<br />

stiamo utilizzando una f<strong>in</strong>estra GZZ, ma<br />

non fa certo male. Rimrdo che. nel<br />

caso avessimo deciso di non usare una<br />

glio del codice anche perché r<strong>it</strong>engo sia<br />

<strong>su</strong>fficientemente chiaro a chi mi abbia<br />

segu<strong>it</strong>o nelle ultime puntate od abbia<br />

comunque una certa conoscenza di Intu<strong>it</strong>ion<br />

e del C. Chi vuole pub comunque<br />

cònnessi di qualunque <strong>in</strong>cl<strong>in</strong>azione. Inoltre,<br />

legando fra di loro più strutture<br />

Border a formare l'oramai classica catena<br />

di strutture, è possibile di fatto disegnare<br />

qualunque gruppo di figure anche<br />

GimmeZeroZero, avremmo dovuto v+ divertirsi a modificarlo aggiungendo non connesse fra loro.<br />

Ogni bordo ha <strong>in</strong>oltre una <strong>su</strong>a propria<br />

orig<strong>in</strong>e, cioè un punto rispetto al quale<br />

vanno date le coord<strong>in</strong>ate di tutti i vertici.<br />

tangolo siano maggiori di quelle del<br />

primo vertice. A questo scopo si utilizzano<br />

due semplici istruzioni di scambio<br />

[swapl. Se uno vuole può anche aggiup<br />

gere un paio di istruzioni per ev<strong>it</strong>are che<br />

rlo più<br />

~ ~ ~<br />

.<br />

In questa puntata parleremo di bordi<br />

Le strutture che servono a def<strong>in</strong>ire tali<br />

Per dist<strong>in</strong>guerla dall'orig<strong>in</strong>e del contenìtore<br />

la chiameremo ,vertice zero. In pr*<br />

tica, per def<strong>in</strong>ire un bordo basta fornire<br />

d<br />

il vettore delle<br />

~<br />

coord<strong>in</strong>ate<br />

~<br />

relative al<br />

;<br />

vertice zero di tutti i vertici della figura<br />

da disegnare.<br />

La struttura Border (vedi figura 2) B<br />

-<br />

MCmicrocomputer n. 1 DO - ottobre 1990<br />

I


l-<br />

La scheda tecnica<br />

Anche questa volta presenteremo c<strong>in</strong>que comandi dell'Arni-- riportati nella forma completa, le specifiche non <strong>in</strong>cludono<br />

,gaDOS 1.3 a partire da GiTENV. Ricordo ancora una volta che<br />

le <strong>in</strong>formazioni qui riportata sono specifiche della versione 1.3<br />

e che, sebbene la s<strong>in</strong>tassi ed il formato di ogni comando siano<br />

anche quelle <strong>in</strong>formazioni che possono essere trovate nel<br />

manuale dell'<strong>Amiga</strong>DOS 7.2.<br />

LESEKDh<br />

cprsiatrce parawtro da ipceificart<br />

[co@zlon*] pnmtri apriaule<br />

I-z-rip*) parametro opionalt che pud tssm rfpett<strong>it</strong>o n wlie<br />

... serie che pw esien! cant<strong>in</strong>u<strong>it</strong>i<br />

/A<br />

[ repr<strong>it</strong>ori p.r uia lista di qrlmi di cui via disnm VA<br />

specifldu<br />

<strong>in</strong>dici chc il parmiri i#3€ cirim sp~ifie<strong>it</strong>m<br />

!I: <strong>in</strong>dica cha qualla d<strong>it</strong>sraimtn parola chiari VA spseifiea-<br />

sr ai vimlc UHIC l'opzime ad eisr iiimci<strong>it</strong>i<br />

15 <strong>in</strong>dica ims. parola chiavt da speciffeart per attlnrt<br />

I'apirizione ad nu nroriati .<br />

EO.M~: cmm<br />

Fnmto: 6mRY e-<br />

S<strong>in</strong>tassi: 6ETEiiV 'lu#/A' -<br />

Scqo: R<strong>it</strong>orna 11 valore dl una vuiibile di.slstaa<br />

Spciflchc: kuc per vl<strong>su</strong>alizzars il Laierp di W vir(ibile di sl5taa.<br />

wfzzata tram<strong>it</strong>e l'hdlcr W:. Questo i! attuilm sililato<br />

via -la W, m dirc<strong>in</strong>ato i di-= ui 'veri'<br />

handler nelli mriimi 2.l dnl risteru operatiui.<br />

Coundo: ICOW<br />

Fomto: IEOIOI<br />

S<strong>in</strong>tusii: ICOm<br />

Scopo: Erepn uu macro kiga00S da !hrWmth<br />

Specifieha: Permette di eseguir* =*o [script] PriigmWC h YrYenth.<br />

Per usar@ IWW si devc procekrt caht segua: .<br />

- si cc= um -D di sistem utllizzaido un ed<strong>it</strong>om<br />

- il associa a wiia<strong>it</strong>i file una icona di tipo 'progstti'<br />

- si cMam da UorYwh ti voce IiiFO e s4 assegna al<br />

pardro OEFMilT TWl il va1 ire C:IEOI(X<br />

- se lo si desidera si possono speciffcprt i pararrtri<br />

-<br />

dì<br />

tipo (TIIOL TYPE)<br />

WIYOW per sptcifiuri l+ dimmimi e la posiziona dilli<br />

fimtra tipu ELI che IWKX apre all'tise<strong>it</strong>li<strong>in</strong>c<br />

della<br />

OELIIY. pcr specificare un eventuals <strong>in</strong>tirnllo di t-<br />

tra la fim dcll'estcuziom dalli aicr* e la<br />

chiu<strong>su</strong>ra della f<strong>in</strong>estra. <strong>in</strong> d a & perrettere atl'<br />

utente di lmggar. l'mmwlt ri<strong>su</strong>ltato wiiirlizxati<br />

dalla WFP. OEIAY-0 mi d<strong>in</strong>?: chiudi la f<strong>in</strong>ntm<br />

quar~Io l 'utente prcn* Ctrl-t.<br />

Ul3lizundo la trcnia della SEtEIIOiE ESTESA, tru<strong>it</strong>r i1<br />

tasti SHIFI iartri si stlezlaiu un file. è piiL11t puepre<br />

alla mcm il contssiutu del f(lr c m ytri dilla ecro.<br />

kr far ciò, qwsiu d.Yt ~mrt +n testa I'lstriaiom<br />

.kty "<br />

olipure<br />

.fSp.LilP<br />

MCmicrocornputer n. 100 - ottobre 1990<br />

C-h: IF<br />

[m 7<br />

[ma [FflU<br />

F-to: IF [str<strong>in</strong>ga €4 6~16~ str<strong>in</strong>pl FALI<br />

*file]<br />

[m<br />

S<strong>in</strong>tassi: IF "IIBT/S,~S.~5,FN~,EM,61/K,WK,VW5,WSTS/K~<br />

Scop: P e t i l'csecuriy cdirim<strong>it</strong>l di Istrwiani nelle mero<br />

Spetfflche: Esegue m blocco di Irtruzionl fsm ad m c d e EtSE d<br />

EIAIF, qmlors 14 cdiziim spicificrti sii mi.<br />

61 s a m irra. prn<strong>in</strong>ti nilli vmfam 1.2. In geme 11<br />

coqarmzionc vime tffettuab tr, rtr<strong>in</strong>*, tuttavia, se i1<br />

spttfica VAL. usa dtvlene di tipo niaicrico.<br />

Eserpio: IFmSTScfil-<br />

IF cfileilzsJ'C1 2WB V&<br />

ELETE cfil- PUfEi<br />

E WF<br />

EYOIF<br />

Cdo: IBFO<br />

Fumato: IWFD cunstb --<br />

S<strong>in</strong>tassi: IMFO " O M W<br />

Scopo: Vi<strong>su</strong>alizuid~irnl<strong>su</strong>ll'orpaniz~iomWfili<br />

Specifiche: Virwl4za <strong>in</strong>faioni <strong>su</strong>i voliei mnt<strong>it</strong>i e <strong>su</strong>lla ripartlziane<br />

dello spazio mlls mrii di =sa.<br />

La vnrriom 1.3 pcractte una torma &stione &?i ~ l cm m<br />

nmi malto limghi e pvuttt di vfiuali~xiri li <strong>in</strong>firurioni<br />

relative anche ad un s<strong>in</strong>golo volm.<br />

Eseaplo: IBFO dfl:<br />

produce<br />

Hnuntd disbi:<br />

Un<strong>it</strong> Size Used FmFullErn Statu b<br />

DF1: BBBK i219 539 W e U d aily Boot Disk<br />

o :<br />

IIIZTALL DRIE ~EBIDF~~D~~DFW:<br />

~wsoorl [MCKI<br />

S<strong>in</strong>trssi : IHSTALL 'ORI~A,IOBWT/S.EHEWS~<br />

Scopo: M c il dlsco un disci BOS<br />

Rcl blocco pia nrim crricato o sm. il codis di cari-to<br />

del slstm a <strong>su</strong>nuda<br />

-<br />

che l'wiom YOBW sia oasssa o spirifica-.<br />

CHECK serve a varifiurc se il bloccm di cir<strong>it</strong>aewto i<br />

di tipo -li& Q m. In quest'ultim caso 11 cou pt&e<br />

a s m dovuta alli prssma di im virus. Ci scm. t d a ilcunf<br />

prodotti chi LlofJif anmli a i- di protniont<br />

i ptr altri wtivi; la *~gglor parte soeu giochi. Se 11 disco<br />

cantimi un blueo di carirr*snto valido td L stata rg.cifis<strong>it</strong>i<br />

FHECK. IHSTdLL rltorna O. altrimti rltm 5 W).


I<br />

I *n<br />

- - 4 1<br />

fprlltCf(wnfp,*Reii ma u pii cnratterl ed IHUID<strong>in</strong>ESC per uscire\nw):<br />

*. dnd(eonfp);<br />

** Pmgraiiwe <strong>in</strong> C <strong>su</strong> hlga - Wi de Judlclim m98 ** C - fgetc(c0nfp):<br />

fl ........................................ C. rew<strong>in</strong>d(cunfp);<br />

+h E & q h dl scdttura e lettura <strong>in</strong> f<strong>in</strong>utre MIRI a Mil: *C fpr<strong>in</strong>tf(confp."Hex equivalente: 0f%tX\nm,c);<br />

** Ufilizzm& 5010 le fmiionl standard dal Ldttlce C 5.u **<br />

**<br />

**I~Il*1~..**.~*M*mfl~"~I~*fC*1*1*mtCIfCC.H-*.~<br />

1<br />

whfle (C != BxlB);<br />

fclose(confp);<br />

Xlucloda "a*ec/tmss.h'<br />

l<strong>in</strong>clude 'Intu<strong>it</strong>im/<strong>in</strong>ti<strong>it</strong>ion.ho<br />

Hncld~ *proto/ewc.hW<br />

Hnclude 'pmtoJ<strong>in</strong>tu<strong>it</strong>ion.ho<br />

rwfp ~O~~("WL~~~/ZO~~~OI~~B~RC.Y:',"~+"J;<br />

tf (rawfp - WLL) tlisdlT();<br />

&<br />

P<strong>in</strong>cludc "stdla.ha<br />

tlncluda "std1lb.h'<br />

#faelude *striag.h"<br />

(<br />

re<strong>in</strong>nd(rarfp);<br />

fpr<strong>in</strong>tf(cnnfp."Preii<br />

rewiadIrawfp);<br />

un carattm senza IWIO\nE5C per uscire\nU);<br />

vaid StmtAll (votd):<br />

C = fgetc(nawfp);<br />

uoid Oosdll (wldl:<br />

Msflne IRR O<br />

Bdsf *ne I- *ir<strong>it</strong>u<strong>it</strong>Ion.llbrary'<br />

ctrud latultlonEara *IntwltloWase:<br />

rew<strong>in</strong>d(confp);<br />

fpristf(emmfp,"iiex<br />

1<br />

Alle (C 1- BxiE);<br />

fclose(rarfp);<br />

eqwivalebta: -nv,=);<br />

FILE *~~ifp, *rawfp; ~imsnrio;<br />

1<br />

-ud~f~r~c IY:<br />

wfd Clo<strong>su</strong>AlI(J I* ord<strong>in</strong>e <strong>in</strong>versol!l *I<br />

I<br />

if (mask 8 IIIRSK) Elo~eLibrary(Intu<strong>it</strong>imBase)~<br />

txlt(8);<br />

1<br />

vofd StartA110<br />

(<br />

P<br />

*. Rpri le llbrerie<br />

cmfp - ~O~~~("CMI:ZBIZB/~ZBI~~~IC~:*,?U*~J i *I<br />

if (wnfp IIIILL) ClossAll(); Intu<strong>it</strong>ionBase = (stmt I<strong>it</strong>u<strong>it</strong>ionEase *)ganLibrary(IHR#,IR€V)I<br />

If (Intu<strong>it</strong>lonBase - YULL) Closdll();<br />

uask 1- 1#9SK;<br />

1<br />

Fgura 5 - M <strong>in</strong> f<strong>in</strong>estte CON: e MW:<br />

formata da otto campi:<br />

MEdge: <strong>in</strong>dica la posizione del vertice<br />

zero del Bordo, <strong>in</strong> pixel, rispetto al<br />

lato s<strong>in</strong>istro dell'elemento che io con-<br />

FrontPen: è il numero del registro<br />

del colore utilizzato per tracciare i segmenti<br />

che compongono il bordo;<br />

BackPen: non 6 utilizzato per i bordi;<br />

DrawMode: è il modo grafico di tracciamento<br />

del bordo (Qedi più avanti);<br />

un paio di questi campi. Innanzi tutto<br />

DrawMode. Questo campo, differentemente<br />

da quanto <strong>su</strong>ccede per Intui-<br />

Text, pub as<strong>su</strong>mere solo due valori:<br />

JAMI : che <strong>in</strong>dica che va usata<br />

er il tracciamento dei seg<br />

ENT: con 11 quale il segmento<br />

viene tracciato cambiando lo<br />

sfondo con il <strong>su</strong>o compiemento b<strong>in</strong>ario<br />

(<strong>in</strong> term<strong>in</strong>i di numero del registro di<br />

colore).<br />

Ecco perché il campo BackPen viene<br />

di fatto ignorato. Esso non ha alcuna<br />

util<strong>it</strong>à se si usa uno di questi due modi<br />

non sia I'u<strong>it</strong>ima coppia (vedi figura 3).<br />

Una caratteristica <strong>in</strong>teressante di que<br />

sto vettore B quella di rappresentare di<br />

fatto La forma del bordo, <strong>in</strong>dipendente<br />

mente da dove esso sia posizionato nel<br />

conten<strong>it</strong>ore. Questo permette di riutilizzare<br />

lo stesso vettore per def<strong>in</strong>ire più<br />

bordi che abbiano la stessa forma ma<br />

che si trovano <strong>in</strong> punti diversi di un<br />

elemento conten<strong>it</strong>ore o che appartenga<br />

no addir<strong>it</strong>tura a conten<strong>it</strong>ori diversi. Que<br />

sto B il motivo per il quale i vertici del<br />

bordo vanno mi<strong>su</strong>rati relativamente at<br />

vertice zero, piuttosto che rispetto all'e<br />

rig<strong>in</strong>e del conten<strong>it</strong>ore. Se fosse stata<br />

Count: specifica il numero di vertici<br />

forn<strong>it</strong>i nel vettore XY;<br />

XY: 4 il vettore che contiene le coorgrafici.<br />

Veniamo ora al vettore XY. Esso &<br />

formato dalle coord<strong>in</strong>ate (coppia X. Y) di<br />

i che compongono il bordo,<br />

scelta quest'ultima soluzione, <strong>in</strong>fatti,<br />

avremmo dovuto usare vettori differenti<br />

SOIO per un fattore costante pur essendo<br />

i bordi da disegnare esattamente<br />

iù<br />

t-<br />

qualche parola <strong>in</strong> più <strong>su</strong><br />

mi<strong>su</strong>rate a partire dal vertice zero. Quest'ultimo<br />

non fa necessariamente parte<br />

del bordo, a meno che una delle coppie<br />

La prima<br />

oord<strong>in</strong>ate<br />

<strong>su</strong>ccessiivo<br />

di un<br />

segmento ed, eventualmente, quello di<br />

partenza del <strong>su</strong>ccessivo, a meno che<br />

identici, sprecando così memoria e<br />

complicando <strong>in</strong>utilmente il programma.<br />

E importante capire le ragioni che<br />

stanno alla base delle scelte operate<br />

dagli sviluppatori di un sistema opemtivo<br />

o di un programma, piuttosto che<br />

lim<strong>it</strong>arsi ad accettarle ed utilizzarle, perché<br />

prima o poi vi cap<strong>it</strong>erà sicuramente<br />

di dover fare scelte analoghe. L'espe-<br />

MCmicrocomputer n. 100 - ottobre 1990<br />

. .


ienza di un programmatore non sta<br />

<strong>in</strong>fatti tanto nella <strong>su</strong>a conoscenza di un<br />

l<strong>in</strong>guaggio o di un sistema operativo,<br />

quanto nell'<strong>in</strong>sieme di tutte quelle tecni-<br />

che logiche (chiamate a volte, scheno-<br />

sarnente, trucchi) che sono <strong>in</strong> effetti il<br />

vero motore di un programma. Molti<br />

ottimi programmatori <strong>in</strong>fatti, conoscono<br />

cosi tanti l<strong>in</strong>guaggi da aver bisogno c e<br />

munque della guida di riferimento men-<br />

tre programmano, sia per ev<strong>it</strong>are errori<br />

di s<strong>in</strong>tassi, sia per trovare le funzioni ed<br />

i servizi messi a disposizione da quello<br />

specifico l<strong>in</strong>guaggio. Non è qu<strong>in</strong>di tanto<br />

importante conoscere a menad<strong>it</strong>o un<br />

l<strong>in</strong>guaggio od il formato delle funzioni di<br />

Casella Postale<br />

Questo mese rispondo ad una lettera rice-<br />

vuta da Campagna, <strong>in</strong> prov<strong>in</strong>cia di Salerno, il<br />

30 luglio 1990.<br />

Oggetto:<br />

Chiarimenti <strong>su</strong>lle funzioni getehafl) e simili,<br />

programmando <strong>in</strong> C <strong>su</strong> <strong>Amiga</strong> 500 - V. 1.3.<br />

Gentilissimo Signor Dario de Judicibus,<br />

sono un lettore dt MC dal lontano 1985. Da<br />

allora non ho perso un numero del <strong>su</strong>ddetto<br />

mensile ed ho avuto cosi Ibccasione di seguire<br />

i vostri articoli soprattutto quelli legati<br />

all'<strong>Amiga</strong> ed al L<strong>in</strong>guaggio C. Come avete gi8<br />

cap<strong>it</strong>o, posseggo un <strong>Amiga</strong> 500 e program<br />

mando <strong>in</strong> C <strong>su</strong> di esso ho riscontrato I'evrdente<br />

difficoltà di usare correttamente la<br />

funzione getcher(1 e le <strong>su</strong>e simili nei pro-<br />

gmmm~ tipo i classici di K&C.<br />

banalmente evidente che potrei fare a<br />

meno di scrivere proprio questi programmi.<br />

dedicandomi a cose pio serie. Ma due motivi<br />

mi sp<strong>in</strong>gono ad <strong>in</strong>sistere nella risoluzione di<br />

questo problema:<br />

il primo B che sono metodico e testardo,<br />

percid devo menere anche questo tassello al<br />

posto giusto, se voglio andare avanti serena<br />

mente.<br />

i li secondo motiva B legato a voi (ecco il<br />

perché della lettera! 7) e precisamente ad un<br />

mtro nve~chiottoi> articolo: ~Pmgramrnare<br />

<strong>in</strong> C <strong>su</strong> <strong>Amiga</strong> (2)w del giugno 1988. In esso<br />

(scusate se I'ho ripescatol?) mi confermate i<br />

problemi //O che si riscontrano nel CL/ di<br />

<strong>Amiga</strong> - mi riferisco alle f<strong>in</strong>estre aperte<br />

come CON: o come RAW: - ma nello<br />

stesso tempo rimandate ad un chnrimento<br />

prossimo, che però non mi ri<strong>su</strong>lta abbiate<br />

fatto snmra. Avete si toccato motti temi<br />

<strong>in</strong>teressanti, quanta piuttosto ostici per ma<br />

ma non più quello.<br />

Sono alquanto imbarazzato nel parlarvi pro-<br />

MCrnicrocomputer n. 100 - ottobre 1990<br />

un sistema, quanto avere la capac<strong>it</strong>h di<br />

sviluppare una logica di programmazio-<br />

ne semplice, flessibile e potente.<br />

Naturalmente anche i bordi, come già<br />

i testi, possono essere direttamente<br />

disegnati <strong>in</strong> un raster utilizzando una<br />

funzione appos<strong>it</strong>a, okre che essere <strong>in</strong>di-<br />

rettamente resi quando viene vi<strong>su</strong>alizz*<br />

to un oggetto che li referenzia, come ad<br />

esempio un quadro od un controllo.<br />

Questa funzione si chiama DrawBor-<br />

der0 ed B riportata <strong>in</strong> figura 4.<br />

Conclusione<br />

Nella prossima puntata parleremo<br />

prio di qu#sto pro&lema, percbd sono wnv<strong>in</strong>-<br />

to che non lo r<strong>it</strong>eniate più molto <strong>in</strong>teresan-<br />

te; tuttavia vi pregherei lo stesso d! dami<br />

una risposta. anche m<strong>in</strong>ima, anche solo m<br />

me il t<strong>it</strong>olo di un libro (facilmente reperibile.. .)<br />

<strong>su</strong>l quale posm studiare da solo quesm solu-<br />

zione.<br />

Credo di aver abusato gid abbastanza della<br />

vostra wrtese attenzione per f<strong>in</strong>ire vi elenca<br />

il sistema <strong>su</strong> cui studio:<br />

<strong>Amiga</strong> 500 con espansione ed accessori vari<br />

.t Lattice C 5.04 (semi-orig<strong>in</strong>ale).<br />

Se anche non mer<strong>it</strong>assi la vostra risposta,<br />

vi r<strong>in</strong>grazio per avermi segu<strong>it</strong>o f<strong>in</strong> qua e vi<br />

saluto cordialmente.<br />

Cim Liberato - Campagna (SAI<br />

Innanzi tutto non penso che provare pro-<br />

gramm<strong>in</strong>i classici alla K&R sia da considerare<br />

stupido o banale. Il l<strong>in</strong>guaggio C, benché<br />

<strong>in</strong>dubbiamente potente. non può certo consi-<br />

derarsi uno dei più l<strong>in</strong>eari e semplici per<br />

quello che riguarda leggibil<strong>it</strong>à e s<strong>in</strong>tassi.<br />

Spesso questi piccoli programmi possono<br />

<strong>in</strong>segnare pio mse di quante se ne può<br />

imparare affrontando programmi upiù ser<strong>in</strong>.<br />

E se qualcuno ha qualche dubbio a riguardo.<br />

vada a lwgersi lo splendido The C Puzzle<br />

Book di Alan R. Feuer, pubblicato dalla Pren-<br />

trceHall (ISBN @l 3-10992W).<br />

Veniamo ora al problema <strong>in</strong> questione. La<br />

funzione getchar[), implementata <strong>in</strong> realtà<br />

nel Lattice C 5.xx come macro, dovrebbe<br />

leggere un carattere per votta da console. Se<br />

apriamo una f<strong>in</strong>estra come CON:, tuttavia, i<br />

dati immessi da tastiera vengono filtrati <strong>in</strong><br />

modo da lasciar passare colo i caratteri da<br />

0x20 a Ox7E e da 0x80 a OxFF. La maggior<br />

parte dei caratteri di controllo, i tasti cursore<br />

ed i tasti funzionali sono <strong>in</strong>tercettati ed utiliz-<br />

zati dal gestore di CON:. Ad esempio, se si<br />

usa NEWCON:, il tasto di cancellazione <strong>in</strong>-<br />

versa pub essere utilizzato per cancellare un<br />

carattere mentre i tasti cursore permettono<br />

di spostarsi <strong>su</strong> e giù per il testo. Se poi si<br />

della strurtura Image. Purtroppo lo spa-<br />

zio lim<strong>it</strong>ato non mi ha consent<strong>it</strong>o di farlo<br />

<strong>in</strong> questa puntata. Ad ogni modo vi<br />

lascio un semplice esercizio per la pros-<br />

cima volta. Modificate nel programma<br />

che avete scr<strong>it</strong>to a soluzione dell'eserci-<br />

zio che vi avevo proposto nella 24"<br />

puntata, la parte relativa alla generazio-<br />

ne del fondo <strong>su</strong> cui stampare una frase<br />

<strong>in</strong> differenti modi grafici. Invece di dise-<br />

gnare <strong>su</strong>l fondo tanti rettangoli di diffe-<br />

renti dimensioni e colori, tracciate un<br />

certo numero di bordi scegliendo a caso<br />

vuoi le coord<strong>in</strong>ate dei vertici. vuoi ì<br />

colori ed il modo grafico.<br />

Buon lavoro!<br />

utilika ConMan. anche alcuni tasti funzione<br />

sono attivi per varie operazioni. Inoltre. 1<br />

testo non viene presentato al programma<br />

f<strong>in</strong>tanto che non viene premuto il tasto di<br />

<strong>in</strong>vio. Ecco perché la ge'Kchar() non si wm<br />

porta come ci si potrebbe aspettare <strong>in</strong> una<br />

console pura. Per risolvere il problema, d<br />

necessario aprire la f<strong>in</strong>estra come RAW:. ma<br />

<strong>in</strong> questo caso bisogna aspettarsi di dwer<br />

gestire anche un certo numero di altri carat-<br />

teri oltre a quelti stampabili, e precisamente:<br />

i tasti funzione,<br />

il tasto di aiuto,<br />

i tasti cursore.<br />

In aggiunta a tali sequenze (non si tratta<br />

<strong>in</strong>fatti di s<strong>in</strong>goli caratteri quanto di sequenze<br />

di due o più byte), e possibile chiedere alla<br />

console di ricevere <strong>in</strong>formazioni pio dettaglia-<br />

te relativamente al codice del tasto premuto.<br />

il tempo di durata della pressione. i tasti<br />

qualificatori premuti contemporaneamente al<br />

tasto <strong>in</strong> questione e così via. Usando RAW:<br />

qu<strong>in</strong>di, la getchad) pub funzionare a condi-<br />

zione di ridef<strong>in</strong>ire std<strong>in</strong>, ma la gestione dei<br />

dati <strong>in</strong> <strong>in</strong>gresso e più complessa.<br />

Un esempio di quanto detto, che utilizza la<br />

fgetd] <strong>in</strong>vece dalla getchm <strong>in</strong> quanto. piut-<br />

tosto che ridef<strong>in</strong>ire std<strong>in</strong>, si è scelto di usare<br />

la fopen() per ottenere il puntatore al flusso<br />

110, è riportato <strong>in</strong> figura 5. Provi a wrnpilare<br />

questo semplioe programm<strong>in</strong>o con Ic -L ed<br />

a farlo girare.<br />

Una tecnica più completa per le operazioni<br />

di 10 co<strong>in</strong>volge la console.device. A questo<br />

riguardo Le consiglio di leggere l'articolo 112<br />

serial device a pag. 220 di MC88 del settem*-<br />

bre '89, e la lettera La 1nput.Device pubblica<br />

ta neiia rubrica Softwre <strong>Amiga</strong> a pag. 244 di<br />

MC89 delt'ottobre '89. Si tratta di due letture<br />

molto <strong>in</strong>terescanti per comprendere il cow<br />

cetto di device e qu<strong>in</strong>di affrontare <strong>su</strong>ccessi-<br />

vamente la conrwle.devke, di cui spero di<br />

parlare quanto prima.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!