![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Carin |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Здравствуйте, господа!
Такая проблема возникла. Задачка на поиск дублетов(пар слов, разнящихся между собой в одной букве) в считанном из файла словарике. Для того чтобы эти самые дублеты найти, необходимо, как я понимаю не раз погонять словарь. Соотвественно считать надо все это счастье в строковый массив. В условии оговорено, что размер словаря не должен превышать 25143 слова, каждое из которых не более 16 символов. Вот тут и все проблемы начались. То, что я в статический массив не уложусь со своим словариком я поняла сразу ![]() Код const n_max = 25000;{это максимальное количество слов в словаре} w_max = 16;{это максимальная длина слова} label 1, 2;{метки для проверок} type str_char = string[w_max];{это для динамического строкового массива} TDynArr = array[1..1] of str_char; PDynArr = ^TDynArr; var f: text;{файл со словарем и парами для поиска} t_wd2: str_char; n, i, j: word; p_arr: PDynArr;{динамический строковый массив} begin assign(f, 'input.txt'); {сначала выясняем количество слов для получения динамического массива} reset(f); n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 1; n:= n + 1; end; 1: close(f); reset(f); {этот самый динамический строковый массив объявляем} GetMem(p_arr, n * SizeOf(str_char)); {зачитываем слова в словарь} writeln('Производится считывание словаря...'); i:= 1; n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 2; n:= n + 1; p_arr^[n]:= t_wd2; end; 2: writeln('Найдено ', n, ' слов в словаре'); close(f); {чистим собственно массив} FreeMem(p_arr, n * SizeOf(str_char)); Вот когда производится зачитывание всего словарика около 20 тыс слов разной длины, то выходит при попытке вывода на экран полученного массива, какая-то белиберда. То есть почему-то первые элементы массива оказываются затертыми последующими с повторами, с вкраплениями каких-то непечатных символов и т.д. Хотя при считываниии когда вывожу каждый новый считанный элемент для контроля - все правильно. Что это? Игры с памятью? Могу приложить полный код и словарик при необходимости. Сообщение отредактировано: Carin - 14.05.2007 17:14 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Вот когда производится зачитывание всего словарика около 20 тыс слов разной длины , то тогда у тебя происходит следующее:... Сколько памяти ты берешь? 20000 * 16 = 320000, а ведь можешь - только 65К... Тебе надо пойти еще дальше, и сделать не массив строк, а массив указателей на строки... Справишься, или помочь? |
Carin |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Сколько памяти ты берешь? 20000 * 16 = 320000, а ведь можешь - только 65К... Что меня смутило - не было run-time error насчет heap overflow. Почему? Просто перезаписываются начальные элементы. Тебе надо пойти еще дальше, и сделать не массив строк, а массив указателей на строки... Справишься, или помочь? Вот попробовала через линейный связный список, тут все четко - при переборе от 10 тыс. сразу идет сообщение об ошибке, но накладки нет. Код const n_max = 10000; label 2; type TWordStr = string[16]; PTItem = ^TItem; TItem = record Data: TWordStr; next: PTItem; end; TWordList = record first, last: PTItem; end; procedure InsertWord(var L: TWordList; s: string); var p: PTItem; begin New(p); p^.Data := s; p^.next := nil; if L.first = nil then L.first := p else L.last^.next := p; L.last := p end; var p, p2: PTItem; L: TWordList; f: text; t_wd: TWordStr; i: word; begin assign(f, 'input.txt'); reset(f); i:= 0; while not eof(f) do begin i:= i + 1; if i > n_max then goto 2; readln(f, t_wd); InsertWord(L, t_wd); end; 2: close(f); {проверяем вывод, не покорежены ли элементы} p:= L.first; i:= 0; while p <> nil do begin i:= i + 1; p2:= p; while p2 <> nil do begin WriteLn(p^.Data, '-', p2^.Data); p2 := p2^.next; end; p := p^.next; end; readln; end. Но все-таки очень интересно, можно ли выкрутиться на все 100% ![]() ![]() |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
type а теперь вместо: {этот самый динамический строковый массив объявляем}делаем так (добавляем один шаг):
(набирал прямо здесь, но по-моему нигде не ошибся) Если памяти по-прежнему не будет хватать - присоединяй программу и словарь полностью, будем искать еще и другие пути освобождения "кучи"... Сообщение отредактировано: volvo - 14.05.2007 17:37 |
Carin |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
volvo, большое спасибо тебе за помочь, но! 8815 - вот предел при такой схеме. Зато перестали "сползать" элементы массива.
В принципе, я так думаю, это проблема самого Паскаля, ее не переплюнуть как таковую. Кстати, у меня компилятор - Turbo Pascal, не Borland - интересно, это может иметь значение ![]() Ну вот, прога на всякий случай и словарик. Прикрепленные файлы ![]() ![]() |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Я посмотрел на словарик, и у меня созрело еще одно предложение - чтоб "съедалось" меньше памяти можно сделать "плавающий" размер строки, т.е. выделять именно столько памяти, сколько надо для хранения, а не всегда по 16 байт... Это сильно увеличит число читаемых слов...
![]() |
Carin |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Я посмотрел на словарик, и у меня созрело еще одно предложение - чтоб "съедалось" меньше памяти можно сделать "плавающий" размер строки, т.е. выделять именно столько памяти, сколько надо для хранения, а не всегда по 16 байт... Это сильно увеличит число читаемых слов... ![]() Это прекрасная мысль, но я не соображу как ее порешать. Вроде как размер string требует фиксированного размера? А объявлять через массив char каждое слово - брррр... ![]() |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Вот, посмотри чего я наваял... Программа заточена под TP, больше нигде работать не будет (я имею в виду современные компиляторы), но вроде читает все слова из словаря... И наложения никакого нет:
program FindLinks; ![]() |
Carin |
![]()
Сообщение
#9
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Вот, посмотри чего я наваял... Программа заточена под TP, больше нигде работать не будет (я имею в виду современные компиляторы), но вроде читает все слова из словаря... И наложения никакого нет: ... Гхм... У меня run-time error - heap overflow. Memory sizes вроде все выставила по максимуму. Странно. Что это может быть? ![]() Сообщение отредактировано: Carin - 14.05.2007 20:20 |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Что это может быть? Без понятия... У меня вот такие настройки:Как видишь, окно Output показывает что словарь прочтен и распечатан полностью... Кстати, сколько у тебя окон открыто в IDE Паскаля? Эскизы прикрепленных изображений ![]() |
Carin |
![]()
Сообщение
#11
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Без понятия... У меня вот такие настройки: Как видишь, окно Output показывает что словарь прочтен и распечатан полностью... Кстати, сколько у тебя окон открыто в IDE Паскаля? Мда.... Все вроде по умолчании... Окно одно и копия IDE одна... Загадка природы просто.... Нужно независимое тестирование, однако ![]() |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Попробуй выйти из IDE, и запустить без нее EXE-шник, если будет то же самое, я присоединю свой, проверишь его у себя... Что-то не в порядке, однако...
|
Carin |
![]()
Сообщение
#13
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Попробуй...
Прикрепленные файлы ![]() |
Carin |
![]()
Сообщение
#15
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#16
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Я извиняюсь, что вторгаюсь в беседу
![]() Но почему бы не брать просто массив по частям? Большими частями, по 64К. Тогда накладные расходы (на пойнтеры) будут минимальны (частей-то не больше десятка). Доступ можно организовать через две процедурки: положить и вынуть. Вот, примерно так: const -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата Я извиняюсь, что вторгаюсь в беседу И чем это принципиально отличается от решения в посте №8?Если тот вариант не отработал (хотя вот ЭТО непонятно, почему на одном компьютере оно работает, а на другом - нет), то практически гарантированно, что и предыдущий пост поведет себя так же... |
Carin |
![]()
Сообщение
#18
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Lapp, раз Вы заинтересовались данной темой, то не могли бы Вы любезно поучаствовать в исследовании этого загадочного феномена? volvo пристегнул готовую exe-шку, у него она полностью рабочая, у меня сразу дает ошибку выполнения. Интересно. что получится на других машинах. А то как-то даже раздражает такое непоследовательное поведение проекта
![]() Сообщение отредактировано: Carin - 16.05.2007 2:03 |
ramzes |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
А "protected mode" можно использовать?
|
Lapp |
![]()
Сообщение
#20
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
А то как-то даже раздражает такое непоследовательное поведение проекта ![]() Раздражение - вешь хорошая, если вынуждает к действию. В противном случае лучше раздражать центр удовольствия.. ![]() Насколько я понял, экзешник и сорс ведут себя одинаково. Значит, я бы обратился к сорсу. Пройтись по нему дебаггером (или просто наставить промежуточных печатей) и локализовать ошибку. Далее, посмотреть, как она происходит. Я понимаю, что это слишком общие рекомендации, но именно так следует действовать, если ничто другое не помогает. Что касается меня, то код volvo у меня отработал, как положено ![]() Кстати, carin, а все же как мой код работает у тебя?.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 21.07.2025 1:10 |