CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - ToDouble()

ToDouble()

dział ogólny

ToDouble()

Nowy postprzez nvdante » wtorek, 20 stycznia 2015, 12:44

Witam panowie!

Czemu taki zapis nie chce się skompilować:
KOD cpp:     UKRYJ  
        string linia="2001152205";
        double x= StrToFloat(linia);
        cout<<x;
       
        lub tak:

        string linia="2001152205";
        double x= linia.ToDouble();
        cout<<x;

Dostaję komunikat: [Error] 'StrToFloat' was not declared in this scope.
Podejrzewam, że nie dodałem jakiejś biblioteki, ale nie wiem jakiej. Te, które mam dodane ze względu na różne funkcje programu to:
    #include <iostream>
    #include <windows.h>
    #include <time.h>
    #include <fstream>
    #include <stdio.h>//to dodałem do obsługi konwersji
Zależy mi na formacie double, bo muszę od jednego czasu odjąć drugi, a do tego chciałem wykorzystać difftime.
Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez Cyfrowy Baron » wtorek, 20 stycznia 2015, 13:38

ToDouble(), StrToInt itp. to metody klasy AnsiString lub UnicodeString w zależności od wersji środowiska i nie działają z typem string - pisane z małej litery, bo z dużej to już AnsiString lub UnicodeString. Jednym zdaniem działają tylko z typem String.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: ToDouble()

Nowy postprzez nvdante » wtorek, 20 stycznia 2015, 14:12

Aaa, rozumiem.
A czy w takim razie jest jakaś możliwość, aby zapis typu "1010102233" pobierany z pliku linia po linii odjąć difftime'em od drugiego tak samo sformatowanego? Ewentualnie inna funkcja z tym samym zastosowaniem?
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez Mironas » wtorek, 20 stycznia 2015, 14:19

KOD cpp:     UKRYJ  
  char* linia = "20011";
  double x = atof(linia);
  cout << x;
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: ToDouble()

Nowy postprzez nvdante » wtorek, 20 stycznia 2015, 15:58

Super, dzięki wielkie :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez nvdante » wtorek, 20 stycznia 2015, 17:11

Jeszcze jedna prośba. Czy możecie podpowiedzieć dlaczego taki kod wyświetla wartość 17, a nie 60? Myślałem, że wynikiem powinno być 60 minut.
KOD cpp:     UKRYJ  
        string linia="16:15";
        string godzina="17:15";
       
        double x = atof((char*)linia.c_str());
        double y = atof((char*)godzina.c_str());
               
        cout<<"Roznica: "<<difftime(y, x)<<endl;
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez Mironas » wtorek, 20 stycznia 2015, 17:58

Nie mogę teraz tego sprawdzić, ale...

1. Parametrami funkcji difftime jest time_t a nie double.
2. Przypuszczam, że taka konwersja string >> double jest błędna bo:
* zapis "16:15" nie jest poprawny (zamień dwukropek na kropkę)
* godzina ma 60 minut
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: ToDouble()

Nowy postprzez polymorphism » wtorek, 20 stycznia 2015, 20:46

Przekonwertuj czas z formy tekstowej na sekundy:
KOD cpp:     UKRYJ  
string linia = "16:15";

unsigned h, m;

if(sscanf(linia.c_str(), "%u:%u", &h, &m) == 2)
{
         cout << (h * 60 + m) * 60 << " sec\n";
}

i oblicz różnicę. Do takiego prostego porównywania czasu żadne float, atof czy difftime nie są Ci potrzebne.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: ToDouble()

Nowy postprzez nvdante » środa, 21 stycznia 2015, 10:25

Sam pomysł bardzo mi się podoba z tym, że jeżeli coś zaczęło się np.: o 11:00 jednego dnia, a skończyło o 10:00 kolejnego to różnica nie pokaże 23h tylko -1h.
Zastanawiam się czy nie dodać do kodu dni lub nawet miesięcy. Tylko, że wtedy też jest problem, bo jak coś się stanie 31 dnia miesiąca, a skończy 1 to różnica znów będzie liczbą ujemną :/
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez polymorphism » środa, 21 stycznia 2015, 14:11

Pisałem o prostym porównywaniu czasu, czyli o takim, jaki sam podałeś w swoim poście. Oczywiście jeśli chcesz obliczać różnice w datach, wtedy powinieneś użyć funkcji, które są do tego przeznaczone -> http://en.cppreference.com/w/c/chrono
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: ToDouble()

Nowy postprzez nvdante » środa, 21 stycznia 2015, 15:00

A więc tak, poczytałem co nieco i faktycznie przyda mi się difftime oraz tak, jak mówił Mironas działa on na time_t.
Popróbowałem i napisałem coś takiego:
KOD cpp:     UKRYJ  
        string linia;
        ifstream odczyt(plik.c_str());
        getline (odczyt, linia);
        cout<<linia<<", "<<czas<<endl;
        odczyt.close();
       
        double x = atof((char*)linia.c_str());
       
        cout<<difftime(czas, x);


linia zawiera wartość: 1421845059
czas zawiera wartość: 1421845285
Wszystko super, tylko, że difftime w wyniku daje: 1.42185e+009.

