История №364063
< Зелибоба > прикинь как будут праздновать 2048 й год ;-)
< Зелибоба > особенно программисты
< prizrak > а как праздновали 1024!
А вы знаете, что за 10 лет до этого, в 2038 году, наступит апокалипсис
для всех программ, написанных на С и С++?
Дело в том, что в языке С есть встроенный таймер, который отсчитывает
время в секундах от 00.00 01.01.1970 - так когда-то решили изобретатели
языка С Керниган и Ричи. А размерность таймера составляет 31 разряд, то
есть 2147483648 с = 2^31 - 1 с.
Я специально только что посчитал - счетчик переполнится через 68 лет, 35
суток, 3 ч 14 мин 7 сек, то есть 4 февраля 2038 г в 3 ч ночи.
Кто не верит, можете вычислить сколько это - 2147483648 с.
Mike22• 08.10.08 17:46
Абориген СРР:
Еще есть парадокс нужности. Когда я пишу быстро мелкую утилитку, я вполне могу написать и read(time,4) - для себя ж пишу, а так короче.
Парадокс в том, что как раз подобные мелкие утилитки, порой удивительно долгоживучи и расползаются по по коду любимым китайским методом copy/paste.
Mike22• 08.10.08 09:32
111222333:
> Язык С как и С++ не может иметь таймер
А так же не может записывать в файл (этим занимается диск и ОС), рисовать картинки (этим занимается графическая карта и монитор), перемножать два числа (этим занимается процессор) и т.д.
И сидишь ты не в здании, а в своих брюках, наверняка.
Не выебывайся, железячник.
> и продолжать считать, что в компайлере вшит страшный секретный код таймера
Повторю, не выебывайся дебил. Ниже написали про быдлокодеров. Но даже при небыдлокодерах останется проблема совместимости старых данных и новых. А небыдлокодеров - крайне мало.
Gyn:
Угу. Хранится у тебя в файлике время записи, скажем, рождения ребенка '1223443659', что суть сегодняшняя дата. Сместил ты точку отсчета на 50 лет (для красоты), и вуаля, у записи не 2008г, а 2058г. Правда, здорово? Снова в Армию можно. А такое представление времени - дохера где используется.
111222333• 07.10.08 21:59
Интересно, кто выпрямил все извилины студентам программистам?
Уебок.
Язык С как и С++ не может иметь таймер. Таймер - это физическая железяка впаяная в компутер, и считающая колличество секунд прошедших с твоей даты, до текущего времени. А в языке есть функция, которая обращается к этой цифири, и предлогающая ее тебе.
И как только ты завьешь себе хотя бы одну извилину, ну с помощью паяльника, например, то ты поймешь, что вот уже лет как 5 все компы 64 битные, и собрать мамку, где таймерный контролер будет хранить цифирку не в 32 битном, а в 64 битном варианте, уже как-то сподобились. Как и прописать в новой версии билиотеки time вариант, когда определен 64 процессор, выдавать значение 64 битного регистра.
Но если хочешь, можешь обидется и продолжать считать, что в компайлере вшит страшный секретный код таймера.
Gyn• 07.10.08 14:18
ну обнулится и по второму кругу пойдет, не один хер - откуда отсчитывать ?
Абориген СРР• 07.10.08 11:24
Блят, до проблеммы ещё тридцать лет!!! Тридцать!!! Кто из васпомнит что было тридцать лет назад??? Вот и через тридцать лет никто и не вспомнит об этом ибаном счётчике!!!
Hyde
+++++
Ты не одинок.
Те, кто писал на Коболе в 1970м году, тоже не думали о "проблеме 2000", когда выделяли на год две цифры. И, как выяснилось, зря: кое-какие (причем довольно критические) приложения таки дожили до этой проблемы к полному изумлению своих создателей.
=====
Коснётся только виндусов, и только тех для них программ, которые не используют 64-битный таймер.
И причём тут С++?
+++++
Абисняю популярно:
Достаточно какому-нибудь быдлокодеру (http://lurkmore.ru/%D0%91%D1%8B%D0%B4%D0%BB%D0%BE%D0%BA%D0%BE%D0%B4%D0%B5%D1%80#.D0.91.D1.8B.D0.B4.D0.BB.D0.BE.D0.BA.D0.BE.D0.B4.D0.B5.D1.80) написать
size_t time;
myfile->read(&time, 4);
вместо
size_t time;
myfile->read(&time, sizeof(time));
и все - писец. Компиляция под 64 разрядную систему ничего не изменит.
=====
По опыту: перетрясти проект в 140к строк на предмет размерности таймера - 1 человеко/час.
+++++
:-))
Hyde• 07.10.08 10:18
Рабинович на лекции с ужасом переспрашивает - Через сколько потухнет солнце? Лектор ему отвечает - Через пять миллиардов!!! Рабинович, вытирая пот со лба, - Фух. А мне послышалось через пять миллионов!!!
Блят, до проблеммы ещё тридцать лет!!! Тридцать!!! Кто из васпомнит что было тридцать лет назад??? Вот и через тридцать лет никто и не вспомнит об этом ибаном счётчике!!!
Расшумелись, бля
Просто Читатель• 07.10.08 09:59
Это называется слышу звон но не знаю где он.
Этот таймер вообще-то считает не в секундах, а в милисикундах.
В Виндовсе есть свой таймер, который отсчитывает в миллисекундах время работы виндовс и что? через 49 дней непрерывной работы винда взрывается?
А ещё есть 64-х разрядный счётчик тактов процессора и что из этого... дохрена разных счетчиков...
Автора в опу
mangust• 07.10.08 09:47
stranica- esli vam sei4as 30-40 let, v 38 godu budet 70-80. Nekotorye mogut doz't.
epROMa• 07.10.08 06:16
В принципе, права странница - всем будет глубоко насрать на С и 32-х битные системы.
Mike22• 07.10.08 01:50
ktod:
А многие программы вообще вещь в себе - никого из разработчиков не осталось...
Hекий программист-коболист в поте лица трудился над пресловутой проблемой 2000 года. Он чинил программы во многих фирмах и зашибал приличные бабки. Hо по мере приближения роковой даты его все больше охватывал ужас: что будет со всеми этими программами и с ним самим? Hаконец он решил наморозиться и проспать в анабиозе до февраля 2000 года, а там, глядишь, вся свистопляска и уляжется...
... Он проснулся в странном незнакомом помещении, вокруг ликовали люди: "Очнулся, очнулся!".
— Сейчас с вами будет говорить президент Земного Шара.
Hа огромном стереоскопическом экране возник человек, весьма похожий на Билла Гейтса.
— Видите ли, программа вашей камеры при переходе к 2000 году сработала неправильно, и вы проспали почти 8000 лет. Hо вы не волнуйтесь. Hаша жизнь прекрасна. Мы достигли огромных успехов в науке и технике. Мы покорили время и пространство. Мы...
— Hо почему вы меня разморозили?
— Понимаете, приближается 10000 год, а в вашем досье указано, что вы знаете КОБОЛ
Mike22• 07.10.08 01:48
ktod:
То-то аврально работающие товарищи из одной очень крупной организации потратили пару месяцев на проблему с NaN... хотя казалось бы, чего там...
ktod• 06.10.08 22:18
Дружище, эта проблема только кажется таковой. Софт на месте не стоит - он постоянно обновляется. Уже сейчас многие разрабы применяют в своих разработках u64 для хранения времени. А за 30лет все современные проекты будут 1000 раз пересобраны.
По опыту: перетрясти проект в 140к строк на предмет размерности таймера - 1 человеко/час. И это достаточно легко масштабируется.
Если уж говорить о проблеме в целом, то пожалуй, самое сложное - обновить файловые системы. Но и это выполнимо. Вот, Вы заметили переход с нтфс4 на нтфс5?
странница• 06.10.08 21:04
а чего вы, господа, переполошились? Кто из вас доживет до 2038? А кто доживет, тому будет так насрать, что будет с 30-летним софтом! Кто из вас юзает софт 1978 года?
Mike22• 06.10.08 21:02
Мефодий1:
int64 не решит проблему работы старых программ.
Хрюш:
Вали обратно в свинарник, чмо.
Билли• 06.10.08 20:54
Не ссы чувачок , решим твой апокалипсис.. за небольшие комиссионные ессно
и_т• 06.10.08 17:53
Гаспода,я тут как раз с научной канференции по проблемам савместимости и синхранизации пратоннога трансфлюкатора с малым светодисперсионным (не путать с большим коллайдиром!!).Аднако,не углубляясь в тему,скажу,што большинству пофиг где реализована функция счедчика и с какой разрядностью.Мефодий,читай прессу папросче.Ладно,пайду,меня каллеги-асперанты и другие учёные ждут
Всем
Таймер, конечно, не в самом языке, а в функции вычисления текущего времени. Такие функции есть во всех языках высокого уровня.
Проблема коснется и виндов, и юниксов, ибо проблема в языке программирования, а не в системе. Компиляторы С во всех системах есть.
Языка С++ проблема тоже коснется, так как в нем эта функция напрямую из С перекочевала.
Наивный
Спасибки за ссылку. Начал пересчитывать и понял, что я дурак - не учел, високосных дней, коих за 68 лет накопится как раз 17. Поэтому событие произойдет не через 68 лет 35 суток, а через 68 лет 18 суток, то есть как раз 19 января.
Mike22
unsigned int32 действительно только отодвинет проблему. А вот int64 решит ее окончательно, потому что ко времени исчерпания этого запаса уже, наверно и языка С не будет как такового.
Ireul
Угу. Можно подумать, что unixов не коснется. И чему только в сейчас институтах учат...
Mike22• 06.10.08 14:31
Идиотам, отметившимся ниже:
Конечно, в самом языке таймера нет. Но мало ли, в какой стракт засунут инт32 с текущим временем? Мало ли функций, использующих в качестве параметра для времени тот же инт32? Не, я понимаю, дебилам ничего кроме "хайло уорд" не писавших, этого не понять, но бля... не позорьте звание программиста, мудоиды.
ЗЫ: По теме, думаю, что инт32 почти безболезненно можно в ансигнед инт 32 перевести, что отодвинет проблему еще на 2/3 века.
Ireul• 06.10.08 14:29
Коснётся только виндусов, и только тех для них программ, которые не используют 64-битный таймер.
И причём тут С++?
6610• 06.10.08 13:37
омг
запостил бы на баш, там таких дебилов дохуя
здесь правда не меньше
ты по обмену?
И что?Мы ан.ру читать не сможем?Мню тоже не шарит в ентих заморочках.
Мобуту Сесе Секо Куку Нгбенду Ва За Банга• 06.10.08 12:47
Ни фига в этом не шарю...Да и пофиг мне есть такая проблема или нет.
Смеяться то где?
Гость• 06.10.08 12:40
Таймер в языке программирования? Как говорил поручик Ржевский, "оргинально..."
nei• 06.10.08 12:35
Он хотел написать про 32-х разрядные операционки. Им действительно будет нехорошо, только вот кто на них будет до того времени сидеть?
Мефодий1
Еще вот это прочтите: http://en.wikipedia.org/wiki/Year_2038_problem
Чтобы было о чем писать завтра.
Мефодий1• 06.10.08 11:56
NULL
Интересно, а в какой справке ты это прочел? Получается, что таймер еще и с ошибкой, если он даже 31 разряда полностью отсчитать не может.
нахнах
Не в дебелизоре, а в журнале "Upgrade".
в дебелизоре увидал?
ващето креос не хуже седняшней пятикратной кошкойбки, такая же хуйня.
походу моск всех аффтаров колайдером контузило
Гость• 06.10.08 11:42
афтор устраивайся на фирму компутерную. Будешь лохов по примеру 2000 разводить
NULL• 06.10.08 11:22
Чувак, ты гений, канешна, но прежде чем такие мегавычисления делать -- не помешало бы справку почитать -- знал бы что сие знаменательное событие произойдет January 18, 2038...
Но не все так плохо (прикинь, об этой проблеме до тебя задумались...) -- есть __time64_t -- посчитай-ка когда он дотикает