Archief - [PROG] [C/C++] Uitleg gevraagd voor klein stuk code

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

akashb17

Legacy Member
Hoi,

ik heb een opdrachtje voor school en ik zit met een stukje code die ik niet helemaal snap nog.
Zou iemand mij deze kunnen uitleggen?
Alvast bedankt :)

Code:
void Display_refreshTime()
{
  Display_home();						
  Display_putText(Display_Text, 5);
  Display_putRomanValue(Counter_Hour);
  Display_putCharacter(':');
  Display_putRomanValue(Counter_Minute);
  Display_putText("     ", 5);
  
  if(Calibration_Mode>0) return;

  Display_return();
  Display_putText("Sec  ", 5);
  Display_putRomanValue(Counter_Second);
  Display_putText("     ", 5);
}

Display_putRomanValue word hier aangeroepen:

Code:
void Display_putRomanValue(unsigned char getal) 
{ 
 getal=getal%100;
 Display_putText((unsigned char*)tientallen[getal/10], strlen(tientallen[getal/10]));

 getal=getal%10; 
 Display_putText((unsigned char*)enkelen[getal], strlen(enkelen[getal]));	
}

Dit programma moet dus kort gezegd een klok op een display weergeven in Romeinse cijfers.
Dit 2e stukje code, de conversie, snap ik niet helemaal.

Alvast bedankt :)

wlibaers

Legacy Member
Vrij eenvoudig.

getal=getal%100;

Modulus operator. Misschien beter bekend als de rest van een deling waarbij je stopt voor er kommagetallen komen. Dus bijvoorbeeld: 756 % 100 geeft 56.

Display_putText((unsigned char*)tientallen[getal/10], strlen(tientallen[getal/10]));

Display_putText is blijkbaar een functie die twee parameters nodig heeft: een pointer naar een string, en de lengte van die string.

De string is tientallen[getal/10] . Er is dus blijkbaar een tabel genaamd tientallen die strings bevat met Romeinse getallen. Die tabel zou dan het volgende bevatten, beginnend bij positie nul: "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC".

Analoog systeem voor het tweede deel.

Het deel groter dan 100 wordt volledig genegeerd.

akashb17

Legacy Member
Dus uit de 2 parameters komt het getal wat voor de tijd is? Laten we zeggen 5. Dan kijkt ie naar de tabel (array), zoekt de 5e waarde en dan komt V op het scherm?

En stel nou, het is 5:10.00 uur, hoe gaat dat dan in de hele berekening in z'n werk?

Hier nog de array :)
Code:
static const char *enkelen[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }; 
static const char *tientallen[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };

De hele source code:http://home.wanadoo.nl/rbaldew/clock
(Het gaat om de code van Display.c)

wlibaers

Legacy Member
akashb17 zei:
Dus uit de 2 parameters komt het getal wat voor de tijd is? Laten we zeggen 5. Dan kijkt ie naar de tabel (array), zoekt de 5e waarde en dan komt V op het scherm?

Display_putRomanValue heeft maar een parameter, die in een deel voor de tientallen en een deel voor de eenheden gesplitst wordt. Display_putText heeft twee parameters, een string om a te drukken en de lengte ervan (wat hier eigenlijk overbodig is, want die dunctie zou dat makkelijk zelf kunnen bepalen).

En stel nou, het is 5:10.00 uur, hoe gaat dat dan in de hele berekening in z'n werk?

Hier nog de array :)
Code:
static const char *enkelen[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }; 
static const char *tientallen[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };

De hele source code:http://home.wanadoo.nl/rbaldew/clock
(Het gaat om de code van Display.c)

Dat staat toch duidelijk stap voor stap in de comments? Als het daarmee niet duidelijk is zou ik aanraden een stuk code met pen en papier uit te voeren, dus niet op de computer maar de berekeningen en alle stappen zelf uitvoeren. Als je dat te moeilijk vindt kan je er eens door stappen in de debugger (of een andere studierichting kiezen, maar daar is het misschien een tikkeltje te laat voor :p ).

En je voorlopig geen zorgen maken over de Counter_* variabelen, die krijgen hun waarde ergens anders in het programma.

Deguchi

Legacy Member
beste mogelijkheid om te zien hoe het eigenlijk werkt is idd gewoon met de debugger points zetten en dan zien wat de originele waarde is van getal en na modulus bewerkingen ;)

akashb17

Legacy Member
Weten jullie een goede debugger?
Ben op zoek gegaan, maar van de paar die ik vind, moet je of meteen betalen, of de installatie mislukt gewoon.

Timmos

Legacy Member
akashb17 zei:
Weten jullie een goede debugger?
Ben op zoek gegaan, maar van de paar die ik vind, moet je of meteen betalen, of de installatie mislukt gewoon.

Ik gebruik Dev-Cpp van Bloodshed: compiler & debugger
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan