Karakteres: | max 254 hosszú tetszõleges szöveges adat karakterenként egy byte-on ASCII kódban helyigény szöveg hossza + 2 byte. |
Numerikus: | előjeles számok ábrázolására alkalmas. Az egyetlen, matamatikai műveletek végrehajtására alkalmas típus. |
Dátum: | a mérete állandó, mindig 8 karakter hosszú. (általában hónap/nap/év formában, ami változtatható) Tetszõleges dátumadat tárolására alkalmas. Értelmezettek rajta bizonyos alapműveletek pl. egészszám hozzáadása ill kivonása egy dátumból, vagy dátumok összegének, különbségének meghatározása) |
Logikai | a mérete állandó. Tetszõleges kétértékû adat tárolására. Mérete 1 byte. |
Memo: | mérete nem korlátozott. Tetszõleges karakteres szöveges adat tárolására alkalmas. A felső hatrát a használt szerkesztő határozza meg. Csak adatbázis-állományok mezője lehet ilyen típusú. Az adatbázisban mindig 10 karakternyi helyet foglal el. A tartalo maga külön .dbt kiterjesztésű fájlban tárolódik. |
Tömbhivatkozások: | A tömbök könnyen kezelhetõk. Az általuk lefoglalt helyek automatikusan megszûnnek, amikor már nincs rájuk hivatkozás. |
Egymásba ágyazott tömbök: | A tömbelemek lehetnek egy másik tömb hivatkozásai; ily módon komplex adatszerkezetek hozhatók létre. |
Többdimenziós tömbök: | Az egymásba ágyazott tömbökkel mátrixmodell és komplex többdimenziós tömbök hozhatók létre. A többdimenziós tömb egy elemét a C vagy a Pascal szintaktikája szerint lehet címezni. |
Dinamikus méretezés: | A tömbök dinamikusan növelhetõk illetve csökkenthetõk. |
A tömb, mint függvényérték: | A felhasználó által definiált függvények visszaadott értékei tömbök is lehetnek, melyeket a változók sorozatánál sokkal könnyebb kezelni. |
Konstansokat tartalmazó tömbök: | A tömbök tartalmazhatnak konstans értékeket is. |
Kódblokk: | Egy lefordított forráskód, melyet a Clipper adatként kezel. Hasonló a makróhoz, de annál gyorsabb és hatékonyabb. Más értékekhez hasonlóan a kódblokk értéke átadható egy változónak, vagy paraméterként egy függvénynek, illetve onnan visszaadható. A kódblokk tartalma kiértékelhetõ, ami azt jelenti, hogy a blokkon belüli kódok kiértékelésre kerülnek, az eredmény pedig visszaadódik. A kódblokk blokkparaméterrel deklarálható, amely a függvények és az eljárások formális paramétereihez hasonló. |
NIL: | Ez az érték automatikusan átadódik minden olyan változónak (kivéve a public változókat), amelyek kezdeti értékadását nem hajtottuk végre. Ugyanígy, ha egy eljárásban vagy függvényhívás során elmulasztottuk a paraméterek definiálását, ezek helyén automatikusan NIL jelenik meg. |
Character: | max 254 hosszú szöveg (1 byte/karakter) |
Currency: | pénzösszegek (8 byte, - 922337203685477.5807-tõl 922337203685477.5807-ig) |
Date: | dátum, dátumformázó segédfüggvények adottak (8 byte) |
DateTime: | dátum és idõ, formázó segédfüggvények adottak (8 byte) |
Logical: | boolean érték: .T., .F. (1 byte) |
Numeric: | egész vagy tört értékek, - .9999999999E+19-tõl .9999999999E+20-ig (8 byte memóriában, max 20 byte adattáblában) |
Variant: | bármilyen értéket tárolhat, a NULL értéket is (referencia) |
Double: | dupla pontosságú lebegõpontos érték, +/-4.94065645841247E-324-tõl +/-8.9884656743115E307-ig (8 byte) |
Float: | ugyanaz, mint a Numeric |
General: | referencia OLE objektumra (4 byte) |
Integer: | egész érték, -2147483647-tõl 2147483647-ig (4 byte) |
Memo: | referencia adatblokkra (4 byte) |
A#command és a #translate között a különbség annyi, hogy a #command direktíva az illesztést csak teljes utasítás esetén végzi el, míg a #translate részutasítások esetében is.
A #command és a #translate hatóköre megegyezik a #define hatókörével: a definíció csak az aktuális program (.prg) állományban érvényes a megadás helyétõl az állomány végéig, kivéve, ha a definiálás az STD.CH-ban történt, vagy ha a fordítási parancshoz a /U paramétert is megadtuk. A #define-nal ellentétben, sem a #command sem a #translate definíciót nem lehet explicit módon definiálatlanul hagyni, és az #undef direktíva sincs hatással rájuk.
Megjegyzés: a#define különbséget tesz a kis- és nagybetûk között, ellentétben a #command és a #translate azonosítóival.
A #define direktíva alapvetõ felhasználási területei:Az alábbi direktívák a Clipperhez hasonlóan használhatók:
#DEFINE ... #UNDEF #IF ... #ENDIF #IFDEF | #IFNDEF ... #ENDIF #INCLUDE A fentieken kívül az alábbi két új lehetõség van a FoxProban: #INSERT < filename > -> Behelyez egy textfájlt egy generált menüfájlba #NAME < name > -> Képernyõ- és menügeneráló direktívaVáltozók bárhol deklarálhatók a programban, egyszerűen azzal, hogy értéket adunk neki.
Egy változónak nincs fix típusa, ezért mindig olyan típusú, amilyen értéket utoljára kapott,
tehát egy változó típusa változhat a program futása közben.
Mezőnév:
Mezőtípus: (a definiáláskor egyetlen betű)
Mezőszélesség:
Mezőben tárolni kívánt karakterek vagy számjegyek száma.A nyelv sok standard szót definiál, ezek használhatók változónevekként is.
A változónevek nem kis-nagybetû érzékenyek.
Változót "deklarálhatok" a következõ utasításokkal:
Használhatók a Clipper lehetõségei, valamint bevezettek egy új deklarációt:
REGIONAL: Olyan változót deklarál melynek élettartama az adott
régió, tehát a régió végén megszûnik. (A régió egy eljárás egy része.)
'+' |
konkatenáció |
'-' |
konkatenáció, a két karakterlánc közti szóközök a lánc végére kerülnek |
'$' |
részkarakterlánc keresése |
AT ( Kkif1 , Kkif2 ) |
visszaadja azt a pozíciót, ahonnan kezdve kif1 eloször elofordul a kif2-ben |
LOWER ( Kkif ) |
a karakterlánc kisbetussé alakítása |
UPPER ( Kkif ) |
a karakterlánc nagybetussé alakítása |
LEFT ( Kkif , Nkif ) |
a Kkif karakterlánc elejérol Nkif számú karakter kiemelése |
RIGHT ( KKif1 , NKif ) |
a Kkif karakterlánc végérol Nkif számú karakter kiemelése |
SPACE ( N ) |
N hosszúságú, szóközökkel feltöltött karakterlánc |
LTRIM ( Kkif ) |
vezeto (a Kkif elején álló) szóközök levágása a karakterláncról |
RTRIM ( Kkif ) |
követo (a Kkif végén álló) szóközök levágása a karakterláncról |
STUFF ( Kkif2 , poz , hossz , KKif2 ) |
a Kkif1 karakterlánc, poz helyen kezdodo, hossz hosszúságú részkarakterláncának kicserélése a Kkif2 karakterláncra |
SUBSTR ( Kkif , poz , [ hossz ] ) |
a Kkif karakterlánc poz helyen kezdodo, megadható hosszúságú ([hossz]) részkarakterláncának kiválasztása |
TRANSFORM( kif , maszk ) |
adottformátumú mejelenítése a kif-nek |
REPLICATE( Kkif , N ) |
adot KKif N-szer való ismétlése |
'=' |
értékadás és egyenloségvizsgálat, a környezettol függoen |
'<' |
kisebb, mint |
'>' |
nagyobb, mint |
'<=' |
kisebb vagy egyenlo, mint |
'>=' |
nagyobb vagy egyenlo, mint |
'#' vagy '<>' |
nem egyenlo |
'-' |
kivonás |
'+' |
összeadás |
'**' vagy '^' |
hatványozás |
'*' |
szorzás |
'/' |
osztás |
'()' |
csoportosítás |
ABS (N ) |
abszolút érték |
EXP ( N ) |
exponenciális (e^N) |
INT ( N ) |
egészrész |
LOG ( N ) |
e alapú logaritmus |
MAX ( N1 , N2 ) |
a két kifejezés maximuma |
MIN ( N1 , N2 ) |
a két kifejezés minimuma |
MOD ( N1 ,N2 ) |
a két kifejezés osztási maradéka |
ROUND ( Nkif ,n ) |
n darab tizedesjegyre kerekítés (n<0 esetén az egész helyiértékekre kerekít) |
SQRT ( N ) |
négyzetgyökvonás |
Minden, a numerikus típusnál felsorolt összehasonlító muvelet és az értékadás használható.
DATE() |
az aktuális dátum, a DATE környezeti paraméter által meghatározott formátumban |
CDOW ( < Dkif > ) |
a hét napjának megnevezése |
CMONTH ( < Dkif > ) |
a naptári hónap megnevezése |
DAY () |
a hónap napja számmal |
DOW ( < Dkif > ) |
a hét napja számmal |
MONTH ( < Dkif > ) |
az év hónapja számmal |
TIME () |
az eperációs rendszer ideje |
YEAR ( < Dkif > ) |
a < Dkif > évszáma évszázaddal |
'.NOT.' |
negáció |
'.AND.' |
logikai ÉS |
'.OR.' |
logikai VAGY |
'.XOR.' |
logikai KIZÁRÓ VAGY (csak FoxPro, Clipper, illetve a dBase IV. és késõbbi verziók) |
A fentieken kívül a Clipperben a következõ új és kibõvített funkciójú operátorok jelentek meg:
A fix hosszúságú értékek tárolására a karakteres változókat alkalmazzuk.
A változók egyes karakterei a CHR(32)-CHR(126), valamint CHR(128)-CHR(255), illetve a CHR(0) értékeket tartalmazhatják.
A karakteres változók értékét aposztrófok, idézõjelek vagy szögletes zárójelek között kell megadni.
A karakteres változó nulla értéke a két határolójel egymás utáni megadása jelenti.
= : |
összehasonlítás egyezõség szerint |
= = : |
összehasonlítás a teljes azonosság szerint |
!= , <> vagy #: |
összehasonlítás a nem egyezés szerint |
< : |
összehasonlítás a kisebb érték szerint |
<= : |
a kisebb vagy egyenlõ érték |
> : |
összehasonlítás a nagyobb érték szerint |
>= : |
a nagyobb vagy egyenlõ érték |
= vagy STORE : |
értékadás |
:= : |
azonnali (in-line) értékadás |
+= : |
azonnali összekapcsolás (+) és értékadás |
-= : |
azonnali összekapcsolás (-) és értékadás |
$ : |
részkaraktersorozat keresése (mi miben) |
REPLACE: |
mezõérték átírása |
ALLTRIM: |
szóközök levágása elölrõl és hátulról |
ASC: |
az ASCII kód meghatározása |
CTOD: |
dátumtípusra konvertálás |
EMPTY: |
üres érték vizsgálata |
LEN: |
a karaktersorozat hossza |
PADC: |
középre igazítás |
PADL: |
jobbra igazítás (feltöltés balról) |
PADR: |
balra igazítás (feltöltés jobbról) |
SPACE: |
üres karaktersorozat létrehozása |
VAL: |
numerikus típusra konvertálás |
Numerikus típusúnak azokat az adatokat definiáljuk, melyekkel matematikai mûveleteket kívánunk végezni.
A Clipper a numerikus adattípusban a számjegyeket, a tizedes pontot, valamint a plusz és a mínusz elõjelet engedi meg.
A Clipper a numerikus értékeket az IEEE szabvány szerinti duplapontosságú lebegõpontos formátumban tárolja a megengedett 10^(-308) és 10^(308) közötti tartományban. A pontosság 16
értékes tizedesjegy, a numerikus értékek képernyõn történõ megjelenítése 32 jegyig lehetséges.
A 32-nél több jegybõl álló számok megjelenítése explicit módon történik: a 16 értékes tizedesjegy és a 10 megfelelõ hatványkitevõjének megadásával.
Fontos: A karakteres változókkal ellentétben a numerikus típusú változókat nem kell határolójelek közé tenni. Ha mégis így teszünk, akkor karakteres típusként veszi figyelembe.
% : |
modulo |
++ : |
növelés |
-- : |
csökkentés |
= vagy = = : |
egyenlõség vizsgálata |
!= : |
nem egyenlõ |
STORE : |
értékadás |
:= : |
azonnali (in-line) értékadás |
+= : |
azonnali összeadás és értékadás |
-= : |
azonnali kivonás és értékadás |
*= : |
azonnali szorzás és értékadás |
/= : |
azonnali osztás és értékadás |
**= vagy ^= : |
azonnali hatványozás és értékadás |
%= : |
azonnali moduloképzés és értékadás |
REPLACE : |
a mezõérték módosítása |
CHR : |
az ASCII érték karakteresre konvertálása |
EMPTY : |
a nulla érték ellenõrzése |
STR : |
karakteresre konvertálás |
A dátum típusú változókkal egy naptári dátum azonosítható. Az alapértelmezés az amerikai dátumforma: hh/nn/[cc]ee. A dátumbeli elválasztójelek a SET DATE paranccsal állíthatók be, illetve változtathatók. A Clipper minden helyes dátumot elfogad 0100.01.01. és 2999.12.31. között, illetve értelmezi az üres dátumkifejezést is. A rendezés kronologikus a dátumformától függetlenül. A dátumtípusú változókkal történõ számolásokhoz a dátumkifejezést numerikus formára kell konvertálni a CTOD() függvénnyel. A zárójelen belüli dátumot idézõjelek, aposztrófok vagy szögletes zárójelek közé kell tenni.
EMPTY(): |
üres érték vizsgálata |
DAY(): |
a nap sorszámának meghatározása |
MONTH(): |
a hónap sorszámának meghatározása |
YEAR(): |
az év meghatározása (beleértve az évszázadot is) |
DOW(): |
a nap sorszáma a héten belül |
CDOW(): |
a hét napjának szöveges meghatározása (angolul) |
CMONTH(): |
a hónap szöveges meghatározása (angolul) |
Logikai típusú az az adat, amely a Boole-algebra szerinti értéket hordoz, ami lehet: igaz, hamis; igen, nem vagy on, off.
Ezeknek megfelelõen az értékek valamelyike lehet: igaz - y, Y, t, T; vagy hamis - n, N, f, F.
Rendezéskor a hamis érték mindig kisebb mint az igaz érték.
= vagy = =: |
egyenlõség vizsgálata |
!=, <> vagy # : |
nem egyenlõség vizsgálata. |
A memo változók lényegében változó hosszúságú karakteres adatok.
A memo mezõk az adatbázishoz kapcsolódnak, abból 10 karaktert foglalnak el. Ezt pointerként használják az aktuális adat eléréséhez, amely egy .dbt állományban helyezkedik el.
Mivel a memo mezõk lényegében karakteres mezõk, így rájuk a karakteres mezõkre vonatkozó elõírások érvényesek, például hosszuk 65535 karakter lehet, két memo mezõ összehasonlítása is a karakteres
típusnál ismertetett módon megy végbe, illetve alkalmazható az összes karakteres mûvelet.
Mivel memo típusú csak mezõ lehet, ezért karaktersorozatos megfelelõje nincs.
Ugyanakkor karaktersorozat, mint érték megadható egy REPLACE paranccsal a memo mezõ számára.
HARDCR : |
a lágy kocsivissza jel (CR) keményre cserélése |
MEMOEDIT : |
tartalom szerkesztése |
MEMOLINE : |
a szöveg egy sorának kiemelése |
MEMOREAD : |
olvasás egy lemezállományból |
MEMOTRAN : |
a CR-jelek kihagyása |
MEMOWRIT : |
lemezre írás |
MLCOUNT : |
sorok számlálása |
MLPOS : |
sorpozíció meghatározása |
A NIL az 5.0 verzióban bevezetett új típus.
Szükségességét az indokolta, hogy a nem deklarált adatok ne vezessenek hibajelzéshez.
Tetszõleges adattípus esetén alkalmazható, formája: NIL. Változó deklarálásakor automatikusan megkapja ezt az értéket.
= vagy == : |
egyezõség vizsgálata |
!= , <> vagy # : |
nem-egyezõség vizsgálata |
< : |
összehasonlítás kisebb érték szerint |
<= : |
a kisebb vagy egyenlõ érték |
> : |
összehasonlítás nagyobb érték szerint |
>= : |
a nagyobb vagy egyenlõ érték |
= vagy STORE : |
értékadás |
:= : |
azonnali (in-line) értékadás egy nem mezõ változónak |
EMPTY: |
a NIL érték vizsgálata |
A Clipper 5.0 egy teljesen új - adattípusok közé sorolható - eleme.
Lényegében a futtatható program egy részének áthelyezése egy másik helyre.
Felfogható úgy is, mint egy név nélküli függvényértékadás, mivel a Clipper a kódblokkot értékként kezeli.
A kódblokkok nagyon hasonlóak a makrókhoz, de lényeges különbség van köztük. A makrók olyan karaktersorozatok, melyek futás ideje alatt jönnek létre, míg a kódblokkok a fordítás ideje alatt.
A kódblokkok jóval rugalmasabbak, és hatékonyabbak, hiszen például makróval nem lehet static vagy local változó értékét illetve paraméterértéket továbbítani.
Definiálása:
{ | [ < argumentumlista > ] | < kifejezéslista > }
ahol az argumentumlista használata és szabályai megegyeznek a függvények és eljárások argumentumlistájánál írtakka,
a kifejezéseknek helyes Clipper kifejezéseknek kell lenniük, és nem tartalmazhatnak deklarációs vagy ciklus utasításokat.
A kódblokkot közrezáró függõleges vonalból mindig egy párnak kell lennie, ellenkezõ esetben a Clipper a kapcsos zárójelek között megadottakat tömbnek adott értékadásnak tekinti.
= : |
értékadás |
= : |
azonnali (in-line) értékadás |
AEVAL : |
tömbelemek blokkba másolása |
DBEVAL : |
munkaterület rekordjainak blokkba másolása |
EVAL : |
értékmeghatározás kódblokk segítségével |
A kódblokkok lényegében egysoros függvénynek is felfoghatók.
Használatuk az EVAL() függvénnyel lehetséges, ebben két paramétert kell megadni: az elsõ a blokk neve, a második a bemeneti érték.
A visszaadott érték a kódblokk szerinti érték.
Például:
A kódblokkok hatóköre arra a függvényre vagy eljárásra terjed ki, amelyben azt létrehozták.
A kódblokk olyan speciális adattípus, amely végrehajtható programkódot tartalmaz. Kiválóan alkalmazható olyan "fekete doboz" függvények esetében, amelyeknél nem tudjuk a visszaadott érték típusát meghatározni.
A kódblokkok nem írhatók át direkt módon adatbázisba.
Ha egy kódblokkot adatbázisba kívánunk helyezni, hogy késõbb fel tudjuk használni az értékét, akkor a következõ módon járhatunk el:
USE Sue NEW /* Egy karakteres mezõ feltöltése a kódblokkot hordozó karaktersorozattal */ APPEND BLANK REPLACE blokkmezo WITH "{|| Ertek()}" ... // A blokk felhasználása egy késõbbi alkalommal sajatblokk := &(blokkmezo) EVAL(sajatblokk)
Megjegyzés: A fenti példában nem alkalmazhattuk egy lépésben az EVAL ( & ( blokkmezo ) ) formát, mivel a fordító egyszerre csak egy fordítási lépést hajt végre, ezért ez nem vezetne helyes eredményre.
Tömbnek nevezzük az azonos nevû változók együttesét, melynek elemeit indexeikkel érhetjük el.
Az egyes elemek tetszõleges adattípusúak lehetnek - a memo típus kivételével, amely egy különleges mezõtípusnak számít.
Az elemek egy tömbön belül eltérõ típusúak is lehetnek, elemként tartalmazhatnak másik tömböt, vagy kódblokkot is.
A tömbök egy azonosítóból és az ezt követõ szögletes zárójelek közé írt egy vagy több számból állnak.
A szögletes zárójel a tömbdefiníció része, kötelezõ megadni!
A tömbnek legalább egy dimenzióval kell rendelkeznie.
A többdimenziós tömbök kétféleképpen adhatók meg:
< azonosító > [ < elem1 > , < elem2 > , ... ] < azonosító > [ < elem1 > ] [ < elem2 > ] ...
A dimenziók mérete dinamikusan deklarálható.
Egy tömb létrehozható az ARRAY, DBSTRUCT, DIRECTORY függvények segítségével is.
A tömbelemek címzése a tömb nevével és indexével történik, ugyanakkor mind a név, mind az index helyén állhat olyan kifejezés, amely a megfelelõ azonosítást biztosítja.
A tömbök elemei számára egyidejûleg értéket csak a deklaráláskor tudunk adni (egyidejûleg ekkor is csak NIL értéket), illetve ehhez a megfelelõ függvényeket kell alkalmazni.
A speciális tömbkezelõ függvények közül az ARRAY() a NIL értékkel, a DBSTRUCT() az adatbázis szerkezetével, a DIRECTORY() a lemezkönyvtár információival tölti fel (a létrehozással egyidejûleg) a tömbelemeket.
Az AFILL() függvény segítségével a teljes tömb, vagy annak megadott részei kaphatnak egyidejûleg értéket, például az elsõ tíz elem az 1, a második tíz elem a 2 értéket kapja:
AFILL(tomb, 1, 1, 10) AFILL(tomb, 2, 11, 10)
A tömbök - nevükkel való hivatkozással - függvényargumentumként szerepeltethetõk, illetve azok visszaadott értékei lehetnek.
A tömbök mérete menet közben növelhetõ és csökkenthetõ az ASIZE() függvénnyel. A tömbméretének növelését eredményezi az AADD() függvény is, ezzel elem adható a tömb végéhez.
A tömbök mérete meghatározható a LEN() függvény segítségével.
Többdimenziós tömb esetén a függvény az elsõ index szerinti értéket adja vissza (ennek az a magyarázata, hogy a többdimenziós tömböket a Clipper "altömbökként" kezeli, ezért ha a
következõ dimenzió méretére vagyunk kíváncsiak, akkor az elsõ elemre hivatkozással kérdezzük le a hosszt).
Két tömb összehasonlítása az == operátorral lehetséges.
Ugyanakkor ezzel a módszerrel két tömb csak akkor bizonyul azonosnak, ha a memóriában azonos címen találhatók.
(Az = operator nem alkalmazható tömbök összehasonlítására)
Tömbelem beszúrását az ADEL illetve az AINS függvényekkel végezhetjük el.
Az elõbbi úgy törli a megadott indexû elemet, hogy minden elemet egyel balra tol, az utolsó elem pedig a NIL értéket veszi fel.
Az AINS pedig a megadott helyre beszúr egy NIL értékû elemet, az utolsó elem pedig elvész.
Az elemek az ACOPY függvénnyel másolhatók illetve az ACLONE függvénnyel duplikálhatók. Az elõbbi a tömb elemeinek értékét másolja másik tömbbe, míg az utóbbi a meglévõ tömb egészérõl készít másolatot.
ASORT(): ezzel a függvénnyel a tömb összes eleme, vagy annak meghatározott része nagyság szerint sorbarendezhetõ. ASCAN(): tömbelemek értéke szerinti keresés. (kis és nagybetûk között különbséget tesz)
A Foxproban használhatók a DBase lehetõségei.