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

> Обмен данными между двумя объектами, Передать значение переменной
comanche
сообщение 13.03.2006 15:04
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Добрый день, товарищи! Дело такое:

Имеются два независимых объекта. Как заставить их работать сообща, тобишь чтобы переменная одного объекта (в моём случае - массив) могла быть доступна другому объекту при описании?
Пока что вижу всего лишь один способ - объединить оба объекта в один dry.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 16)
volvo
сообщение 13.03.2006 15:12
Сообщение #2


Гость






Пример готовых отдельных объектов приведи, и ЧТО ты хочешь чтобы было доступно - тоже... Посмотрим, как можно это реализовать... Кстати, для какого компилятора, уточни...

Цитата
чтобы переменная одного объекта (в моём случае - массив) могла быть доступна другому объекту при описании?
blink.gif Это как "при описании"?
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 15:21
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


"При описании" я имел в виду, что уже при описании выдаёт ошибку, то что второму объекту не известны методы первого.

Вот здесь, например, я хочу вывести на экран массив, хранящийся в первом объекте на экран при помощи второго объекта.

P.s. использую TMT, но на TP тоже должно пахЫть smile.gif

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;


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 15:40
Сообщение #4


Гость






Цитата
я хочу вывести на экран массив, хранящийся в первом объекте на экран при помощи второго объекта.
Да ты покажи, КАК ты хочешь вызывать это... У меня никакой ошибки не показывает, ИБО НЕТ ЕЕ в том коде, который ты привел !
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 15:49
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Вот .PAS файл, ошибка на 91-й строке:

Качать


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 15:57
Сообщение #6


Гость






Так устроит:
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.

?
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 16:04
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Это, конечно, хороший вариант.

Тоеть насколько я понимаю, нельзя два независимых объекта согласовать без вложенности одного в другой? norespect.gif

Возникает второй вопрос: почему вы не выделяли память под P (pGame)? Constructor сам всё выделил? nea.gif

Немного не понимаю вот этой строки: New(Menu, Init(Game));

Сообщение отредактировано: comanche - 13.03.2006 16:05


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 16:19
Сообщение #8


Гость






Цитата(comanche @ 13.03.2006 15:04)
Это, конечно, хороший вариант.
smile.gif "У тети Сони плохого не бывает" (С)

Цитата(comanche @ 13.03.2006 15:04)
Тоеть насколько я понимаю, нельзя два независимых объекта согласовать без вложенности одного в другой? norespect.gif
Ну, я бы не сказал, что это вложенность, это все-таки p: PTGame, а следовательно указатель на объект типа TGame...

Цитата(comanche @ 13.03.2006 15:04)
Возникает второй вопрос: почему вы не выделяли память под P (pGame)? Constructor сам всё выделил? nea.gif
Смотри, что происходит: тип TMenu содержит переменную P... Задача конструктора - выделить в памяти место, достаточное для хранения всех переменных, правда? Зачем я еще что-то должен делать? На то и Constructor ...

Цитата(comanche @ 13.03.2006 15:04)
Немного не понимаю вот этой строки: New(Menu, Init(Game));
Ну, я же поменял заголовок конструктора, и теперь
Constructor TMenu.Init(pGame: PTGame);

должен получать аргумент - указатель на TGame... Вот я и передаю его при инициализации...
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 16:24
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Огромное спасибо и уважуха в квадрате smile.gif Приятно было сотрудничать drinks.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 16:54
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Возник ещё один теоретический вопрос:

Тоесть со статическими объектами нельзя было бы проделывать такие же действия? good.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 17:01
Сообщение #11


Гость






Все, что можно с динамикой, можно и со статикой. Операцию "@" еще никто не отменял smile.gif
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 17:18
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


А вот такой мы пока ещё не знаем, а если и слышали, то не понимаем её предназначения.

Спасибо! smile.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 17:45
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Эхх мааа... Сделал всё так же как вы сказали, теперь же в результате вывода массива выводятся нули, а если
оставить
New(Menu, Init(Game));
New(Game, Init);
Menu^.DrawPlayGround;
Dispose(Menu, Done);
Dispose(Game, Done);


Т.е. не менять местами
New(Menu, Init(Game));
New(Game, Init);


То выводятся хаотичные значения, причём одни и те же. norespect.gif Help! Help!

Код: (Показать/Скрыть)


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 18:08
Сообщение #14


Гость






Если не менять местами - будет непонятно что, потому что СНАЧАЛА надо инициализировать Game, а потом передавать его в Menu...

Сейчас гляну, что там происходит...
(только я проверяю в FPC, у меня TMT не установлен...)

blink.gif
  Constructor TGame.Init;
    begin
      Randomize;
      RandomFillPG; { Добавь эту строку }
    end;

Попробуй изменить ТОЛЬКО это, у меня выдает то, что было инициализировано:
Цитата
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 18:10
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Да, заработало. В чём же причина? cool.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.03.2006 18:20
Сообщение #16


Гость






В том, что просто сделать Randomize недостаточно... Нужно еще и заполнить матрицу значениями. А для этого достаточно сказать компилятору, какая процедура этим занимается... Что я и сделал smile.gif
 К началу страницы 
+ Ответить 
comanche
сообщение 13.03.2006 18:23
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 41
Пол: Мужской
Реальное имя: Эдд

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


Победили! good.gif


--------------------
Released by Demons
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 29.07.2025 9:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"