Traccia della lezione Lez16: Lucido 3: argc sta per "argument count" argv sta per "argument vector" Ovviamente, il vettore argv va dall'indice 0 all'indice argc-1. In realtà viene allocato anche un elemento argv[argc], di valore NULL. Lucido 4: Il codice PARAM.C dà un esempio della lettura di parametri. Si considera come parametro ogni sequenza di caratteri separati da spazio. Qualunque linea di comando si passi (ovviamente che cominci con il nome del programma, PARAM) fornirà all'utente il numero dei parametri passati e il loro elenco nello stesso ordine con cui sono stati passati. Ad esempio: - PARAM restituirà 1 parametro pari a PARAM - PARAM PROVA restituirà 2 parametri pari a PROVA e PARAM - PARAM seguita da qualsiasi numero di parametri (per es., 12) restituirà quel numero di parametri (12) Lucido 5: Il codice DATA.C accetta da linea di comando una data in formato letterale la traduce in una data in formato numerico GG/MM/AAAA, e la stampa a video. In caso di errore, restituisce un valore che specifica se il numero di parametri in ingresso è errato, oppure se il parametro non è una data. Dovendo usare la funzione strcmp, DATA.C include la libreria (DEV-C compila anche se non la si include, ma questo non dovrebbe succedere). E' buona norma che l'interpretazione della linea di comando sia affidata a una funzione ad hoc (in questo caso InterpretaLineaComando), che riceve argc e argv e restituisce le strutture dati "giorno", "mese" e "anno", usate nel seguito per contenere i dati. Un buon esercizio può essere completare tale funzione controllando che le stringhe "giorno" e "anno" rappresentino numeri ragionevoli e compatibili fra loro. Nella lezione sul parsing descriveremo funzioni con le quali fare questo diventa molto semplice. Nella lezione sulla libreria standard discuteremo perché si usi "exit" nel caso di errore e "return" nel caso di successo e vedremo anche come usare il valore restituito dal programma al sistema operativo in un file batch. I tre codici CALCOLO1.C, CALCOLO2.C e CALCOLO3.C illustrano tre versioni via via più sofisticate dell'uso dei parametri nella linea di comando per fornire dati e istruzioni a un programma. Tutti e tre possono calcolare quadrato e cubo di un numero passato attraverso la linea di comando come parametro del main. Usano una funzione InterpretaLineaComando() per interpretare i parametri contenuti in argc e argv e trasformarli nei dati e nelle istruzioni da eseguire effettivamente. Tale funzione usa a sua volta la funzione ConverteStringaInIntero() fornita nella libreria IOCREMA, che traduce una stringa in un numero intero, oppure segnala che la stringa non rappresenta un numero e termina il programma. - CALCOLO1.C fa entrambe le cose. Se il numero di parametri è scorretto, segnala l'errore e stampa un messaggio che spiega l'uso del programma. - CALCOLO2.C calcola il quadrato o il cubo del numero, a seconda che esso sia introdotto dall'opzione -q o -c. Una delle due opzioni deve essere presente, ma non entrambe. - CALCOLO3.C calcola il quadrato e/o il cubo di un numero a seconda che sia presente l'opzione -q e/o l'opzione -c. Può essere presente una delle due o entrambe, in un ordine qualsiasi. Se sono presenti entrambe, possono essere seguite da numeri diversi tra loro. E' ammessa la linea di comando CALCOLO -c 2 -c 3: la seconda istruzione cancella la prima. Ovviamente, si può complicare il codice per eseguire altri comandi, con opzioni diverse da -q e -c, oppure per eseguire catene di comandi, o per vietare l'esecuzione di due comandi uguali su dati diversi, o per consentirla, ma segnalando la circostanza all'utente, che magari non se n'è accorto. L'idea generale è che la linea di comando contiene in alternanza parametri di controllo e parametri informativi: - il parametro di controllo indica il significato del parametro successivo (ma eventualmente anche dei due, tre, ecc... parametri successivi) - i parametri informativi indicano i dati veri e propri Esercizio: Si aggiungano al codice i parametri -a e -m, seguiti da esattamente due numeri interi, che indicano al programma di sommare o moltiplicare i due parametri seguenti. Si complichi quindi il programma assumendo che le opzioni -a e -m possano essere seguite da più di due numeri interi (in questo caso, occorre che InterpretaLineaComando allochi un vettore di addendi o di fattori e lo restituisca all'esterno).