Archief - [PROG]C++ Uitleg 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
Kan iemand mij dit stukje code uitleggen?
Het is een stopwatch, de andere codefiles snap ik wel, alleen is deze nog niet helemaal duidelijk.
Ter info: er wordt gebruikt gemaakt van knopjes waarmee je de stopwatch bedient.
Als je de regels wilt commenten, zou dat ook een enorme hulp zijn.
Dank u wel.

Code:
#include "StwForm.h"
#include "Stw.h"

Stw::Stw(void)
{
        state=IDLE;
}

void Stw::controlStw(void)
{
        switch(state)
        {
                case RIT:
                        if(clock()>LapTime)
                                displayTijd(clock()-RitTime);
                        break;
                case LAP:
                        displayTijd(clock()-LapTime);
                        break;
        }
}

void Stw::displayTijd(std::clock_t t)
{
        Form1->LMin->Caption=(int)(t/CLOCKS_PER_SEC)/60;
        Form1->LSec->Caption=(int)(t/CLOCKS_PER_SEC)%60;
        Form1->LTsec->Caption=(int)(t/(CLOCKS_PER_SEC/100))%100;
}

void Stw::StartStopRit(void)
{
        switch(state) {
                case(IDLE):
                        RitTime = clock();
                        LapTime = clock();
                case(PAUSE):
                        state=RIT;
                        break;
                case(RIT):
                        state=PAUSE;
                        break;
        }
}

void Stw::ShowResetLap(void)
{
        switch(state) {
                case(RIT):
                        state=LAP;
                        LapTime = clock();
                        break;
                case(LAP):
                        state=RIT;
                        LapTime = clock() + CLOCKS_PER_SEC*0.8;
                        break;
        }
}

void Stw::Reset(void)
{
        if(state==PAUSE) {
                state=IDLE;
                displayTijd(0L);
        }
}

Code:
#ifndef StwControl_h
#define StwControl_h

#include <stdio.h>
#include <ctime.h>
#include <iostream>
using namespace std;

enum StateType {IDLE,RIT,LAP, PAUSE};

class Stw
{
        public:
                Stw(void);
                void controlStw(void);
                void StartStopRit(void);
                void ShowResetLap(void);
                void Reset(void);

        private:
                StateType state;
                void displayTijd(std::clock_t t);

                std::clock_t LapTime;
                std::clock_t RitTime;
};

extern Stw *stw;
#endif

killgore

Legacy Member
moeste we nu nog eens die headers hebben ook he :sop:.

En wie da gemaakt heeft is geen echt consistent persoon (wie maakt er nu methoden displayTijd, tis ofwel displayTime ofwel toonTijd) en mag eens leren da commenten belangerijk is, naast een duidelijke naamgeving, wth wilt Stw zeggen, is StopWatch nu echt zo een lange naam?.

akashb17

Legacy Member
Headers toegevoegd.

Hij is een zeer goede programmeur.
De benamingen zijn van een UML diagram, dus dat stond al vast.

killgore

Legacy Member
goede programmeur & vastliggende namen, em studeert nog ofzo :p? Bedrijfssoftware zal het niet zijn als je dit op een forum plaatst.

& dat neemt niet weg dat er geen comments instaan ;)

Een ECHT goede programmeur zijn source code vraagt geen verduidelijking ;). Moest je nu enkel een klasse declaratie hebben kan je hem nog verdedigen :).

Aangezien ik totaal niet weet wat er bedoelt wordt met RIT wordt het moeilijk (LAP is vrij duidelijk denk ik, RIT kan nl zijn vo rit ma dan zitte daar weer me u klote inconsistente naamgeving, en ik betwijfel dat dat vastlag in een uml diagram :p).
*edit: rit betekent dus gewoon dat uw stopwatch aan het tellen is, dat er iets bezig is (noem het een rit :rolleyes: ).

Nu ja, poging dan maar (ik ga er hier van uit da clock microseconden weergeeft, da kan iets anders zijn, hangt van wat zaken af ;)):

