Суббота, 01 Октября 2022, 23:37

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » out of memory
out of memory
karuyДата: Среда, 25 Января 2012, 16:52 | Сообщение # 21
заслуженный участник
Сейчас нет на сайте
Ти скачал то что я переделал?
TimKruzДата: Среда, 25 Января 2012, 17:37 | Сообщение # 22
старожил
Сейчас нет на сайте
Скачал, глянул исходник... Ну что я могу сказать... Реально жрёт всю доступную память... Сейчас объясню, почему, и как бороться.
Code
s:=mmo1.Text; //Текст для шифровки
i:=Length(s); //Длина этого текста
pass:=edt1.Text; //Ключевое слово - пароль
j:=Length(pass); //Длина пароля
h:=Round(i/j); //Делим длину текста на длину пароля
for b:=1 to h do
pass:=pass+pass; //Складываем наш пароль h раз

Теперь предположим следующее: мы ввели 100 символов для зашифровки (не важно, какие) и пароль в один символ (например, "ы"). Получаем h=100. Далее получается следующее: после первого входа в цикл - наш пароль в переменной pass равен "ыы"
Code
2 - ыыыы
3 - ыыыыыыыы
4 - ыыыыыыыыыыыыыыыы
5 - ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы
6 - ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы
7 - ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы
...

...и так ещё 93 раза. Теперь понятно? То есть, чтобы сэкономить память, нам нужно вводить относительно - текст короче и пароль длиннее...
Вот, поставил эксперимент, используя твою первую версию программы. Короче... 2003 символа осмысленного текста, и довольно длинный пароль в 140 символов. Конечно, шифровалось довольно долго, но результат был получен без ошибок - 2035 символов. Я не подбирал конкретные числа, просто взял кучку анекдотов, а пароль сходу придумал.
А вот чтобы ошибка не появлялась... Тут можно либо отлавливать ошибку по ходу, либо вычислять вероятность её появления, исходя из памяти компьютера, длины текста и длины пароля. Проще всего - уже во время шифровки, но с точки зрения пользователя - это неудобно, ведь программа работает впустую. Вот вариант, как отловить ошибку во время выполнения:
Code
try //Блок "Попытаться сделать..."
//Тут находится весь код TForm1.btn1Click, т.е. try идёт сразу после первого begin, хотя можно более локально организовать, но это надо искать проблемный участок
except //Ошибка?
//Тут можно написать on E:Класс_Ошибки do ... чтобы можно было бы получить дополнительную информацию об ошибке, но это сейчас нам не нужно...
             messagedlg('Не хватает памяти! Введите более длинный пароль или сократите шифруемый текст.',mtError,[mbOk],0); //Покажем сообщение
end; //Этот end идёт перед end'ом процедуры

Тогда выведется наше сообщение об ошибке и всё, больше ничего. В принципе, можно обрабатывать эту ошибку не простым выводом сообщения о ней, но и, например, применением другого алгоритма шифрования. Или увеличением пароля дополнительными случайными буквами, с извещением пользователя об этом и перезапуском процедуры шифрования.
Кстати, это сообщение генерируется не только циклом for, но и чем-то другим (далее по коду), но мне лень искать. biggrin

P.S. Вообще ты не очень хорошо всё сделал. Например, использовал две вкладки с абсолютно одинаковыми компонентами. Это лишняя нагрузка. Можно оформить всё проще и рациональнее в несколько раз. Также, обнуление данных в форме можно делать процедурой TMemo.Clear. И ещё: старайся делать отступы в, например, два пробела в коде, там где нужно - это повышает читабельность кода; ещё не забывай писать комментарии, чтобы не забыть, как и что тут работает; то же касается названий компонентов - их нужно называть по смыслу, например: usertext, password, textresult (поля ввода), analyse (кнопка) или start...

***
Вот, на всякий случай держи свой код. Это твой немного переделанный первый исходник. Только, чтобы увидеть моё сообщение, запускай не из Delphi, а прямо из Windows. Т.е. скомпилируй, найди *.exe и запускай.
Я там "Нехватает" написал слитно... Не заметил сразу, а теперь лень перезаливать эти три с половиной килобайт... facepalm

***
Вообще непонятно, как такая простая ошибка может вызывать проблемы... huh Выучи сначала Паскаль, прежде чем браться за примеры из видеоуроков... А то ты ведь даже не понял, как это работает, хотя принцип прост, потому и обратился на форум за помощью...




Сообщение отредактировал TimKruz - Среда, 25 Января 2012, 17:56
kvestproДата: Среда, 25 Января 2012, 22:00 | Сообщение # 23
заслуженный участник
Сейчас нет на сайте
TimKruz, а как сделать чтобы ошибки не было? на видеоуроке человек пишет огромный текст и пароль "код!!!" и все работает
Я пишу тоже самое и ...


Инверсная кинематика в Unity
Алгоритм поиска пути Jump Point Search
karuyДата: Среда, 25 Января 2012, 22:50 | Сообщение # 24
заслуженный участник
Сейчас нет на сайте
http://rghost.ru/36096142
На твоем месте я б в отдельном потоке все делал, а то прога подвисает на приличное время и руки тянуться к диспетчеру задач


Сообщение отредактировал karuy - Среда, 25 Января 2012, 22:54
TimKruzДата: Среда, 25 Января 2012, 22:56 | Сообщение # 25
старожил
Сейчас нет на сайте
karuy, ты просто удалил ту строчку с циклом?.. huh
Quote (kvestpro)
а как сделать чтобы ошибки не было?

Ну так я тебе и написал, как это сделать. Это не ошибка, а "исключение"...
Quote (kvestpro)
на видеоуроке человек пишет огромный текст и пароль "код!!!" и все работает

Эээ... Либо ты что-то не так напечатал (ну, ошибся где-то), либо у автора урока очень мощный компьютер. Попробуй посмотреть урок ещё раз, и проверь код.


karuyДата: Четверг, 26 Января 2012, 00:12 | Сообщение # 26
заслуженный участник
Сейчас нет на сайте
Quote (TimKruz)
karuy, ты просто удалил ту строчку с циклом?..

Нет, писал же поправил. Запусти посмотри, еррора нет - шифрует коректно. Если не заметил что, вот:

Рабочий исходник з пофиксиной траблой кинул еще в посте №19, но топик стартер проигнорил.
kvestproДата: Четверг, 26 Января 2012, 22:22 | Сообщение # 27
заслуженный участник
Сейчас нет на сайте
karuy, не-а... я все исходники открывал и все были с ошибкой...
комп у меня достаточно мощный (4 ядра 3.2 ггц, 8 гб озу, 1 гб видео,) не супер,но эта прога должна летать, а она не летает dry


Инверсная кинематика в Unity
Алгоритм поиска пути Jump Point Search
TimKruzДата: Пятница, 27 Января 2012, 22:10 | Сообщение # 28
старожил
Сейчас нет на сайте
Quote (kvestpro)
комп у меня достаточно мощный (4 ядра 3.2 ггц, 8 гб озу, 1 гб видео,) не супер,но эта прога должна летать, а она не летает

А почему, собственно, она должна "летать"? Она и так неплохо работает... Шифровка сложными алгоритмами всегда занимает много времени и ресурсов...
Quote (karuy)
Нет, писал же поправил. Запусти посмотри, еррора нет - шифрует коректно. Если не заметил что, вот:

Понятно.


Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » out of memory
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг