#Klooienmetcomputers

Structuur graag!

Arnout van Kempen over rommelen in een digitale wereld.

Hoewel programmeren in C nogal dicht op de computer zit en daardoor nogal rommelig kan lijken voor menselijke hersens, kent C wel degelijk allerlei manieren om structuur aan te brengen. Zo kan je in C gegevens bundelen in een struct, een data-structuur waarbij je verschillende attributen van eenzelfde object samen kan voegen tot één datatype.

Stel bijvoorbeeld dat je gegevens over een bewoner van je huis wil vastleggen: een naam en een leeftijd. Deze bewoner is een persoon, en wellicht wil je nog wel van meer personen dezelfde gegevens vastleggen. Dan definieer je eerst het data-type struct Persoon met de attributen naam en leeftijd. Vervolgens kan je variabelen van het type struct Persoon declareren.

Dat ziet er dan als volgt uit:

struct Persoon {
     char naam[30];
     int leeftijd;
};

int main()
{
     struct Persoon bewoner;

Je zal daarbij altijd in de gaten moeten houden dat C geen string-type kent, alleen een array van characters.  Je kan dus niet simpelweg zeggen naam = “Kees Jansen”. In de header string.h zijn gelukkig functies beschikbaar waarmee je dit simpel kan oplossen. Ons programmaatje gaat dus als volgt verder:

     strcpy(bewoner.naam, “Kees Jansen”);
     bewoner.leeftijd=76;

Het definiëren van een struct-type kan iets eleganter, door gebruik te maken van typedef. Hierbij kunnen we in de variabele-declaratie de term struct achterwege laten. Let wel op dat de naam van de struct nu niet voor de attributen komt, maar er na. Stel dat Kees Jansen twee huisdieren heeft, en we willen vastleggen of het honden zijn of niet, dan zou je dat als volgt kunnen doen:

typedef struct {
     char naam[30];
     bool hond;
} Huisdier;

int main()
{
     Huisdier dier[2];

     strcpy(dier[0].naam, “Bello”);
     dier[0].hond=true;

     strcpy(dier[1].naam, “Blub”);
     dier[1].hond=false;

De functie strcpy() komt uit string.h en kent als argumenten een tweetal strings, arrays van characters dus. Daarom komen er geen vierkante haken achter .naam. Maar we hebben hier ook een array van het type Huisdier gedeclareerd, dus achter dier[] komen wel vierkante haken, en het volgnummer uit de array.

Verder zit hier nog een extra header in, stdbool.h, waarin true en false zijn gedefinieerd. Dat is niet nodig, maar het maakt code wel net iets leesbaarder.

Met het gebruik van struct kunnen we dus data-elementen groeperen en aan één variabele toekennen. Data-elementen van de struct mogen ook arrays zijn en variabelen van het struct-type mogen zelf ook weer arrays zijn. De elementen van de struct kunnen worden benaderd via .<naam-data-element>. Maar we kunnen ook hele struct variabelen tegelijk benaderen, doorgeven aan functies, pointers naar struct gebruiken, etcetera. De mogelijkheden om zo met kleine foutjes enorme chaos te veroorzaken, nemen nu wel snel toe. En als we daar nog dynamische geheugen-allocatie aan toevoegen is het feest al snel compleet. Dat gaan we dus hierna zeker doen.

Op GitHub staat de hier gebruikte code in een werkend programmaatje, dat ons alles vertelt over Kees Jansen, Bello en Blub.

Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op www.github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.

Arnout van Kempen di CCO CISA is Senior manager Risk & Compliance bij Baker Tilly. Hij schrijft op persoonlijke titel. Hij is lid van de Commissie Financiële verslaggeving & Accountancy van de AFM en lid van de signaleringsraad van de NBA. Daarnaast is hij diaken van het bisdom 's-Hertogenbosch.

Gerelateerd

reacties

Reageren op een artikel kan tot drie maanden na plaatsing. Reageren op dit artikel is daarom niet meer mogelijk.

Aanmelden nieuwsbrief

Ontvang elke werkdag (maandag t/m vrijdag) de laatste nieuwsberichten, opinies en artikelen in uw mailbox.

Bent u NBA-lid? Dan kunt u zich ook aanmelden via uw ledenprofiel op MijnNBA.nl.