Code:
Stw::Stw(void)
{
        state=IDLE;
}
Duidelijk -> construeert uw stopwatch en zet uw state op idle (om volledig te zijn he :p).

Code:
void Stw::controlStw(void)
{
        switch(state)
        {
                case RIT:
                        if(clock()>LapTime)
                                displayTijd(clock()-RitTime);
                        break;
                case LAP:
                        displayTijd(clock()-LapTime);
                        break;
        }
}
Ofwel tijd verlopen sinds begin van rit (behalve als je "juist" na een einde van een lap zit, zie later), ofwel tijd verlopen sinds begin van lap weergeven.

Code:
void Stw::displayTijd(std::clock_t t)
{
        Form1->LMin->Caption=(int)(t/CLOCKS_PER_SEC)/60;
        Form1->LSec->Caption=(int)(t/CLOCKS_PER_SEC)%60;
        Form1->LTsec->Caption=(int)(t/(CLOCKS_PER_SEC/100))%100;
}
Ouput geven naar het (normaal gezien) venster van uw stopwatch. Gij durft mij zeggen dat die goed kan coden, global vars en rechtstreeks view aanspreken vanuit uw "functionele" code is niet echt de gangbare interpretatie van goed coden.

Code:
void Stw::StartStopRit(void)
{
        switch(state) {
                case(IDLE):
                        RitTime = clock();
                        LapTime = clock();
                case(PAUSE):
                        state=RIT;
                        break;
                case(RIT):
                        state=PAUSE;
                        break;
        }
}
Start of stopt uw klok.
Als hij idle is zal hij nu de huidige microseconden op RitTime en LapTime zetten en daarna state op RIT zetten, hij "start" de klok dus echt ;), idle status is begin-status en status die klok krijgt na reset.
Als hij gepauseerd is zal hij deze keer de stopwatch enkel op RIT zetten (hij reset dus niet uw LapTime en RitTime in tegenstelling tot idle-functie).
Als er een rit bezig is zal hij deze pauzeren (dus "stoppen").

Code:
void Stw::ShowResetLap(void)
{
        switch(state) {
                case(RIT):
                        state=LAP;
                        LapTime = clock();
                        break;
                case(LAP):
                        state=RIT;
                        LapTime = clock() + CLOCKS_PER_SEC*0.8;
                        break;
        }
}
Als uw rit bezig is zal hij nu de status op LAP zetten en uw LapTime (het begin van uw lap dus voor weergave) op huidige microseconden zetten.
Als er al een Lap bezig is zal hij deze stoppen en de status dus gewoon op rit zetten. Hij "reset" dan de laptijd, maar met een kleine delay (0.8 seconden) voor uw weergave (ik gok dat dit allemaal wat te maken heeft met uw form, want zie het nut anders niet).
Hier weer geweldige naamgeving: dat ding showt juist niets.

Code:
void Stw::Reset(void)
{
        if(state==PAUSE) {
                state=IDLE;
                displayTijd(0L);
        }
}
Een reset die (enkel als hij gepauseerd is) de tijd zogezegd reset door naar status idle te gaan (als je dan start met StartStopRit ga je idd je RitTime en laptime weer instellen op huidige microseconden).
Hij geeft ook de verstreken tijd 0 weer.

Deguchi

Legacy Member
akashb17 zei:
Headers toegevoegd.

Hij is een zeer goede programmeur.
De benamingen zijn van een UML diagram, dus dat stond al vast.

Zelf al staat het in een UML-diagram, dan zijn de benamingen nog steeds fout.
Zeker die RIT. Een rit bestaat naar mijn weten niet in het Engels.
Consistentie is echt wel nodig in een programma alsook commentaar schrijven.
Ivm de commentaar schrijven: leer het uzelf aan dit te doen als ge net een blok code hebt afgewerkt. Nooit denken van "De commentaar schrijf ik later wel...". Anders doet ge dat toch niet of op een crappy manier.
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