#Klooienmetcomputers

Grafieken en gemakzucht

Arnout van Kempen over rommelen in een digitale wereld.

Na het geworstel met JSON wil ik naar XBRL gaan kijken, maar eerst nog een tussenstap: grafieken! Niets zegt immers zoveel als een afbeelding. Standaard heeft C hierin niet zoveel mogelijkheden, zonder dat je meteen naar een heel elementair niveau in je computer moet duiken. En dat is niet echt de bedoeling, dus gaan we wat grafische bibliotheken inroepen. Voor het echt serieuze grafische geweld zal dat waarschijnlijk Qt worden, maar eerst een tussenvorm: de ncurses-bibliotheek. Hiermee krijg je functies beschikbaar die in de terminal, ook via SSH of MOSH, betrekkelijk simpele grafische dingen kunnen doen. Met name het plaatsen van een character op een opgegeven plaats op het scherm. Dat maakt dus vrij simpele grafieken mogelijk.

Maar voor we dat gaan doen, wil ik eerst nog eens wijzen op het waarom van deze rubriek: Accountants en andere hobbyisten, waaronder ikzelf, de middelen laten zien om de computer voor ons karretje te spannen. Alles wat saai en herhaald werk is bijvoorbeeld, kan door de computer worden gedaan. We hebben daar een aantal afleveringen geleden het Make-commando al voor gevonden. Niet meer onthouden hoe je exact een programma moet compileren, maar gewoon make src=source.c exe=programma en de computer linkt daar netjes je eigen standaard-bibliotheek in. Sindsdien heb ik daar nog de json-c bibliotheek aan toegevoegd, en vanaf nu ook de ncurses bibliotheek.

Compileren en linken kan je dus goed automatiseren. Je kan ook het schrijven van je programma wat verder automatiseren. Het is misschien niet opgevallen in de loop van de afleveringen, maar ik merk dat ik in de praktijk geen gebruikmaak van de Geany IDE en beperkt van Runestone, maar vooral van nano. Nano is een simpele en makkelijk te gebruiken tekst-editor. Voor C is het prettig om te starten met een aantal opties:

-i zorgt dat de 'indent' van een tab behouden blijft in de volgende regel
-l geeft 'line numbers', ofwel regelnummering in beeld
-Y c zorgt dat de C-syntax herkend wordt en dankzij kleur extra leesbaar wordt gemaakt.

Je kan dit combineren als volgt: nano -ilY c source.c

Maar het kan nog een tikje handiger. Als je merkt dat je iedere keer dezelfde #include opdrachten moet intypen, altijd main(){ return 0;} moet typen, zou het dan niet handig zijn als de computer dat ook voor je doet? Nano kan zelf niet met templates werken, zoals Geany dat bijvoorbeeld wel kan. Maar hier komt de bash-shell ons te hulp. Je kan een simpel tekstbestandje maken dat uitvoerbare code bevat en dat kan je vervolgens gebruiken als ieder ander programma.

Ik heb een bestand gemaakt, met nano, met de naam writec dat de volgende inhoud heeft:

#!/bin/bash

template_file=“template.c”
new_file=“$1”

if [ -z “$new_file” ]; then
  echo “Geef een naam op voor het nieuwe bestand.”
  exit 1
fi

if [ -f “$new_file” ]; then
  nano -ilY c “$new_file”
else
  cp “template_file” “$new_file”
  nano -ilY c “$new_file”
fi

en met chmod +x writec maak je daar een uitvoerbaar programma van.

De eerste regel die begint met #! heet 'de shebang' en vertelt welke interpreter het script moet uitvoeren. Je kan dat gebruiken om een Python-programma uitvoerbaar te maken door simpelweg de naam van het bestand te geven, maar dus ook zoals hier om een Bash-script uitvoerbaar te maken.

Vervolgens worden twee variabelen gemaakt, een om de template-file die je gaat gebruiken te benoemen en een die verwijst naar het eerste argument na writec. Getest wordt of je wel een argument hebt opgegeven. En als dat zo is wordt ofwel dat bestand geopend met nano, of als het nog niet bestond, wordt eerst een kopie van je template gemaakt om vervolgens alsnog nano te starten.

Vanaf nu kan ik dus een nieuw of bestaand programma bewerken met ./writec source.c

Wat je in je template opneemt moet je zelf weten, maar ik zou in ieder geval aanraden daar in op te nemen:

#include <stdio.h>
#include “je eigen header.h”

int main(int argc, char **argv)
{

return 0;
}

En dat grafische? Natuurlijk, alvast een heel klein voorproefje. Zorg eerst dat je de ncurses-bibliotheek installeert. Op de Pi: sudo apt install libncurses-dev

Vervolgens de volgende code (ook op GitHub natuurlijk)

#include <stdio.h>

#include <ncurses.h>

 int main()
{
     initscr();
     cbreak();
     noecho();
     printw(“Hallo, wereld”);
     refresh();
     getch();
     endwin();

return 0;
}

bij het compileren opletten dat je ofwel de Makefile aanpast, ofwel rechtstreeks toevoegt:

gcc voorbeeld.c -lncurses

Als je nu het programma uitvoert krijg je nog niet heel veel spektakel, maar dat komt de volgende keer wel.

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.