Come programmare l'Amiga in C Cos'e' il C? In questa prima parte, dedicata a chi non conosce il linguaggio C, ci proponiamo di spiegare la sintassi di questo linguaggio, ossia le varie istruzioni disponibili ed il loro utilizzo e di mostrare i motivi per cui sia preferibile usarlo nella programmazione dell'Amiga al posto di altri linguaggi quali l'AmigaBasic. Nella seconda parte, invece, cominceremo a vedere come funziona il sistema grafico di Amiga a livello hardware e software: vedremo in teoria ( e anche in pratica) come sia possibile ottenere tutti gli effetti incredibili che i vari programmi ci mostrano e quali "circuitini" vengano realmente utilizzati all'interno di Amiga per renderli sul monitor. Torniamo ora al C: chi gia' conosce bene questo linguaggio puo' andare subito oltre, chi invece lo conosce poco o per niente, legga con attenzione queste pagine; se qualche passaggio dovesse risultare poco chiaro, gli esempi nella seconda parte dovrebbero sicuramente essere d'aiuto. Cominciamo subito dicendo che il C non e' un linguaggio interprete come il Basic, ma deve essere compilato. Cio' significa che, mentre con il Basic possiamo scrivere due righe di programma e vedere immediatamente cosa succede con il comando RUN, in C dopo avere scritto il programma bisogna compilarlo per poterlo far funzionare. Questo e' dovuto al fatto che il Basic ogni volta che esegue una istruzione deve trasformarla in una sequenza di operazioni che il computer poi esegue. Se in un programma in Basic facciamo in modo che una certa istruzione venga eseguita 1000 volte, il Basic per 1000 volte dovra' tradurre questa istruzione per poterla eseguire. In C invece, quando compiliamo un programma, tutte le istruzioni vengono tradotte una volta per tutte quindi l'esecuzione sara' molto piu' veloce. Ovviamente, se vogliamo scrivere un programma in C, dovremo essere sempre abbastanza sicuri di quello che facciamo perche', ogni volta che modifichiamo un programma, dobbiamo poi ricompilarlo per provarlo nuovamente. Per quanto riguarda cio' che si puo' fare in C basta dire che programmi come Deluxe Paint e Deluxe Music sono totalmente, o quasi, scritti in C. L'unico difetto del C quindi potrebbe essere proprio il fatto che debba essere compilato, ma questo porta anche numerosi vantaggi: 1) Il codice compilato e' molto veloce. 2) Il programma deve essere compilato solo una volta, se e' corretto: in seguito il programma sara' completamente autosufficiente (mentre un programma in Basic non funzionera' mai se prima non carichiamo l'interprete). 3) un programma in C dovra' essere studiato bene nei dettagli prima di essere compilato e liberato dagli errori. Questo elimina la tendenza di molti programmatori a procedere per tentativi nello scrivere una routine con il risultato di avere un programma illeggibile e dal funzionamento spesso precario. 4) Il C, anche se molti di voi non l'avranno mai sentito nominare, e' un linguaggio assai diffuso e molto usato sui grandi sistemi per le sue enormi possibilita'. Se qualcuno di voi non ha mai sentito parlare del famoso sistema operativo UNIX, del resto simile a quello dell'Amiga stesso, sappia che esso e' stato realizzato in C. Chiudiamo ora questa lunga parentesi e cominciamo lo studio di questo linguaggio. Facciamo subito una precisazione: tutto cio' che riguarda il linguaggio teorico si basa sul libro "LINGUAGGIO C" di W.Kernigham e D.Ritchie disponibile sia in versione Italiana che in quella Inglese; per quanto concerne l'utilizzo pratico di cio che faremo supporremo che voi siate in possesso del "Lattice C Compiler" versione 3.00, o superiore e che conosciate bene la CLI dell'Amiga. Per chi vorra' poi approfondire gli argomenti svolti, saranno indicati i titoli dei manuali da cui sono state tratte le nostre informazioni. Diciamo subito che questa sessione non intende spiegare da zero il C ma vuole essere di ausilio a chi abbia preso il libro sopra citato (o un altro), inserendo un certo numero di programmi esempio spiegati riga per riga. Consigliamo di provare a rifare questi programmi, a compilarli e a eseguirli in modo da imparare a usare questo linguaggio. Scriviamo un programma che conti il numero di spazi, di tab e di newline in un file: /* questo e' un commento!! */ #include "resources/stdio.h" /* Al momento della compilazione verra' caricato il file stdio.h che contiene informazioni di carattere generale che a noi non interessano. Ci basta sapere che dobbiamo includerlo! */ main() /* nessun argomento */ { int c,nb,nt,nl; /* queste sono delle variabili di tipo intero */ while((c=getchar())!=EOF) { /* deve caricare in c il prossimo byte del file fino a quando questo e' uguale alla fine del file ed eseguire le seguenti operazioni: */ nb=0; nt=0; nl=0; if(c == ' ') ++nb; if(c == '\t') ++nt; if(c == '\n') ++nl; /* ATTENZIONE: dobbiamo usare c == ' ' e non c=' ' perche' nel primo caso ci chiediamo se ' ' e' il valore di c, nel secondo affermiamo che ' ' e' il valore di c (ossia facciamo una assegnazione */ printf("%d %d %d\n",nb,nt,nl); /* la stringa tra apici indica che bisogna stampare 3 interi seguiti da un ritorno a capo. */ } /* qui finisce il programma */ Provate ora a trasformare questo listato in un programma vero e proprio: per prima cosa dovete digitare il listato in un file che chiameremo "conta.c". Per fare cio' possiamo usare il comando ED in questo modo: ed ram:conta.c cosi' il file verra' memorizzato in ram. Quando avete finito scrivete x go conta quando tutto e' finito provate a scrivere dir ram: dovreste trovare i file "conta.c", "conta.o" e "conta"; "conta" e' il file eseguibile. Provate ora a digitare conta >= < <= ==! =. Sono tutti noti tranne == e! =. == indica l'uguaglianza e non va confuso con = che indica un assegnamento. Quindi dobbiamo scrivere if(a==3) e non if(a=3). Per vedere la differenza si provino i seguenti programmi: main() { int a; a=10; if(a==3) printf("cucu\n"); printf("%d",a); } main() { int a; a=10; if(a=3) printf("cucu\n"); printf("%d",a); } La stringa "cucu\n" indica la parola cucu seguita da un a_capo_riga. Vediamo altri operatori: if(a==3 && c!=d) il simbolo && indica AND. il simbolo || indica OR. Esistono anche operatori incremento e decremento. Ad esempio l'istruzione a=a+1; puo' essere scritta a++; oppure ++a; Le due espressioni sono differenti!! Se ad esempio poniamo a=3 ,l'istruzione b= a++ ; da a b il valore 10 poi incrementa a. Se invece scriviamo b= ++a; prima viene incrementato a, poi b assume il valore 11!!! In maniera analoga funziona --. Ad esempio a=12*(--a); Esistono anche operatori logici orientati ai bit. Questi saranno chiari per chi conosce l'aritmetica in base 2. Gli operatori sono: & AND logico | OR logico ^ XOR << shift a sinistra >> shift a destra ~ complemento a uno. Esiste infine un espressione abbreviata di assegnamento. Ad esempio l'istruzione a=a+13; puo' essere scritta a += 13; mentre l'istruzione c=c-11; diventa c -= 11; Il programmatore e' comunque libero di scegliere fra le due espressioni. Espressioni condizionali: Abbiamo gia avuto modo di incontrare un espressione condizionale. Rivediamola: if(a==3 && c>=1) print("ciao"); Questa e' l'equivalente in Basic di IF a=3 AND c>=1 then print "ciao" Una seconda espressione condizionale e' la seguente: a=(c==3 ? 13 : 0); Questa indica che se c==3 allora a=13 altrimenti a=0. In Basic scriveremmo IF c=3 then a=13 else a=0 ____________________________ Abbiamo concluso la prima lezione sul C. Un consiglio veramente importante e' quello di vedere il maggior numero di listati possibile e cercare di vedere come sono state applicate le varie regole sopra spiegate: l'unico modo di imparare un linguaggio e' infatti quello di usarlo. Avrete notato che il C si caratterizza subito per la sua estrema sinteticita', molto utile per chi e' ormai pratico del linguaggio ma forse un po' ostile per chi tenta di avvicinarsi ad esso per la prima volta. Volendo e' un po' come imparare a stenografare: all'inizio e' tutto incredibilmente difficile ma quando si e' finalmente capaci se ne apprezzano i vantaggi (chiedo scusa se il paragone puo' risultare un poco debole!) Arrivederci quindi alla prossima puntata!!! Roberto Pellagatti