Показать полную графическую версию : Переменная цикла и UInt64
novashdima
09-02-2013, 05:57
Типа Cardinal уже не хватает для переменной цикла, даже Int64 маловат будет, к тому же у меня не может быть отрицательного значения, поэтому лучше всего будет использование UInt64, но проблема в том, что и Int64 и UInt64 не являются ordinal типом, что несоответствует требованиям к переменной цикла. Городить длинную арифметику для сотен случаев не очень удобно, к тому же это лишнее процессорное время, а задача не такая легкая, чтобы на это тратить время.
novashdima, может расскажите изначальную задачу? Ну так, шутки ради, а то с "после пятницы" экстрасенсорика хромает.
Tonny_Bennet
09-02-2013, 10:47
novashdima, присоединяюсь к вопросу lxa85. Хотелось бы узнать для каких целей такие значения счётчика?
P.S. Помнится мне один преподаватель рассказывал, что есть сторонние библиотеки (на С), в которых реализована арифметика и соответственно процедуры создания/хранения больших чисел. Может и на Delphi подобные писали. Поищите.
Попробуйте цикл while или repeat..until. В большинстве случаев ими можно заменить for.
Delirium
09-02-2013, 14:40
В конце концов можно взять наше огромное число, взять максимум Int64, поделить и сделать 2 цикла один-в-одном и считать что нам нужно. Никакой сложной арифметики.
novashdima
09-02-2013, 16:46
P.S. Помнится мне один преподаватель рассказывал, что есть сторонние библиотеки (на С), в которых реализована арифметика и соответственно процедуры создания/хранения больших чисел. Может и на Delphi подобные писали. Поищите. »
Вы имеете в виду стандартная длинная арифметика, такое я сам реализовывал много раз.
Попробуйте цикл while или repeat..until. В большинстве случаев ими можно заменить for. »
А циклу while точно не нужна порядковая?
может расскажите изначальную задачу? »
Все довольно банально, загружаю для обработки файл, один из параметров файла - размер, для этого параметра используется Cardinal, если попробовать загрузить файл >4294967295 байт, то есть 4 Гб, то будет печально.
А циклу while точно не нужна порядковая? »
Точно. Цикл While работает по логическому условию, а не по перечислению.
Посмотрите, наверняка существуют функции возвращающие размер файла. В крайнем случае сделайте 2 функции работы с длинной файла, до 4Гб и более 4Гб с использование длинной арифметики. Ну или разбейте на 2-3 переменные, как подсказывает Delirium. Так ли нужна унификация функции, если она крайне негативно скажется на производительности программы?
загружаю для обработки файл »
Что за обработка такая, что нужно пробегать циклом столько раз, каков размер файла?
novashdima
09-02-2013, 19:45
Точно. Цикл While работает по логическому условию, а не по перечислению. »
Хорошо, попробую переправить весь код на while
Что за обработка такая, что нужно пробегать циклом столько раз, каков размер файла? »
Я не пробегаюсь по файлу столько раз, каков размер файла, я считываю по байтам.
cookie_monster
09-02-2013, 23:21
Вы имеете в виду стандартная длинная арифметика, такое я сам реализовывал много раз. »
Что-то не верю данному утверждению, в соседней теме не можете написать выход в обработчике. А здесь рассказываете о реализации сторонних арифметических функций.
novashdima
09-02-2013, 23:47
Что-то не верю данному утверждению, в соседней теме не можете написать выход в обработчике. А здесь рассказываете о реализации сторонних арифметических функций. »
Длинная арифметика проходится еще на стадии изучения алгоритмов и написание программ на Паскале
В соседней ветке я спрашиваю о среде разработки Delphi, так как действительно не знаю, можно ли в ObjectInspector на Event-е написать вызов event-а формы. Конечно я могу сделать как всегда, создать процедуру обработки нужного мне event и оттуда вызвать event формы, но имхо это бредово, хотя я конечно не спорю с теми, кто создавал стандарты. В помощи не написано, можно ли в качестве обработчика указать другой Event, там только рассказывается как создать свой.
Поэтому, если ВСЕ в данной ветке такие умные, то напишите, можно или нет и линк с документацией, где про это четко написано.
И вообще, почему вы думаете, что длинная арифметика настолько сложная задача? При изучении паскаля после прохождения массивов даются задачи на длинную арифметику, ведь все, что нужно сделать, это пробежаться по входной строке, посимвольно занести в массив, потом если допустим надо умножить длинные числа, то просто перемножаем массивы с конца и заносим в третий массив, из массива потом в строку и выводим пользователю, дел на пару минут.
Tonny_Bennet
12-02-2013, 11:20
я считываю по байтам. »
Опять же не помню как это на делфи, но мне кажется есть что-то типа побайтового чтения пока не достигнут конец файла.
while (!file.EndOfFile) do
{
read_byte(file)
}
novashdima
12-02-2013, 19:50
Опять же не помню как это на делфи, но мне кажется есть что-то типа побайтового чтения пока не достигнут конец файла. »
Там есть ReadAllBytes, можно его использовать, загрузив файл в байтовый массив, а потом обработать, но есть и упомянутый ReadByte:
Delphi function ReadByte: Byte; virtual;
C++ virtual System::Byte __fastcall ReadByte(void);
Также есть еще ReadBytes, хотя из документации я не понял особой разницы в последних двух командах, но обе считывают данные из потока. Так что придется загружать все это дело в TFileStream, а потом уже readbyte юзать
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.