KB » Computer » C(++) programmeren

C(++) programmeren

    Tweeten

Introductie


Compiler en linker

BCC32 (Borland)

Je kan deze compiler downloaden.

Na het installeren voeg je de map met de executables (C:\Borland\BCC55\Bin) toe aan het pad.

De compiler en linker moeten ook include files en library files kunnen vinden. Die info wil je niet steeds meegeven als je de compiler aanroept, dus zet je het in een configuratiebestand.

De config file heeft extensie CFG, en kan je het beste of in de map met executables, of in de map met de te compileren programma's zetten. Als je ook de naam van het configuratiebestand niet steeds wil hoeven opgeven noem je het BCC32.CFG

In dit bestand zet je o.a. de volgende 2 regels:
-Ic:\Borland\BCC32\Include en
-Lc:\Borland\BCC32\Lib

Foutmeldingen

Fatal: Unable to open file 'C0W32.OBJ'
Je moet de map met library files aan de linker opgeven.
Too many types in declaration in function main
Ik gebruikte een type dat blijkbaar niet bestaat. Dat gebeurde in het volgende statement: printf( "\nA long long is %d bytes\n", sizeof( long long));
Unable to open include file 'stdio.h'
Je moet de map met include files aan de linker opgeven.

Declaraties

Variabelen

Van klein naar groot heb je de volgende types voor gehele getallen: (unsigned) char, (unsigned) int, (unsigned) short en (unsigned) long.

Voor niet gehele getallen heb je float en double.

Er is ook een indeling gebaseerd op gebruik van storage, nl. global, static, local of auto en register. En je hebt ook nog thread local storage.

Een local of automatic variabele is een variabele die gedeclareerd is in een functie, en daarbuiten niet zichtbaar is.

Een global variabele is er 1 die buiten functies gedeclareerd wordt.

Om een static variabele te declareren moet je het keyword static voor het type zetten. Een static variabele wordt 1 keer geïnitialiseerd, maar behoudt ook buiten de functie waarin hij gedeclareerd is zijn waarde.

Een register variabele zal indien mogelijk in een CPU register gezet worden. Ook hier moet je het keyword register voor het type zetten.

Een declaratie ziet er als volgt uit:
type var [= waarde];

Je kan meerdere variabelen op 1 regel declareren, en ze scheiden door een komma.

Voorbeelden:
int teller=0;
double procent = 0.34;
unsigned int a, b, c;

Constantes

Ik heb het hier alleen over symbolische constantes (i.t.t. tot literal constants, constante waardes die in het programma voorkomen). Deze kan je op 2 manieren declareren.

De 1e is met een #define
De algemene structuur is: #define CONSTNAAM waarde
Voorbeeld: #define PI 3.14

De 2e is met het keyword const
De algemene structuur is: const type constnaam = waarde
Voorbeeld: const int teller = 100


Operators

Complexe operators

Conditional operator

De syntax is exp1 ? exp2 : exp3

Als exp1 waar is heeft het geheel de waarde van exp2, anders die van exp3

Zo zou je bv. kunnen kijken welke van 2 variabelen de laagste waarde heeft, en die dan aan een derde kunnen toekennen: c = (a < b)? a : b;
Dit is equivalent aan if (a < b) c = a; else c = b;

Komma operator


Functies

Definitie en prototype

Voor je een functie definieert, moet je hem declareren. Dat heet een prototype.

Het prototype ziet er precies zo uit als de 1e regel van de functiedefinitie, met 1 verschil: er staan een ';' aan het eind.

Vbd.: int multiply(int x, int y);

Resultaat van een functie

Als je wilt dat de functie een resultaat teruggeeft zet je het type daarvan voor de naam van de functie (zoals de 1e 'int' hierboven).

In de functie moet in dat geval een return expr staan, waarbij de expressie hetzelfde type heeft.

De uitwerking van een functie kan natuurlijk ook zijn dat hij bv. iets afdrukt. In dat geval kan je als resultaattype void gebruiken.

Tip: je kan het beste maar 1 return in een functie gebruiken.

De functie main hoeft niet perse aan het begin van het programma te staan, maar het is wel gebruikelijk.

Parameters en argumenten

Parameters zijn de dingen die tussen haakjes in de functie definitie of prototype staan.

Argumenten zijn de waardes die je daadwerkelijk meegeeft als je een functie aanroept.


Control statements

Het for statement is het beste als je in de loop een teller moet veranderen (of iets soortgelijks) en vooraf iets moet initialiseren.

De do... while is handig als je een statement minimaal 1 keer moet uitvoeren.

