Avancerede variable
- Orange_Newton skrev denne artikel Tirsdag, 18 Juli 2006
Forudsætninger: Forståelse af de grundlæggende variabeltyper (int,float,char) er nok smart.
Vi har allerede set på variable som int og float, men disse udgøre ikke det totale fundament der er nødvendig for at forstå de lidt mere avancerede tutorials om vinduer. Så selvom avancerede variable er en niveau 3 tutorial skal den ikke bruges før niveau 8, du kan altså spring det over for nu hvis du vil, og hvem ved måske forstår du automatisk de ekstra småting når du løber ind i dem. Variabel erklæringer bliver nogle gange udvidet med ekstra ord, f.eks. long unsigned int, eller static float. Disse ord har en betydning og jeg vil gennemgå dem jeg kender her:

const er en måde at definere konstanter på, en const variabel kan ikke ændres efter den er erklæret, const kan også bruges i forbindelse med funktionskald til at beskytte pointere, f.eks. er strcpy erklæret så andet argument er const, strcpy funktionen kan på den måde ikke ændre array nr. 2.

long og short kan sættes foran int, på den måde kan man holde størrer eller mindre tal i en int fordi den tager mere eller mindre hukommelse, de precise tal for hvor meget de tager er mellem nogle grænser som almindelige mennesker ikke render og husker på, har man behov for at vide hvor mange byte en varibel tager bruger man sizeof, f.eks. sizeof(long int), som vil returnere hvor stor en long int er. Benyttes dette på arrays kan man beregne et arrays længe som sizeof(array)/sizeof(*array), smart ik’?

long long * en endnu længere udgave af int som dog altid er en pointer, jeg ved ikke helt hvad den skal bruges til, der er bedre måder at få store ints på, se længere nede :-).

unsigned indikerer at en int eller char ikke skal tage højde for negative tal, på den måde ændrer man eksempelvis char til at ligge mellem 0 og 255 i stedet for -128 til 127. Vil man vide hvor store tal en char eller int kan holde kan man bruge sizeof tricket eller nogle indbyggede konstanter fra limits.h:
CHAR_MIN, CHAR_MAX, UCHAR_MAX, SHRT_MIN, SHRT_MAX, USHRT_MAX, INT_MIN, INT_MAX, UINT_MAX, LONG_MIN, LONG_MAX, ULONG_MAX, LLONG_MIN, LLONG_MAX, ULLONG_MAX.
LLONG er long long * variabler hvis nogen er intereseret i dem, og de andre er rimeligt indlysende.
Bemærk at der er uenighed om hvorvidt en char er signed eller unsigned som standard. Man kan derfor vælge at erklære dem som signed hvis man vil være sikker. I dette tilfælde fides der også SCHAR udgaver af MIN og MAX og CHAR udgaven af MIN giver naturligvis 0.

volatile indikerer en variabel der kan ændre værdi uventet mens programmet kører, det kunne være et tilsluttet måleapparat som a mystiske årsager har direkte adgang til dine ram (hvis du faktisk overvejer det som en mulighed er der noget galt). Ellers ved jeg ikke hvad den skal bruges til, den tekniske forklaring på hvorfor den er nødvendig hænger sammen med registre og optimering, den ligger lidt udenfor den nødvendige viden og er mere sådan en gang blæret nørdsnak man lige kan fyre af når man bliver træt af folk.

static er en variabel der beholdes af en funktion selvom funktionen er afslutet, så næste gang funktionen køres er den der stadig, dette kan bruges til funktioner der skal returnere et array eller til funktioner der skal vide hvor mange gange de er kaldt, et glimrende skridt frem mod elliminering af globale variable hvor disse er et problem (mere end 10 globale variable i et program er som regel tegn på at der kunne blive problemer (medmindre det er 1-mands projekt)).

extern er en af de rigtigt gode, den indikerer at variablen er erklæret et andet sted og derfor er gyldig i programmet, dette kan give nogle frygtelige linking problemer og fuldstændige usynlige bugs. Det er nok bedst at tage den slags sammen med dll filer. For nu er det nok at vide at det er muligt at koble flere programmer sammen med magisk lim :-).

Hvis man har behov for at benytte en speciel type ofte f.eks long unsigned int og ikke gider skrive den hele kan man bruge typedef, f.eks. kan linien:
typedef unsigned long int uli;
gøre så an bare kan skrive uli i stedet, de virklige fordele ved det kommer når man laver pointere til funktioner, der kan de virkelig hjælpe til at gøre det hele overskueligt.

Jeg tror det er de gængse prefix. Men ikke alt er prefix, der findes også mange typer af variable, bl.a. lovede jeg en størrer int, i stdint.h kan man finde intN_t variablerne, hvor N er et tal, som standard skal 8, 16, 32 og 64 være implementeret for at opfylde ANSI C99 standarden, og det gør de fleste compilere i dag. Af denne årsag er int64_t som regel den største int man har adgang til den er 64 bit lang, og man kan skrive u foran hvis man vil have den unsigned, altså uint64_t INT64_MIN, INT64_MAX og UINT64_MAX findes naturligvis også i stdint.h. I ANSI C99 standarden er der også noget der hedder wide char eller wchar_t, hvis man er fornuftig bruger man dem i stedet for char, da disse er unicode i stedet for ASCII, på den måde risikerer man ikke at mangle specielle tegn. Hvis man har en streng man vil have i wchar_t format skriver man L foran ””, så L”Hello World” er en wchar_t udgave af ”Hello World”. Man kan også sætte L og U og ULL osv. efter tal, for at lave dem til long unsigned eller long long. Normalt hvis man bare skriver et tal i C antager compileren at den skal gemme tallet når der compiles i den mindste integer type det kan stå i. Dette er nogle gange uhensigtsmæssigt da kopiering mellem variable af samme type og størrelse er hurtigere (push, pop osv.).  En sidste note går til double og long double som er længere udgaver af float, disse giver stører præcision og mulighed for at indeholde stører tal og til at fortælle at det er muligt at skrive konstanter i eksponentiel notationsform 2e+4 = 20000 og for de mere nørdede 1p+3 = 8 (dog kun i ANSI C99 standard). Det var alt for denne gang, jeg håber at det ikke har været helt spild af tid, selvom meget af de virkelig bare er avancerede notationsformer uden nogen fornuftig teoretisk begrundelse. (Den er simpel nok i praksis :-D). Som altid er der mulighed for at kontakte mig på admin@AODASoft.net.
AODASoft.net - Allan Asp Olsen & Daniel A un dal.
OBS: Du har begrænset adgang til siden.