Czy to wina wyświetlenia wartości bez formatowania?
Co powinienem zrobić, żeby dostać w wyniku 226 przekształcone na np.: 00:03:46?
Próbowałem printf i niby wyświetla się lepiej, ale w wyniku dostaję zmienną czas, a nie różnicę dwóch zmiennych:(

Ps.: Czy jest jakaś biblioteka obsługująca hasła? Wiem, że mogę napisać sobie kod sprawdzający lowercase, uppercase, digit i inne, ale może jest coś gotowe warte zainteresowana? Nie musi mieć wysokiego poziomu zabezpieczenia, chodzi tylko o to, żeby nie przepuszczało każdego.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez polymorphism » środa, 21 stycznia 2015, 15:16

Czy to wina wyświetlenia wartości bez formatowania?

Zajrzałeś chociaż na stronę spod linka, który Ci podałem? Po cholerę to double i atof?! Wiesz w ogóle jakiego typu argumenty przyjmuje difftime, no i co wartości tych argumentów wyrażają?

Ps.: Czy jest jakaś biblioteka obsługująca hasła?

Chodzi Ci o jakąś funkcję haszującą?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: ToDouble()

Nowy postprzez nvdante » środa, 21 stycznia 2015, 15:28

polymorphism napisał(a):Zajrzałeś chociaż na stronę spod linka, który Ci podałem? Po cholerę to double i atof?! Wiesz w ogóle jakiego typu argumenty przyjmuje difftime, no i co wartości tych argumentów wyrażają?

Oczywiście, że przeczytałem to co podesłałeś.
Po takim zapisie:
Kod: Zaznacz cały
double difftime( time_t time_end, time_t time_beg );

rozumiem, że difftime przyjmuje argumenty time_t, a zwraca double, ale bez zastosowania tego co zrobiłem dostaje komunikat:
Kod: Zaznacz cały
[Error] cannot convert 'std::string {aka std::basic_string<char>}' to 'time_t {aka long long int}' for argument '2' to 'double difftime(time_t, time_t)'

Mam sobie zadeklarować long long?
A co wyrażają? Czy chodzi Ci o to, że ten czas jest w sekundach od 1970 roku, czyli normalny timestamp?

Chodzi Ci o jakąś funkcję haszującą?

Nawet nie, raczej tylko o zdefiniowane już policy wpisywania hasła i jego weryfikację ( określenie czy ma np.: 1 dużą literę, czy ma minimum 8 znaków, itd ).
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Re: ToDouble()

Nowy postprzez Mironas » środa, 21 stycznia 2015, 15:45

nvdante napisał(a):Co powinienem zrobić, żeby dostać w wyniku 226 przekształcone na np.: 00:03:46?

KOD cpp:     UKRYJ  
  int x = 226;
  int sek  = x % 60;
  int min  = ((x-sek) / 60) % 60;
  int godz = (x-sek-min*60) / 3600;

  char s[8];
  sprintf(s, "%02d:%02d:%02d", godz, min, sek);
  cout << s << endl;
 


Wg mnie błędem jest zaczynanie nauki programowania od postawienia sobie konkretnego problemu i próby jego rozwiązania.
Powinieneś raczej sięgnąć po jakąś książkę, albo kurs i za ich pomocą krok po kroku poznawać dany język (pętle, funkcje, itp). Wtedy zawsze będziesz najpierw poznawał potrzebną funkcję a dopiero potem będziesz musiał zastosować ją w konkretnym przykładzie.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: ToDouble()

Nowy postprzez nvdante » środa, 21 stycznia 2015, 16:02

Wszystko super tylko w kodzie zakładasz, że mam skąd wziąć 226, a jak napisałem niżej nie mam! Nawet prawidłowo zastosowane wyświetlenie podaje mi wartość drugiej zmiennej, a nie różnicę.
Dobra, spróbujmy pozbyć się tego double i atof. Jak wartość pobraną do stringa mogę wrzucić jako argument time_t? Bo nie mam pojęcia...

Mironas napisał(a):Wg mnie błędem jest zaczynanie nauki programowania od postawienia sobie konkretnego problemu i próby jego rozwiązania.

Różne są szkoły :) Ja robię co mi mówią na uczelni, mam napisać kod to piszę. Poza tym nie można powiedzieć, że jak na początkującego to jest tak strasznie źle. Wiele osób nawet nie zrozumiałoby o czym piszecie, więc może jest jakaś nadzieja :D

Mironas napisał(a):Powinieneś raczej sięgnąć po jakąś książkę, albo kurs i za ich pomocą krok po kroku poznawać dany język (pętle, funkcje, itp). Wtedy zawsze będziesz najpierw poznawał potrzebną funkcję a dopiero potem będziesz musiał zastosować ją w konkretnym przykładzie.

Mam już na sumieniu kilka książek: Borland C++ Builder 3 ( chyba ), Podstawy programowania w języku C/C++ i jakieś tam jeszcze. Ja po prostu nie potrzebuję zbyt często tego robić, więc raczej się nie rozwijam za mocno. A pisanie na uczelni aplikacji: pobierz to, wyświetl to, to nie zadanie, które by mi w tym pomogło.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaFirefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 43 gości

cron