Добрый день, товарищи! Дело такое:
Имеются два независимых объекта. Как заставить их работать сообща, тобишь чтобы переменная одного объекта (в моём случае - массив) могла быть доступна другому объекту при описании?
Пока что вижу всего лишь один способ - объединить оба объекта в один
Пример готовых отдельных объектов приведи, и ЧТО ты хочешь чтобы было доступно - тоже... Посмотрим, как можно это реализовать... Кстати, для какого компилятора, уточни...
"При описании" я имел в виду, что уже при описании выдаёт ошибку, то что второму объекту не известны методы первого.
Вот здесь, например, я хочу вывести на экран массив, хранящийся в первом объекте на экран при помощи второго объекта.
P.s. использую TMT, но на TP тоже должно пахЫть
Type
TPlayGround = Array [1..MaxRows, 1..MaxColumns] OF Byte; {6 columns, 6 rows}
// TGame Interface section
TGame = object
private
PG: TPlayGround;
public
Constructor Init;
Destructor Done;
Function GetPG: TPlayGround;
end;
// TMenu Interface section
TMenu = object
Constructor Init;
Destructor Done;
Procedure DrawPlayGround;
end;
Вот .PAS файл, ошибка на 91-й строке:
http://pro.apollo.lv/comanche/programming/Ex_5.pas
Так устроит:
Const
MaxColumns = 6;
MaxRows = 6;
Type
TPlayGround = Array [1..MaxRows, 1..MaxColumns] OF Byte; {6 columns, 6 rows}
PTGame = ^TGame;
TGame = object
...
end;
// TMenu Interface section
TMenu = object
private
p: PTGame;
public
Constructor Init(pGame: PTGame);
Destructor Done;
Procedure DrawPlayGround;
end;
// TGame Implementation section
...
// TMenu Implementation section
Constructor TMenu.Init(Var pGame: PTGame);
begin
p := pGame;
end;
...
Procedure TMenu.DrawPlayGround;
var
Row, Column: Byte;
begin
For Row := 1 To MaxRows Do begin
For Column := 1 To MaxColumns Do
Write(p^.GetPG[Row, Column]);
WriteLn;
end;
end;
// Variable Definition section
Var
Menu: ^TMenu;
Game: ^TGame;
// Main Program's Logic section
Begin
New(Game, Init);
New(Menu, Init(Game));
Menu^.DrawPlayGround;
Dispose(Menu, Done);
Dispose(Game, Done);
End.
Это, конечно, хороший вариант.
Тоеть насколько я понимаю, нельзя два независимых объекта согласовать без вложенности одного в другой?
Возникает второй вопрос: почему вы не выделяли память под P (pGame)? Constructor сам всё выделил?
Немного не понимаю вот этой строки: New(Menu, Init(Game));
Constructor TMenu.Init(pGame: PTGame);
Огромное спасибо и уважуха в квадрате Приятно было сотрудничать
Возник ещё один теоретический вопрос:
Тоесть со статическими объектами нельзя было бы проделывать такие же действия?
Все, что можно с динамикой, можно и со статикой. Операцию "@" еще никто не отменял
А вот такой мы пока ещё не знаем, а если и слышали, то не понимаем её предназначения.
Спасибо!
Эхх мааа... Сделал всё так же как вы сказали, теперь же в результате вывода массива выводятся нули, а если
оставить
New(Menu, Init(Game));
New(Game, Init);
Menu^.DrawPlayGround;
Dispose(Menu, Done);
Dispose(Game, Done);
New(Menu, Init(Game));
New(Game, Init);
Если не менять местами - будет непонятно что, потому что СНАЧАЛА надо инициализировать Game, а потом передавать его в Menu...
Сейчас гляну, что там происходит...
(только я проверяю в FPC, у меня TMT не установлен...)
Constructor TGame.Init;
begin
Randomize;
RandomFillPG; { Добавь эту строку }
end;
Да, заработало. В чём же причина?
В том, что просто сделать Randomize недостаточно... Нужно еще и заполнить матрицу значениями. А для этого достаточно сказать компилятору, какая процедура этим занимается... Что я и сделал
Победили!