Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2010, 12:26   #1
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию Проблема с изменением значений в динамической структуре

Добрый день. Уже который день убиваю себе мозг, и не могу найти слабое место.

Код:
type
  PTree=^TTree;
  TTree=record
    L,R:PTree;
    sod:integer;
  end;
{-------------------}
procedure build_S(var F:textfile; var Q:PTree);
begin
  while not EOF(F) do
    begin
      if Q=nil then
        begin
          readln(F,Q^.sod);//!!!
        end
      else begin
        Q^.R^.L:=Q;
        build_S(F,Q^.R);
      end;
    end;
end;
Идея: прочитать из файла числа, записать по порядку в Q^.sod(вроде как слева на право, первый Q^.L=nil, остальные Q^.R до определенного момента содержат значения мз текстовика.

Проблема: не получается сохранить данные в Q^.sod. пробовал отладку клавишей F7, доходит до места обозначеного в коде "!!!", затем вылетает. при этом, если в процедуре, в разделе VAR(которого у меня нет, ибо незачем) объявить I:integer и читать в нее, то все получается. если в VAR'e объявить какое-нибудь W:PTree, то в него тоже нормально читает, а в мой злополучный Q не хочет ни при каких условиях, хотя он тоже объявлен через var, при объявлении процедуры.

Пробовал урезать процедуру до простейшего

Код:
procedure build_S(var Q:PTree);
begin
Q^.sod:=5555;
end;
и тот же результат.
Объясните пожалуйста, ЧТО тут может быть не так.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 28.06.2010, 13:09   #2
Ol'ga_new
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 125
По умолчанию

А какую ошибку выдает? Может файл не открыт?
Ol'ga_new вне форума Ответить с цитированием
Старый 28.06.2010, 13:25   #3
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

я же говорю, в I читает, файл открыт. кароче, вот вся прога (ну не вся конечно, но та часть, которую я сейчас терзаю).

Код:
program nevazhno;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
  PTree=^TTree;
  TTree=record
    sod:integer;
    L,R:PTree;
  end;

VAR
  T:textfile;
  S:PTree;

procedure build_S(var F:textfile; var Q:PTree);
begin
  while not EOF(F) do
    begin
      if Q=nil then
        begin
          readln(F,Q^.sod);
        end
      else begin
        Q^.R^.L:=Q;
        build_S(F,Q^.R);
      end;
    end;
end;

BEGIN
  assign(T,'source.txt');
  {$i-}
  reset(T);
  {$i+}
  if IOResult<>0 then
    begin
      writeln('file not found');
      readln;
      HALT;
    end;
  new(S);
  S:=nil;
  build_S(T,S);
  writeln(S^.sod);
  readln;
END.
вот так. ошибок вообще не выдает, компилируется нормально.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 28.06.2010, 13:31   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
procedure build_S(var Q:PTree);
Любопытно. Это указатель на твое дерево, а где самое дерево? Чето я его не вижу... Есть
Код:
new(s);
а затем сразу
Код:
S:=nil;
Что-то мутновато как-то. Хотите причину всех бед? Вы не представляете алгоритм. И далее, нет комментариев, помогающих это делать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.06.2010, 17:29   #5
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

ну, с S:=nil я намудрил конечно, не отрицаю. однако нил я поставил уже после туевой хучи эксперимантов, пытался подтосовать под процедуру (хотя умом я понимаю, что он и так сразу нил).

и что каcается PTree и TTree - деревьев тут нет, просто такое обозначение мне привычнее, с тем же успехом мог назвать PKust и TKust или еще что-нибудь. вопрос в другом, почему я не могу изменять содержимое параметра, заданого через var (имеется ввиду Q)?
Все тривиальное просто

Последний раз редактировалось whatever; 28.06.2010 в 17:32.
whatever вне форума Ответить с цитированием
Старый 28.06.2010, 19:57   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Повторю вопрос на другом уровне. Указатели это только ссылка на данные. Где сами данные, которые вы пытаетесь изменить?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.06.2010, 20:52   #7
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Хм... Данные находятся в текстовике source.txt. По средствам
Код:
  readln(F,Q^.sod)
пытаюсь считать в этот самый Q^.sod из F - текстовика.
sod:integer объявлен в записи TTree. У меня возникают подозрения, что у нас наступает диалог глухонемых. Ладно, ставлю вопрос иначе:
Почему так:
Код:
procedure build_S(var F:textfile; var Q:PTree);
begin
  Q^.sod:=555;
  writeln(Q^.sod);
end;
не работает (читай: тупо вылетает), а вот так:

Код:
procedure build_S(var F:textfile; var Qq:PTree);
var
  Q:ptree;
begin
  Q^.sod:=555
  writeln(Q^.sod);
end;
все нормально, вся програма прогоняется до конца без ошибок?
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 29.06.2010, 07:07   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
type
  PTree=^TTree;
  TTree=record
    sod:integer;
    L,R:PTree;
  end;
Посмотри на этот код внимательно. Указатель всегда должен на что-то указывать. Вот твой должен указывать на структуру TTree, правильно? А на что он указывает в действительности? На какой-то адрес, где эта структура не существует (а если существует, то покажите мне участок кода, где она создается). То есть тычет пальцем в небо.
Теперь почему твой код работает? А потому что попадает на свободный участок памяти. А не работает, потому что в тот момент твой указатель тыкает куда-нибудь где место уже занято. И оба варианта неверные.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 29.06.2010 в 08:44.
Utkin вне форума Ответить с цитированием
Старый 29.06.2010, 09:17   #9
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

В общем, я согласен, что не прав. Но не могу понять, чем вам мой type не угодил? В яндексе, на запрос "дерево pascal" первая же ссылка выдает
Код:
Type 
   Tree=^s; 
   S=record 
   Inf: <тип хранимой информации>; 
      Left , right : tree ; 
End ;
Что есть тоже самое, что и у меня, только обозначения другие. И на лекциях мы также делали (хотя писали мелом на доске и не компилировали, при переносе из тетради в дэлфи в большенстве случаев не работало). Я понимаю, насколько сложно бывает что-то объяснить дураку (в данном случае мне), но, по моему дилетантскому мнению, в указаном вами куске кода все нормально.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 29.06.2010, 09:20   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
readln(F,Q^.sod);//!!!
А автор не забыл выделить память?
В твоем случае new нужен при каждом считывании а не в самом начале.
Цитата:
Но не могу понять, чем вам мой type не угодил?
А Уткин не о типе говорит а о значении переменной этого типа.
Как я сказал - ты не выделил для нее память при считывании, потому, как сказал Уткин "эта структура не существует"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с изменением формата даты при копировании из CSV формата в эксель mars56 Microsoft Office Excel 4 16.03.2010 09:50
Проблема с вызовом динамической DLL SkAndrew Общие вопросы Delphi 12 12.03.2010 07:59
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47
Проблема с изменением ориентации страницы в отчете madmech Общие вопросы Delphi 0 22.05.2009 20:04
Паскаль: шейкерная сортировка на динамической структуре. kotzebu Фриланс 1 01.05.2009 12:48