2.MRT.2014/HvM;

 12. Gebruik altijd symbolische verwijzing

Dit onderwerp en het bestand “CIF.INC” behandel ik ook in de cursussen ‘Toolkit-CCOL’.
Voor meer informatie kunt u mij telefonisch of via het reactieformulier bereiken.



Het gebruik van relatieve verwijzingen past u al toe als het gaat om fasecycli, detectoren, parameters enzovoorts.
Bijvoorbeeld (zie rood vetgedrukt):

void application(void)
{
 …
 /* schakelbare meeaanvraag van fc24 naar fc08 niet tijdens spits: */
 A[fc08] |= SCH[sch_ma24_08] && !G[fc24] && !H[h_spitsperiode]; 
 …
}

Maar ook in de definitie van de CVN-interface is rekening gehouden met relatieve verwijzingen. Zo zijn in de array waarin de kloktijd staat de indices ook relatief toegankelijk. Dat maakt het mogelijk om elk onderdeel van de kloktijd op te vragen, zonder te moeten weten in welke index van de tabel CIF_KLOK dat onderdeel staat.

In het volgende voorbeeld wordt dat duidelijk. In dit voorbeeld is gevraagd om elke start van een minuut een puls te verkrijgen. U zou daarvoor misschien schrijven:


void system_application(void) /* let op: system_application ! */
{

/* puls bij overgang nieuwe minuut: */
static s_int16 CIF_MINUUT_OLD = 0; /* De toevoeging ‘static’ is essentieel! */
IH[h_minuutovergang] = FALSE; /* preset */
if (CIF_KLOK[5] != CIF_MINUUT_OLD) /* De index 5 is de minuut in de array CIF_KLOK */
{
IH[h_minuutovergang] = TRUE; /* éénmaal per minuut TRUE */
CIF_MINUUT_OLD = CIF_KLOK[5]; /* ten behoeve van toets in volgende machineslag */
}

}
Terzijde: element “5” is het zesde element van de array!

Maar in plaats van rechtstreeks naar element “5” te verwijzen, kunt u beter schrijven:


void system_application(void) /* let op: system_application ! */
{

/* puls bij overgang nieuwe minuut: */
static s_int16 CIF_MINUUT_OLD = 0; /* De toevoeging ‘static’ is essentieel! */
IH[h_minuutovergang] = FALSE; /* preset */
if (CIF_KLOK[CIF_MINUUT] != CIF_MINUUT_OLD) /* De index 5 is de minuut in de array CIF_KLOK */
{
IH[h_minuutovergang] = TRUE; /* éénmaal per minuut TRUE */
CIF_MINUUT_OLD = CIF_KLOK[CIF_MINUUT]; /* ten behoeve van toets in volgende machineslag */
}

}

Deze symbolische verwijzing heeft een aantal voordelen:


  • U kunt zich nooit vergissen in de index van de array CIF_KLOK die u nodig heeft.

  • Mocht de CVN-interface om een of andere reden ooit een andere index voor de minuut definiëren, dan weet u met uw symbolische referentie aan CIF_MINUUT dat u beslist de minuut opvraagt, en niet per ongeluk de seconde of het uur omdat dat met die veranderde CVN-interface toevallig index 5 is geworden.
    Indien zo'n CVN-interface­wijziging daadwerkelijk niet downwards compatible is, dan zal de commissie de exacte schrijfwijze “CIF_MINUUT” zeker niet handhaven, maar net iets anders schrijven, bijvoorbeeld “CIF_MINUTE”. Als u dan in uw applicaties steeds CIF_MINUUT heeft gebruikt in plaats van 5, dan heeft dat voor u als voordeel dat de compiler tenminste een foutmelding geeft dat de verwijzing CIF_MINUUT niet meer bestaat. Zonder zo'n foutmelding zou u die wijziging beslist niet hebben opgemerkt en er dagen aan kwijt zijn om te zoeken waarom uw applicatie niet doet wat u wilt. Áls u al ontdekt dat er iets fout gaat…

  • En bovendien, voor fasecyclus 32 schrijft u toch ook niet  A[14]  als  A[fc32]  veel duidelijker is?



Natuurlijk kent de CVN-interface voor álle elementen van de array CIF_KLOK een symbolische verwijzing. Hieronder volgt die lijst, en natuurlijk gebruikt u alleen de symbolische namen:

/* CIF_KLOK[ ]: */
#define CIF_JAAR 0 /* jaartal */
#define CIF_MAAND 1 /* maand 1..12 */
#define CIF_DAG 2 /* dag van de maand 1..31 */
#define CIF_DAGSOORT 3 /* dag van de week 0..6 */
#define CIF_UUR 4 /* uur van de dag 0..23 */
#define CIF_MINUUT 5 /* minuut 0..59 */
#define CIF_SECONDE 6 /* seconde 0..59 */
#define CIF_SEC_TELLER 7 /* seconden teller 0..32767 */
#define CIF_TSEC_TELLER 8 /* tienden sec teller 0..32767 */

En als u wilt weten of het vandaag zondag is, gebruikt u niet “3” en “0” maar CIF_DAGSOORT (tabel hierboven) en CIF_ZONDAG (tabel hieronder):

/* Dagen van de week: */
#define CIF_ZONDAG 0 /* zondag */
#define CIF_MAANDAG 1 /* maandag */
#define CIF_DINSDAG 2 /* dinsdag */
#define CIF_WOENSDAG 3 /* woensdag */
#define CIF_DONDERDAG 4 /* donderdag */
#define CIF_VRIJDAG 5 /* vrijdag */
#define CIF_ZATERDAG 6 /* zaterdag */



U schrijft dus NIET:

Maar WEL:
if (CIF_KLOK[3] == 0)
{
 …
}


if (CIF_KLOK[CIF_DAGSOORT] == CIF_ZONDAG)
{
 …
}





Zo zijn er nog veel meer tabellen en defines vastgelegd. Wilt u die eens zien? Open dan het bestand “..\CCOL\INCLUDE\CIF.INC” met een normale tekstviewer. Maar let op: verander nooit wat in dat bestand, in het gunstigste geval zal het op straat niet werken!




Dit onderwerp en het bestand “CIF.INC” behandel ik ook in de cursussen ‘Toolkit-CCOL’.
Voor meer informatie kunt u mij telefonisch of via het reactieformulier bereiken.


Index van CCOL-onderwerpen


Reageer op dit bericht