LINUX.ORG.RU

Ошибка в с++ 11 после обновления компилятора и возврата обратно


0

1

На Убунту 13.04 поставил последний компилятор gcc4.7.3-2 из сторонних репозиториев, снес, и вернул назад все из офицального (gcc4.7.3-1), но проблема появилась, неверно работать начал std::chrono. Все что знал переставил, но проблема осталась, что можете подсказать? Заранее благодарю.

#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

int main() {
	typedef std::chrono::duration<double> seconds_type;

	const auto& start_time = std::chrono::high_resolution_clock::now();
	cout << "start waiting for 3 seconds" << endl;
	this_thread::sleep_for(seconds_type(3));
	const auto& finish_time = std::chrono::high_resolution_clock::now();
	const auto& time_wait = finish_time - start_time;
	const auto& time_wait_sec = std::chrono::duration_cast<std::chrono::seconds>(time_wait);
	const auto& time_wait_double_sec = std::chrono::duration_cast<seconds_type>(time_wait);
	cout << "time_wait: " << time_wait.count() << "\n";
	cout << "seconds: " << time_wait_sec.count() << "\n";
	cout << "seconds double: " << time_wait_double_sec.count();
	return 0;
}
Результат выполнения на моей машине:
start waiting for 3 seconds
time_wait: 3000177
seconds: 0
seconds double: 0.00300018
Хотя я надеюсь что секунды будут равны 3.

λ> cat test.cpp 
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

int main() {
  typedef std::chrono::duration<double> seconds_type;

  const auto& start_time = std::chrono::high_resolution_clock::now();
  cout << "start waiting for 3 seconds" << endl;
  this_thread::sleep_for(seconds_type(3));
  const auto& finish_time = std::chrono::high_resolution_clock::now();
  const auto& time_wait = finish_time - start_time;
  const auto& time_wait_sec = std::chrono::duration_cast<std::chrono::seconds>(time_wait);
  const auto& time_wait_double_sec = std::chrono::duration_cast<seconds_type>(time_wait);
  cout << "time_wait: " << time_wait.count() << "\n";
  cout << "seconds: " << time_wait_sec.count() << "\n";
  cout << "seconds double: " << time_wait_double_sec.count();
  return 0;
}
λ> g++ --version
g++ (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

λ> g++ -std=c++11 test.cpp -o test
λ> ./test
start waiting for 3 seconds
time_wait: 3000210
seconds: 3
seconds double: 3.00021%
λ> dpkg --list |grep chrono-dev |awk '{print $2 " " $3}'
libboost-chrono-dev 1.49.0.1
Deleted
()

Ну вот что это за трэш:

typedef std::chrono::duration<double> seconds_type;

	const auto& start_time = std::chrono::high_resolution_clock::now();
	cout << «start waiting for 3 seconds» << endl;
	this_thread::sleep_for(seconds_type(3));
	const auto& finish_time = std::chrono::high_resolution_clock::now();
	const auto& time_wait = finish_time - start_time;
	const auto& time_wait_sec = std::chrono::duration_cast<std::chrono::seconds>(time_wait);
	const auto& time_wait_double_sec = std::chrono::duration_cast<seconds_type>(time_wait);
Наверное, только на ассемблере нельзя написать компактнее и читаемее; а хотя, там же макросы есть. Ну лол.

anonymous
()
Ответ на: комментарий от quest

чистый C все больше и больше читабельней на фоне этого c++11 ужаса

    using namespace std::chrono;

    auto time_wait_sec = duration_cast<seconds>(time_wait);
//                       ^ конвертировать
//                                     ^ в секунды
//                                              ^ это
//  ^ seconds, но уже было, не повторяем

В чём прикол? В си можно заменить пространства имён и шаблоны префиксами:

    std_chrono_seconds time_wait_sec = std_chrono_convert_to_seconds(time_wait);

Красота.

З.Ы. g++ 4.7.3, clang++ 3.2 — УМВР.

quasimoto ★★★★
()
Ответ на: комментарий от quest

auto для ленивых

Yдобно. Причем код ещё и читабельнее будет если применять не бездумно. Да и чем плохо «лениться», когда результат не хуже?

, треды C++11 заместо pthread туда же.

Кроссплатформенность + удобство.

использовать using namespace - запутывать еще больше.

Зависит от использования. В данном случае, проблем не вижу. Если не нравится, то можно и так:

using std::chrono::duration_cast;

DarkEld3r ★★★★★
()
Ответ на: комментарий от quasimoto

В чём прикол? В си можно заменить пространства имён и шаблоны префиксами

Насчёт namespaces — их можно локализовать в пределах определённого scope-а, а префиксы нужно добивать повсюду. Ну и про шаблоны — попробуй в compile-time ввести ограничения на префиксы функций.

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Надо было кавычки поставить.

«Красота».

Прикола я не понял про ёрничание на тему «ололо этот ваш С++ уже трэшовее сишки/ассемблера». Так что, да, предложение менять пространства имён и шаблоны на префиксы и auto на типы которые уже были озвучены в префиксе это такая ирония.

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.