Je kan de loops wel binnen elkaar gebruiken, maar niet overlappen. Dus dat je loop1 begint, binnen loop1 ook loop2 begint, dan loop1 eindigt, en dan pas loop2 eindigt.

For statement

for (initialisatie; conditie; increment) statement;

Eerst wordt de initialisatie uitgevoerd. Vervolgens wordt de conditie getest. Als ie waar is wordt het statement uitgevoerd, en wordt tenslotte increment uitgevoerd. Daarna wordt de conditie opnieuw getest, etc.

Vbd.: het afdrukken van de getallen 1 t/m 10:

for (cnt = 1; cnt <= 10; cnt++) printf("%d\n", cnt);

While statement

while (conditie) statement;

Het while statement is in feit een simpele vorm van het for statement.

Het do... while statement

do statement while (conditie)

In deze constructie wordt in tegenstelling tot de andere 2 het statement minimaal 1 keer uitgevoerd.


Invoer en uitvoer

De belangrijkste functies zijn printf (print formatted) en puts (put string) voor uitvoer, en scanf (scan formatted) en gets (get string) voor invoer.

Om deze functies te gebruiken moet je aan het begin van je programma de regel
#include stdio.h
opnemen. Dit is het bestand met de prototypes van deze functies.

Format specifiers

In printf en scanf is de 1e parameter een string met format specifiers. In deze string is van elke volgende parameter het type vermeld.

De format specifier begint met %, en je hebt de volgende mogelijkheden:

Puts

Deze functie drukt gewoon een string af, met een newline aan het eind.

Gets

Printf

Voorbeeld: printf("Het product van %d en %d is: %ld\n", x, y, x*y);

Scanf

In tegenstelling tot printf moeten de 2e en volgende parameters niet bestaan uit variabelen (of expressies), maar uit adressen van de variabelen waarin de invoer moet worden opgeslagen.

Voorbeeld: scanf(Voer 2 getallen in om met elkaar te vermenigvuldigen: %d %d", &x, &y);

De scheiding tussen verschillende in te voeren waardes moet bestaan uit "white space". Alles waar geen tekens staan is white space, dus het gaat spaties maar ook newlines.

2 in te voeren waardes kan je dus scheiden door een willekeurig aantal spaties, maar je kan ze ook op verschillende regels zetten, desnoods met een aantal lege ertussen.


Arrays

Declaratie

Een gewone array (met bv. gehele getallen) declareer je als volgt: int array[30];

Deze array heeft 30 elementen, genummerd van 0..29

Een meerdimensionale array declareer je als volgt: int array[12][31];
(als je bv. een element wilt hebben voor elke dag van het jaar, geindexeerd op maand en dag).

Veel compilers staan niet toe dat je in de definitie een constante als index gebruikt, tenminste als die met een const is gedefiniëerd. #define mag wel.

Initialisatie

Een array initialiseren gaat als volgt: int array[4] = {1, 2, 3, 4};

Een meerdimensionale array kan je zo initialiseren:
int array[2][3] = {1, 2, 3, 4, 5, 6};
of zo:
int array[2][3] = {{1, 2, 3}, {4, 5, 6}};

Als je te weinig waarden opgeeft blijven er gewoon een aantal elementen van de array in ongedefinieerde staat.


Pointers

Een pointer definieer je als volgt: int *xptr
xptr is de naam van de pointer, int het type.

En zo geef je hem een waarde:
int x;
xptr = &x;

De variabele (pointer) xptr bevat nu het adres van variabele x

In dit stadium refereren &x en xptr beide aan het adres van x, en x en *xptr beide aan de waarde van x

Pointers en arrays


Aandachtspunten

Expressies hebben een waarde

Een statement als x = 5
kent aan de variabele x de waarde 5 toe.

Maar de expressie als geheel heeft ook de waarde 5. Je kan dus ook het volgende statement maken: y = x = 5
(y krijgt ook de waarde 5)

De expressie x == 5 heeft de waarde 0 of 1

False of true (onwaar of waar)

Elke waarde ongelijk aan 0 is waar, de waarde 0 is onwaar.

Array index

De laagste index in een array is 0.

Als je een array van 500 elementen declareert, loopt de index range van 0 t/m 499.


Troubleshooting

Syntax

In geval van syntaxfouten, kan je het beste eerst checken of alle haakjes (zowel de gewone, als de curly braces (zoals '}') in balans zijn.

Een andere, veel voorkomende, fout is het ontbreken van een ';' (semicolon, puntkomma) aan het eind van een statement.

Verder kan je checken of alle variabelen gedeclareerd zijn. Daarbij moet je bedenken dat C(++) case sensitive is!!!



    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 18-01-18 18:57:50