Converting 'int' to 'double' jak pozbyc sie warninga

0

Witam występuje mi warning zamiana ina na double, i nie umiem tego zlikwidowac, proszę o pomoc dodatkowo pojawia sie jeszcze jedno ostrzezenie a mianowicie "control reaches end of non-void function", gdyby ktos mi wskazal jak je usunac rowniez bede wdzieczny.

#include <cmath>
#include <iostream>
using namespace std;
void czas(int&);
bool czas (double& u);
int main()
{
    int _t;
    double _u;
    cin>>_t;
    cin>>_u;
    void czas(int&);
    czas(_t);
    bool czas (double& u);
    czas(_u);
    system("pause");
}
bool czas (double& u)
{
     int wynik;
     if(u>=0 && u<1)
     {
             wynik=86400*u;
             void czas(int&);
             czas(wynik);
     }
     else
     return false;
             
     
 }
void czas (int& t)
{
    int hh(t),mm(t),ss(t);
    if(t>86400)
    t=t%86400;
    if(t>3600)
    {
         hh=t/3600;
         t=t%3600;
    }
    else
      hh=0;
    if(t>60)
    {
         mm=t/60;
         t=t%60;
    }
    else
      mm=0;
    ss=t;
    cout<<hh<<":"<<mm<<":"<<ss<<"\n";
}
0
#include <cmath>
#include <iostream>
using namespace std;

void czas(int&);
bool czas(double& u);

int main()
{
  int _t;
  double _u;

  cin >> _t;
  cin >> _u;
  // po co te deklaracje?
  czas(_t);
  czas(_u);

  // system("pause") jest bardzo złe!!!
  cin.sync();
  cin.get();
}

bool czas(double& u)
{
  int wynik;
  if(u >= 0 && u < 1)
  {
    // jawna konwersja double -> int, konstruktorem
    wynik = int(86400 * u);
    czas(wynik);
    // chyba zapomniałeś coś zwrócić, nie?
    return true;
  }
  else
  {
    return false;
  }
}

void czas(int& t)
{
  int hh(t), mm(t), ss(t);

  if(t > 86400)
  {
    t = t % 86400;
  }

  if(t > 3600)
  {
    hh = t / 3600;
    t = t % 3600;
  }
  else
  {
    hh = 0;
  }

  if(t>60)
  {
    mm = t / 60;
    t = t % 60;
  }
  else
  {
    mm = 0;
  }
  ss = t;
  cout << hh << ':' << mm << ':' << ss << '\n';
}

Na resztę kodu nawet nie patrzyłem.

0

wynik = int(86400 * u);
Dla C jest to dobre, ale nie dla C++.
W C++ powinno się używać static_cast
wynik = static_cast<int>(86400 * u)

  // system("pause") jest bardzo złe!!!
  cin.sync();
  cin.get();
getchar(); // cstdio
getch();
0
adam.chyla napisał(a)

wynik = int(86400 * u);
Dla C jest to dobre, ale nie dla C++.
No to super, że to nawet nie działa w C. To jest wywołanie konstruktora, coś zupełnie innego od rzutowania w stylu C. Po prostu kilku idiotów piszących kursy i książki o tym nie wie, więc pociskają, że to jakieś rzutowanie.

0
adam.chyla napisał(a)

wynik = int(86400 * u);
Dla C jest to dobre, ale nie dla C++.
W C++ powinno się używać static_cast
wynik = static_cast<int>(86400 * u)

Bzdura, chłopcze. Int(...) to pseudokonstruktor, przy którym zachodzą konwersje jak w static_cast, istenieje tylko w C++. Rozwiązanie jest jak najbardziej poprawne, jest bardzo dobre. W C++ prymitywy mają preudokonstruktory, przy aliasowaniu zaś nawet pseudodestruktory - głównie w celu uogólnienia mechaniki i umożliwienia wygodnego użycia ich z szablonami.

0

Macie rację - sprawdziłem w kilku zaufanych źródłach. Faktem jest jednak, że wykrycie błędu w takim rzutowaniu (jeżeli mamy ich dużo):
int(86400 * u);
sprawia problemy.

0
adam.chyla napisał(a)

Macie rację - sprawdziłem w kilku zaufanych źródłach. Faktem jest jednak, że wykrycie błędu w takim rzutowaniu (jeżeli mamy ich dużo):
int(86400 * u);
sprawia problemy.

Kilka spraw:

  • od wykrywania błędów w pierwszej kolejności jest kompilator i debugger;
  • tutaj nie ma rzutowania jako takiego, to jest konstruktor nowego inta, ze wszystkimi możliwymi niejawnymi konwersjami;
  • konstruktor jest tak samo błędogenny jak static_cast, static_cast to te same mechanizmy;
  • w czym dwie równoważne konstrukcje mogą się różnić przy wykrywaniu błędów?
0

A jeżeli dam:

(int)(liczba_float)

to będzie rzutowanie, czy zostanie wywołany konstruktor?

0

Rzutowanie proste, c-cast...

0
adam.chyla napisał(a)

A jeżeli dam:

(int)(liczba_float)

to będzie rzutowanie, czy zostanie wywołany konstruktor?
Rzutowanie, czyli formalnie ma być wywołany operator rzutowania. Jeśli ten operator zwraca jakiś obiekt przez wartość to musi ona być jakoś utworzony, czyli musi być wywołany konstruktor. Fizycznie te metody nie istnieją, wszystko jedno czy użyjemy rzutowania czy konstruktora, wynikiem jest jedna/kilka instrukcji assemblera. Logicznie możemy traktować, jakby te operatory i konstruktory istniały, np:

int *i = new int(5); //konstruktor kopiujący

Co do drugiego warninga:

bool czas(double& u)
{
  int wynik;
  if(!(u >= 0 && u < 1)) return false;

  // jawna konwersja double -> int, konstruktorem
  wynik = int(86400 * u);
  czas(wynik);
  // chyba zapomniałeś coś zwrócić, nie?
  return true;
}

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