[1] I compilatori Borland e Zortech,
ad esempio, soddisfano detto requisito, ma, in alcune situazioni, la struttura
delle librerie, ove differente da quella implementata da Microsoft, può
essere causa di problemi.
[2] Come al solito, occorre fare attenzione. E' vero
che le librerie Clipper sono scritte in Microsoft C, ma va precisato che
si tratta della versione 5.1. Non è un particolare irrilevante,
perché, pur utilizzando il compilatore Microsoft per scrivere funzioni
C da interfacciare a Clipper, possono sorgere strani problemi se la versione
usata non è, anch'essa, la 5.1. In alcuni casi è possibile
utilizzare la GRAPHICS.LIB del Microsoft C 6.0 con la LLIBCA.LIB
del Microsoft C 5.1, ma si tratta comunque di un pasticcio pericoloso.
[3] Con il Microsoft C viene perciò impiegata
la libreria LLIBCA.LIB, mentre con il Borland la libreria usata
è la CL.LIB.
[4] Si presti però attenzione al fatto che Clipper
è un linguaggio caseinsensitive: ciò non pone problemi,
a patto di non differenziare mai nomi nei sorgenti C solamente in base
alle maiuscole/minuscole.
[5] In Clipper gli elementi dell'array sono numerati
a partire da 1 e non da 0 come in C. Inoltre, ogni elemento
di un array può appartenere ad un tipo differente da quello degli
altri.
[6] L'extend system implementato dal Clipper 5 include
alcune macro, dichiarate in EXTEND.H, utilizzabili, in luogo di
_parinfo() e _parinfa(), per il controllo dei parametri
passati alla funzione: la macro
PCOUNT
restituisce il numero di parametri che la funzione C ha ricevuto. La macro
ALENGTH(int parmno)
accetta il numero d'ordine del parametro ricevuto dalla funzione C e, se
questo è un array, restituisce il numero di elementi che lo costituiscono.
Infine, le macro elencate di seguito sono concepite per controllare il
tipo del parametro la cui posizione è loro passata in input:
ISARRAY(int parmno); // restituisce non-zero se il parametro parmno e' un array
ISBYREF(int parmno); // restit. non-zero se parametro parmno e' passato per reference
ISCHAR(int parmno); // restituisce non-zero se il parametro parmno e' una stringa
ISDATE(int parmno); // restituisce non-zero se il parametro parmno e' una data
ISLOG(int parmno); // restituisce non-zero se il parametro parmno e' un campo logico
ISMEMO(int parmno); // restituisce non-zero se il parametro parmno e' un campo memo
ISNUM(int parmno); // restituisce non-zero se il parametro parmno e' un numerico
Il valore minimo che il parametro parmno può assumere è
1 e indica il primo parametro passato alla funzione C.
[7] Utile quando non si tratti di una vera e propria
stringa (terminata da NULL), ma di una sequenza di caratteri qualsiasi,
da gestire in modo binario.
[8] Forse non guasta ricordare che si tratta per default
di un puntatore far, dal momento che il modello di memoria utilizzato
è sempre il large model. Identica considerazione vale per tutti
i puntatori a stringa (char *) utilizzati da alcune delle funzioni
_par...() e ret...().
[9] Una funzione C dedicata allo svuotamento del buffer
di tastiera è presentata in un paragrafo
dedicato.
[10] E' sufficiente dichiararli come parametri in testa
al programma.