Programmare in C su Amiga (261 - digiTANTO.it
Programmare in C su Amiga (261 - digiTANTO.it
Programmare in C su Amiga (261 - digiTANTO.it
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.