Toon posts:

[C++] berekende waarde vastzetten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,
Ik zit al een week met hetzelfde probleem maar ik krijg het niet opgelost. dus ik hoop dat jullie mij hiermee kunnen helpen.

globaal idee achter verhaal:
Ik wil dus wanneer ik een venster neerzet op het scherm(door op een knop te drukken) de huidige tijd neerzetten. dit is opzich geen probleem. Het probleem zit hem erin dat wanneer ik weer op het knopje druk dus weer dezelfde gegevens naar boven wil halen. dus niet de huidige tijd maar de tijd van de eerste keer dat ik het knopje drukte.


Hieronder een stukje code:
//Wanneer ik op knopje druk wordt nieuw scherm aangemaakt en een
//methode gestart die onderstaande doet:
AnsiString startTime = GetTime();
LogMemo->Lines->Add("Time When First Test Started: "+ startTime);

// Hiermee haal ik dus de huidige tijd op.
AnsiString TLogForm::GetTime()
{
AnsiString returnString = 0;
char timeString[10] = {0};
struct time t;
gettime(&t);
sprintf(timeString,"%2d:%02d:%02d.%02d",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
returnString = timeString;
return returnString;

}

Iedere keer dat ik nu op dat knopje druk gaat hij dus opnieuw die waarde startTime bepalen. Ik wil dat hij dit 1 keer doet en dat ik dan continu die waarde kan ophalen zonder dat hij dat opnieuw berekend?

iemand ideeen?
als ik niet duidelijk ben moet je even zeggen wat je nog wil weten.
ik heb het al geprobeerd met getTime en SetTime maar dat gaat volgens mij ook niet werken omdat hij dan ook weer tellkens opnieuw gaat berekenen. en weer de huidige tijd aangeeft.

greetz flykiller

  • whoami
  • Registratie: December 2000
  • Nu online
Dit is redelijk basic.

Je houd bij wat de waarde was de eerste keer dat je op die knop drukt. Iedere keer dat er nog eens op die knop wordt gedrukt, dan bereken je de waarde niet meer, maar ga je de inhoud van die ene variable gaan tonen.

Ik geloof ook dat je gebruik kunt maken van static varialbes.

https://fgheysels.github.io/


Verwijderd

Maakt van de struct time t een static struct time t, check voordat je gettime(&t) doet of t al gezet, zo ja, voer gettime uit, zo nee, return t of een pointer naar t. Het zit hem erin dat je de variabele een static variabele maakt, dat betekent dat een variabele tussen functieaanroepen zijn waarde behoudt.

Verwijderd

Topicstarter
Hoe doe ik dat dan?! want ik heb echt al van alles geprobeerd! hoe sla ik die waarde van de eerste keer op? en hoe haal ik die weer op zonder dat die methode weer uitgevoerd wordt??

p.s. had het stukje van cronjob nog niet gelezen!

Verwijderd

Topicstarter
Misshcien nog een domme vraag maar hoe kijk ik dan of die static struct time t al gezet is?

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 30 september 2002 @ 11:46:
Misshcien nog een domme vraag maar hoe kijk ik dan of die static struct time t al gezet is?


Misschien geen domme opmerking:
Kijk eens in de help of een boek van C++ en zoek eens op static variables ofzo.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik ben weer op zoek geweest maar ik kan nergens vinden hoe ik kan controleren of die
static struct time t; al een waarde heeft.

misschien nog een hint??

greetz flykiller

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 30 september 2002 @ 13:24:
Ik ben weer op zoek geweest maar ik kan nergens vinden hoe ik kan controleren of die
static struct time t; al een waarde heeft.

misschien nog een hint??

greetz flykiller


Lees eens iets over static variables. Daar staat dat een static slechts 1x geinitialiseerd wordt.
Volgens mij hoef je niet eens te controleren, het wordt automatisch gedaan voor jou.

https://fgheysels.github.io/


Verwijderd

Topicstarter
owke dan ik heb het zo opgelost!
static AnsiString startTime = GetStartTime();
LogMemo->Lines->Add("Time When First Test Started: "+ startTime);

AnsiString TLogForm::GetStartTime()
{
AnsiString returnString = 0;
char timeString[10] = {0};
static struct time t;
gettime(&t);
sprintf(timeString,"%2d:%02d:%02d.%02d",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
returnString = timeString;
return returnString;

}

Wat ik dus niet gedaan had de hele tijd was dus de variable bij het aanroepen (de eerste 2 regels) static gemaakt! nu werkt het in ieder geval!

Bedankt voor alle moeite

Greetz Flykiller

  • whoami
  • Registratie: December 2000
  • Nu online
In het vervolg dus best eerst eens zelf wat uitzoeken/proberen/testen als er een tip/hint gegeven wordt ipv direct maar blijven doorvragen...

https://fgheysels.github.io/


Verwijderd

Topicstarter
owke zal het onthouden!

tnx

Verwijderd

char timeString[10] = {0};
...
sprintf(timeString,"%2d:%02d:%02d.%02d",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
Werkt dit echt? Dan heb je geluk gehad volgens mij...

2 + ':' + 2 + ':' + 2 + '.' + 2 + '\0' = 12 karakters

In het vervolg toch maar C++ features gebruiken?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 30 september 2002 @ 13:39:
owke dan ik heb het zo opgelost!
static AnsiString startTime = GetStartTime();
LogMemo->Lines->Add("Time When First Test Started: "+ startTime);

AnsiString TLogForm::GetStartTime()
{
static struct time t;
gettime(&t);
}

Wat ik dus niet gedaan had de hele tijd was dus de variable bij het aanroepen (de eerste 2 regels) static gemaakt! nu werkt het in ieder geval!
Greetz Flykiller
Dat werkt dus niet; de variabele t wordt nu een keer op de default waarde gezet, en vervolgens elke keer door gettime() gezet (want dat is een gewone regel code, zonder static). Tip: Je moet je functie gettime() zo veranderen dat die een time object van type time retourneert, in plaats van een waarde naar een adres schrijft
Tip2: In C++ hoef je niet overal struct time te schrijven, na de definitie struct time {... } weet de compiler dat al. Je kunt dus gewoon static time t schrijven.

FAQje: geen groeten in posts svp

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1