Ograniczenie ilości znaków w wsprintf

0

Witam.
Napisałem funkcję która konwertuje milisekundy do odpowiedniego formatu czasu, w tym wypadku jest to hss:ms
mam jednak problem z ilością znaków w ms gdyż zależy mi na tym aby były tam wyświetlane wyłącznie 2 znaki. Teraz zależnie od wyniku są tam 2 albo 3.
Jak by to było możliwe to byłbym zainteresowany tym aby ilość znaków ms można było określić poprzez parametr funkcji.

Zrobiłem kiedyś wersję, że ss było floatem i wtedy to działało lecz odbijało się o na wydajności.

void MSec2Time(int Value, wchar_t *buf)
{
	int Value2 = abs(Value);
	int hh = Value2/3600000;
	int mm = (Value2-hh*3600000)/60000;
	int ss = (Value2-(hh*3600000)-(mm*60000))/1000;
	int ms = Value2-(hh*3600000)-(mm*60000)-(ss*1000);
	if (Value<0)
		wsprintf(buf,L"-%d:%02d:%02d.%2d", hh, mm, ss, ms);
	else
		wsprintf(buf,L"%d:%02d:%02d.%2d", hh, mm, ss, ms);
} 

2w5242c.jpg

dodanie obrazka do załączników posta - @furious programming

0

Co ma się wyświetlić jeśli milisekund jest 600?
A co jeśli 60?

0

liczba po przecinku a raczej kropce zawsze ma być 2 cyfrowa czyli w obu przypadkach będzie to 60
lub innymi słowy "ss.ms" ma wyglądać na liczbę z dokładnością do 2 miejsc po przecinku

1

Czyli potrzebujesz nie milisekund zaś centysecund mniejsza o istnieniu takiej jednostki.
Podstawy arytmetyki się kłaniają i każą pozdrowić rodzinę:

wsprintf(buf,L"-%d:%02d:%02d.%2d", hh, mm, ss, ms/10);
0

jeszcze kilka mini poprawek i wyszło z grubsza to czego szukałem

 void MSec2Time(int Value, wchar_t *buf)
{
	int Value2 = abs(Value);
	int hh = Value2/3600000;
	int mm = (Value2-hh*3600000)/60000;
	int ss = (Value2-(hh*3600000)-(mm*60000))/1000;
	int ms = Value2-(hh*3600000)-(mm*60000)-(ss*1000);
	if ((ms % 10)>4)
		ms +=5; //psudo round()
	if (Value<0)
		wsprintf(buf,L"-%d:%02d:%02d.%02d", hh, mm, ss, ms/10);
	else
		wsprintf(buf,L"%d:%02d:%02d.%02d", hh, mm, ss, ms/10);
}
0

Wolę taki zapis:

void MSec2Time(int Value,wchar_t *buf)
  {
    int Value2=abs(Value),hh=Value/3600000,mm=(Value2-=hh*3600000)/60000,ss=(Value2-=(mm*60000))/1000,ms=Value2-(ss*1000);
    wsprintf(buf,L"%d:%02d:%02d.%02d",hh,mm,ss,(ms+5)/10);
  }
0

Kto co woli, dla mnie taki kod jest nieczytelny zwłaszcza, na etapie budowania programu, kiedy to zachodzi wiele zmian. A może to ja jestem jakiś wypaczony ;p, od 3 lat piszę w AutoHotkey'u po c++ sięgam jedynie kiedy trzeba napisać funkcję w dll dla lepszej wydajności.
Pomijam już fakt że ms+5 ma być tylko jeśli ostatnia cyfra jest w przedziale 5-9, w twoim wykonaniu będzie to działać jak ceil() i mi bardziej chodziło o round(). O braku obsługi wartości ujemnych też już nie będę wspominał

0

Tak, oczywiście, dwa if'y czytelniejsze od (ms+5)/10.
To nazywa się nie "nie czytelny kod" tylko "brak ci znajomości podstaw matematyki".

0

głównie chodziło mi o to, że jak patrzę się na linijkę z wsprintf i chcę np dowiedzieć się czym jest mm czy ss to nie muszę dekodować 10 kilometrów 1 linijki tak jak w niemczech tylko od razu widzę jak na dłoni co się z czym je.
Z tym (ms+5)/10 odziwo muszę przyznać rację - nie do końca jeszcze trybię arytmetyki jaka zachodzi w niskopozomowym kodzie.

0

To daj sensowne nazwy aby nie musiałeś tego robić, poza tym zawsze możesz po przecinku przenieść na następny wiersz.

int Value2=abs(Value),
   hh=Value/3600000,
   mm=(Value2-=hh*3600000)/60000,
   ss=(Value2-=(mm*60000))/1000,
   ms=Value2-(ss*1000)
  ;

Jaki niskopoziomowy kod?
Jeżeli dzielisz przez 10 (pamiętaj że dzielisz na całość) to dodając 5-kę ze wszystkiego co kończy się 5-ką i wyżej zwiększasz ilość dziesiątek - to cała filozofia.

0

z tym dzieleniem to już doszedłem, po prostu z początku zauważyłem, że dzieląc inty wynik zawsze dostaję zaokrąglony w dół więc przyjąłem jakieś dziwne założenie, że ten if jest konieczny...

1 użytkowników online, w tym zalogowanych: 0, gości: 1