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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2011, 15:17   #1
Ga-sergey
Пользователь
 
Регистрация: 09.03.2007
Сообщений: 34
По умолчанию Связный список, массив

Здравствуйте, заранее спасибо за помощь.
В объекте есть связный список, поле объекта (сам указатель на список) с названием List, в информационной части списка - массив, но почему-то когда я хочу получить адрес массива для обращения к нему, даже в самом объекте с помощью оператора @, возвращается nil, сам список рабочий - пробовал на простых числах и т.д., так же пробовал получать адрес массива сразу после создания списка - всё-равно адрес nil
Ниже описание типа списка, может чем-то поможет
PHP код:
   TMas=array[1..20of byte;
   
   
PNode=^TNode;
   
TNode=record
      Mas
:TMas;
      
Prev:PNode;
      
Next:PNode;
   
end
Пытался брать адрес через @List^.Mas и даже через @(List^.Mas)
Ga-sergey вне форума Ответить с цитированием
Старый 24.05.2011, 15:33   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

давайте телепатически погадаем, какой у вас может быть код:

Код:
TMyObj = class(TObject)
  List: PNode;
end;
гадаем дальше, создаётся экземпляр:

Код:
var
  myObj: TMyObj;
begin
  myObj := TMyObj.Create();
  //
  // Пытался брать адрес через @List^.Mas и даже через @(List^.Mas) 
end;
по принципу, чем больше непонятных крючков, тем лучше? А достаточно просто выделить память:

Код:
myObj.List := New(PNode);
и наш список получает адрес! Не забываем про Dispose().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.05.2011, 15:41   #3
Ga-sergey
Пользователь
 
Регистрация: 09.03.2007
Сообщений: 34
По умолчанию

Мне кажется я достаточно понятно объяснил и сам факт того что список рабочий должен был вас навести на мысль что new используется

Код:
TMas=array[1..20] of byte;
   
   PNode=^TNode;
   TNode=record
      Mas:TMas;
      Prev:PNode;
      Next:PNode;
   end;  
...
   TList=object
      private
         List:PNode;
....
procedure TList.AddBef(Num:byte);
Var
   PNew,P:PNode;
begin
   if List=nil then begin
      New(List);
      List^.Next:=List;
      List^.Prev:=List;
   end
   else begin
      New(PNew);
      P:=GetPointer(Num); // получаем указатель на элемент списка
      PNew^.Prev:=P;
      PNew^.Next:=P^.Next;
      P^.Next^.Prev:=PNew;
      P^.Next:=PNew;
   end;
   Writeln(Integer(@List));  //здесь не nil
   Writeln(Integer(@List^.Mas)); //а вот здесь nil
end;
Т.е. даже если я при создании списка беру адрес массива - он нулевой
Ga-sergey вне форума Ответить с цитированием
Старый 24.05.2011, 16:26   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Writeln(Integer(@List)); //здесь не nil

потому, что здесь берется адрес поля с именем List в экземпляре объекта TList. nil там и не может быть, если объект создан (не зависимо от того, создан сам List или нет).

> Writeln(Integer(@List^.Mas)); //а вот здесь nil

потому, что значение (не адрес) поля List, вероятно, равно nil. Выведите вот это, чтобы проверить:

Код:
Writeln(Integer(List)); //а вот здесь?
я вижу, что список создаётся, поэтому nil там по-идее быть не должно..
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.05.2011, 16:34   #5
Ga-sergey
Пользователь
 
Регистрация: 09.03.2007
Сообщений: 34
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
я вижу, что список создаётся, поэтому nil там по-идее быть не должно..
Там nil теперь я потерял вообще какое-либо понимание происходящего
Ga-sergey вне форума Ответить с цитированием
Старый 24.05.2011, 16:41   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

значит, нужно найти код, который его затирает

пошаговая отладка + watch на List должно показать, в каком месте List опять сбрасывается в nil.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.05.2011, 17:06   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> теперь я потерял вообще какое-либо понимание происходящего

кстати, это ж под 16-битной средой запускается, верно? Там же Integer(указатель) не имеет особого смысла, т.к. это будет просто смещение в сегменте, которое вполне может быть и 0.
Вместо Integer нужно использовать LongInt. Вот, никаких nil:

Код:
program test;

uses
  Objects;

type
  TMas = array[1..20] of Byte;
  PNode = ^TNode;
  TNode = record
    Mas: TMas;
    Prev: PNode;
    Next: PNode;
  end;

  TList = object(TObject)
    {}
    List: PNode;
    {}
    procedure tryme;
  end;

procedure TList.tryme;
begin
  List := new(PNode);
  List^.Mas[2] := 0;
  {}
  WriteLn(LongInt(@List));
  WriteLn(LongInt(@List^.Mas));
  {}
  Dispose(List);
end;

var
  L: ^TList;
begin
  New(L, Init);
  {}
  L^.tryme;
  {}
  Dispose(L);
end.
И, кстати, если не наследовать свой объект от TObject, поля не будут очищаться при создании, т.е. List не будет равен nil после создания объекта.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 24.05.2011 в 17:36.
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двунаправленный связный список Sibedir Софт 2 20.04.2011 05:43
Связный список С++ Шёпот Общие вопросы C/C++ 2 01.04.2011 22:56
Связный список векторов Kekcuk Общие вопросы C/C++ 0 13.12.2010 21:00
Циклический связный список Micar Общие вопросы C/C++ 1 08.06.2010 20:28
Инвертировать связный список levandowskiy Общие вопросы C/C++ 2 21.08.2009 15:20