IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> о динамических строковых массивах в Паскале
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Женский

Репутация: -  0  +


Здравствуйте, господа!

Такая проблема возникла.

Задачка на поиск дублетов(пар слов, разнящихся между собой в одной букве) в считанном из файла словарике. Для того чтобы эти самые дублеты найти, необходимо, как я понимаю не раз погонять словарь. Соотвественно считать надо все это счастье в строковый массив. В условии оговорено, что размер словаря не должен превышать 25143 слова, каждое из которых не более 16 символов.

Вот тут и все проблемы начались. То, что я в статический массив не уложусь со своим словариком я поняла сразу smile.gif. Сделала динамический вариант обработки.

Код
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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






type
p_str = ^str_char; { <--- Вот этот указатель на строку }
str_char = string[w_max];{это для динамического строкового массива}

TDynArr = array[1 .. 1] of p_str;
PDynArr = ^TDynArr;


а теперь вместо:
     {этот самый динамический строковый массив объявляем}
GetMem(p_arr, n * SizeOf(str_char));

{зачитываем слова в словарь}
делаем так (добавляем один шаг):

{этот самый динамический строковый массив объявляем}
GetMem(p_arr, n * SizeOf(p_str)); { <-- Взяли массив указателей }
For i := 1 to n do New(p_arr^[i]); { <--- выделяем, собственно, память под саму строку }

{зачитываем слова в словарь}
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;

(набирал прямо здесь, но по-моему нигде не ошибся)

Если памяти по-прежнему не будет хватать - присоединяй программу и словарь полностью, будем искать еще и другие пути освобождения "кучи"...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Carin   о динамических строковых массивах в Паскале   14.05.2007 21:12
volvo   , то тогда у тебя происходит следующее: ... …   14.05.2007 21:18
Carin   Сколько памяти ты берешь? 20000 * 16 = 320000, а …   14.05.2007 21:28
volvo   type p_str = ^str_char; { <--- Вот этот ука…   14.05.2007 21:36
Carin   volvo, большое спасибо тебе за помочь, но! 88…   14.05.2007 22:07
volvo   Я посмотрел на словарик, и у меня созрело еще одно…   14.05.2007 22:11
Carin   Я посмотрел на словарик, и у меня созрело еще одн…   14.05.2007 22:15
volvo   Вот, посмотри чего я наваял... Программа заточена …   14.05.2007 23:25
Carin   Вот, посмотри чего я наваял... Программа заточена…   15.05.2007 0:19
volvo   Без понятия... У меня вот такие настройки: Как ви…   15.05.2007 1:00
Carin   Без понятия... У меня вот такие настройки: Как в…   15.05.2007 1:30
volvo   Попробуй выйти из IDE, и запустить без нее EXE-шни…   15.05.2007 2:03
Carin   Попробуй выйти из IDE, и запустить без нее EXE-шн…   15.05.2007 2:11
volvo   Попробуй...   15.05.2007 2:14
Carin   Попробуй... Нда, не хочет.... Чем дальше, тем з…   15.05.2007 2:24
Lapp   Я извиняюсь, что вторгаюсь в беседу :) Но почему б…   15.05.2007 11:16
volvo   И чем это принципиально отличается от решения в по…   15.05.2007 13:17
Carin   Lapp, раз Вы заинтересовались данной темой, то не …   16.05.2007 6:02
Lapp   А то как-то даже раздражает такое непоследователь…   16.05.2007 9:33
ramzes   А "protected mode" можно использовать?   16.05.2007 7:07
volvo   А "protected mode" можно использовать?Ка…   16.05.2007 14:13


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:58
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name