Ograniczenie ilości znaków w wsprintf

Odpowiedz Nowy wątek
2014-12-28 11:46
0

Witam.
Napisałem funkcję która konwertuje milisekundy do odpowiedniego formatu czasu, w tym wypadku jest to h:mm:ss: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

edytowany 2x, ostatnio: furious programming, 2014-12-28 22:29
Obrazki i inne pliki dodawaj do załączników posta, a nie na śmieciowe hostingi; - furious programming 2014-12-28 22:29

Pozostało 580 znaków

2014-12-28 12:36
0

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

Pozostało 580 znaków

2014-12-28 12:51
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

edytowany 2x, ostatnio: smarq, 2014-12-28 12:55

Pozostało 580 znaków

2014-12-28 13:24

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);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-28 19:22
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);
}
edytowany 1x, ostatnio: smarq, 2014-12-28 19:22

Pozostało 580 znaków

2014-12-28 20:13
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);
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-28 21:02
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ł

edytowany 2x, ostatnio: smarq, 2014-12-28 21:09

Pozostało 580 znaków

2014-12-28 21:07
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".


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-28 21:18
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.

edytowany 2x, ostatnio: smarq, 2014-12-28 21:23

Pozostało 580 znaków

2014-12-28 21:26
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-28 21:26

Pozostało 580 znaków

2014-12-28 21:37
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...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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