Beste adspirant cursisten,

Op 25 september 2025 staat een item 'Programmeertaal C voor beginners, valkuilen ed.' gepland, te geven door ondergetekende.

Omdat ik niet de illusie heb dat ik in een uurtje of 2 jullie verder krijg dan het installeren van de compiler en het leren omgaan daarmee (laat staan een 'Hello world!' programma), heb ik het volgende bedacht:
Ik zoek een cursus C op internet, die het programmeren in C allemaal kan uitleggen, zodat je meer tijd hebt om op je gemak de basis te bestuderen.

Op de 25e in Delft kunnen we het dan hebben over de valkuilen waar jullie ongetwijfeld in terecht gekomen zijn, en kan ik je daar (hopelijk!) weer uithelpen!

Ik heb deze cursus gevonden, en heel toepasselijk is die aan de TU in Delft gegeven:
https://icozct.tudelft.nl/TUD_CT/software/programmeren/files/cursus_c1993.pdf

Ik geef hierbij de aanzet om te kunnen gaan programmeren, namelijk het installeren van de GCC-compiler en het compileren daarmee, want dat komt in de voorbeeld cursus pas later (hoofdstuk 12, pagina 72) aan de orde.


Installeren
-----------
Installeer onder RISC OS via !Packman het pakket GCC4 (dat duurt even, het is behoorlijk groot!), dan worden de rest van de afhankelijkheden (oa. shared libraries) netjes voor je uitgezocht en opgelost.

!GCC komt standaard in $.Apps.Development te staan, maar er wordt niet voor gezorgd dat dit gelijk door RISC OS gestart kan worden.
Je moet (als je met een sessie gaat beginnen) er even op dubbelklikken (al lijkt er dan niets te gebeuren, er wordt voor gezorgd dat de compiler 'gcc' gestart kan worden).

Verder is het handig om een plek op je harddisk te hebben waar je met C aan de slag gaat. Waar dat is maakt op zich niet echt uit. Kies een handige plek zoals bv. $.cursusC en maak daarin de submappen 'c', 'h' en 'o' (uiteraard zonder de ''-tekens). Zo dus:
   $
    .cursusC
            .c
            .h
            .o
De map 'c' is voor de c-sources, 'h' voor header files en 'o' voor object files.
Vergeet niet om in de Filer over de map 'cursusC' via het menu de opdracht 'Set work directory' te geven, zodat de compiler je bestanden kan vinden!
De gecompileerde programma's komen dan in deze work directory terecht.

Je slaat de C-sources op in de map 'c' en noemt ze dan bv. 'vb2_2'.
Dit is een wat ongebruikelijke manier van het benoemen van bestanden, op andere OSsen heet het bestand meestal 'vb2_2.c' en is de 'c' map niet nodig.

Waarom? Nou, Acorn vond het vroeger (in de tijd van 10 karakter bestandsnamen) praktisch om het zo te doen, en iedereen is dat blijven doen, ook toen het in feite niet meer nodig was!

Van de compiler mag je de source 'c.vb2_2' noemen, al wordt 'vb2_2.c' door de compilerbouwers aangeraden als je graag compatible wilt zijn met bv. Linux of Windows.

Oh ja, de compiler heeft graag veel geheugen tot zijn beschikking!
Je kunt prima vanuit een TaskWindow compileren, als je er tenminste voor zorgt dat je begint met: 'WimpSlot 20480k' (16000k is het absolute minimum).

Compileren
----------

Vanaf de commandline doe je dat met:
   gcc -o <programma naam> <source.c> [<source.c ...]
bv.
   gcc -o vb2_2 vb2_2.c

De '-o' geeft de compiler opdracht om het uitvoerbare programma 'vb2_2' te noemen (in plaats van zijn standaard 'a/out').

Om het eerste voorbeeld programma ('vb2_2.c', op pagina 4) te kunnen compileren, moet de foutmelding die de compiler genereert (error: return type defaults to 'int'), eerst opgelost worden.

De reden van deze melding: de taal C is in de loop der jaren veranderd van een redelijk informele manier van functie definities opgeven (als je geen return type opgeeft, bedoel je waarschijnlijk geen (of een 'int'eger als) waarde terug te krijgen) tot een formele definitie (als je geen (verplicht) return type opgeeft, kan ik geen functie voor je compileren, dat is dus een FOUT!).

Het is voor een compiler nooit goed om dingen aan te moeten nemen, dus het is wel prettig dat dit nu duidelijk geregeld is.

De fout oplossen kan op twee manieren:
1) Gebruik van '-std=c89', om de compiler te laten weten dat je code zich aan een eerdere standaard houdt, bv.:
      gcc -std=c89 -o vb2_2 vb2_2.c
2) De functie main() voorzien van een geldig return type, in dit geval dus
      int main()

1) is vooral bruikbaar als je al een berg code hebt die zich aan (in dit geval) c89 houd.
2) is uiteraard de betere manier.

Je eerste programma is nu gecompileerd (hopelijk geen typefouten gemaakt!), en als er een programma 'vb2_2' gemaakt is, dan zou het uitgevoerd moeten kunnen worden.
Onder RISC OS kun je dat doen door 'vb2_2' op de commandline in te typen.
Onder Linux doe je dat zo: './vb2_2'. De './' aan het begin geeft aan de shell door dat het programma zich in de huidige map bevind. Standaard voert de shell alleen programma's uit die via het PATH gevonden kunnen worden.

Dit is de grootste hindernis! Als je dit mechaniek (sourcecode schrijven, compileren, laten uitvoeren en de uitvoer op scherm krijgen) eenmaal voor elkaar hebt, is de rest vrij simpel... (volgens Kernihan & Ritchie, van The C programming language).

Ga hier maar mee aan de slag!
Ik hoor graag reacties of het opzetten van het geheel duidelijk genoeg is, stuur die bv.
via Aconet: Simon Voortman, 77:8500/100
via email: sjvoortman@gmail.com

Veel succes!

Groetjes,
Simon.
