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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2013, 18:52   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Зачем Вы оставили такой сложный if?
Достаточно:
Код:
map2[i, j].life := (count = 3) or (count = 2) and map1[i, j].life;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.05.2013, 19:01   #12
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Зачем Вы оставили такой сложный if?
Достаточно:
Код:
map2[i, j].life := (count = 3) or (count = 2) and map1[i, j].life;
спасибо, заменил)
marwell. вне форума Ответить с цитированием
Старый 31.05.2013, 08:46   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Если map2 стал указывать на map1, то вывод должен быть 010, а он 011.
Цитата:
map1 := map2;
с точностью до наоборот.
map1 стал указывать на map2

Цитата:
showmessage(Format('%p %p', [@map1, @map2]));
Адреса разные.
Адреса переменных (map1, map2) разные конечно же.
Адреса массивов (память на которую они указывают две разных переменных) одинаковые.

showmessage(Format('%p %p', [@map1[0,0], @map2[0,0]]));

Цитата:
Так будет только в случае динамических массивов.
проверил и согласился. был не совсем прав. (или совсем не прав)
Цитата:
Адреса массивов (память на которую они указывают две разных переменных) одинаковые.
РАЗНЫЕ !

тем не менее ошибка все равно там.
поскольку у нас массив объектов Tkletka. (то бишь указателей)
Код:
array [0..51,0..51] of Tkletka;
map1:=map2; 
map1[i,j]:=map2[i,j];
в любом случае мы скопируем объекты (указатель на объект!) и далее у нас только один(!) набор объектов в двух массивах.
надо
Код:
map1[i,j].life:=map2[i,j].life; // копировать ВСЕ данные объектов


Дальше только для любознательности как можно модифицировать
1. другой "способ" копирования данных
при желании можно использовать prTkletka.Asiign(a: Tkletka);

2. отказ о копирования
для исключения операций копирования можно в каждой клетке(Tkletka) иметь два состояния
Код:
life: array[0..1] of boolean;
и иметь один внешний переключатель текущего/прошлого состояния.
Код:
var
  currlifeindex, oldlifeindex: 0..1;
  
map[i,j].Life[curlifeindex]:=map[...].life[oldlifeindex];

if curlieindex=0 then begin
  currlifeindex:=1;
  oldlifeindex:=0;
end
else begin
  currlifeindex:=0;
  oldlifeindex:=1;
end;
это только наметки кода. для иллюстрации направления мысли.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.05.2013 в 09:39.
evg_m вне форума Ответить с цитированием
Старый 31.05.2013, 21:19   #14
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

реализовал смену поколений через поток(в образовательных целях). Но этот поток делает всего один цикл(т.е один шаг в смене поколений). Как добиться непрерывной смены поколений(пока не нажата кнопка)? Повесить на таймер проверку не запущен ли поток и если не запущен, то запускать? Или есть способы получше?
marwell. вне форума Ответить с цитированием
Старый 31.05.2013, 21:38   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Наверное, лучше сделать в потоке бесконечный цикл с паузой на 1 секунду, например, между каждым поколением. Кнопка запускает или приостанавливает поток.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.05.2013, 22:20   #16
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Наверное, лучше сделать в потоке бесконечный цикл с паузой на 1 секунду, например, между каждым поколением. Кнопка запускает или приостанавливает поток.
прикрутил трэкбар, для задания скорости пользователем

Код:
var
  Form1: TForm1;
  p: Tp;
  cikl: Tcikl;
...
procedure Tp.Execute;
begin
  while pause do begin
     cikl:=Tcikl.Create(true);
     cikl.FreeOnTerminate:=true;
     cikl.Resume;
     sleep(Form1.TrackBar1.Position);
  end;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  if p.Suspended then begin
    p.Resume;
    Button1.Caption:='Pause';
  end
    else begin
    p.Suspend;
    Button1.Caption:='Run'
    end;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Position:=500;
    p:=Tp.Create(true);
  p.FreeOnTerminate:=true;
end;
...
но при маленьком значении TrackBar1.Position поток cikl иногда не успевает завершиться. Как в procedure Tp.Execute проверить, завершился ли поток cikl?
marwell. вне форума Ответить с цитированием
Старый 31.05.2013, 22:29   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Так у Вас поток в потоке.
Я бы сделал 1 поток, в котором исполняется процедура "цикл". При этом происходит замер времени выполнения. Затем делается пауза на столько миллисекунд, сколько осталось от Form1.TrackBar1.Position - "время выполнения". Если число отрицательное, то паузы вообще не делать. Хотя мне трудно представить, что поток не успевает выполниться. Создание потока - дорогая операция, так что лучше оставьте только 1 поток.

Примерно:
Код:
procedure Tp.Execute;
begin
  while pause do begin
     //замер времени
     cikl();
     Synchronize(UpdateImage);
     //замер времени
     if (...) then
       sleep(Form1.TrackBar1.Position);
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 31.05.2013 в 22:33.
BDA вне форума Ответить с цитированием
Старый 31.05.2013, 22:50   #18
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так у Вас поток в потоке.
Я бы сделал 1 поток, в котором исполняется процедура "цикл". При этом происходит замер времени выполнения. Затем делается пауза на столько миллисекунд, сколько осталось от Form1.TrackBar1.Position - "время выполнения". Если число отрицательное, то паузы вообще не делать. Хотя мне трудно представить, что поток не успевает выполниться. Создание потока - дорогая операция, так что лучше оставьте только 1 поток.

Примерно:
Код:
procedure Tp.Execute;
begin
  while pause do begin
     //замер времени
     cikl();
     Synchronize(UpdateImage);
     //замер времени
     if (...) then
       sleep(Form1.TrackBar1.Position);
  end;
end;
спасибо! убрал поток p, решил делать в потоке cikl

Код:
procedure Tcikl.Execute;
var
  i,j,k,m,count: Integer;
begin
  while pause do begin
  ...
  sleep(Form1.TrackBar1.Position);
  end;
end;
cikl успевает отработать.
остался вопрос: как корректно завершать программу?
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
cikl.Terminate;
cikl.Free;
end;
поток cikl при этом продолжает работать
marwell. вне форума Ответить с цитированием
Старый 31.05.2013, 23:02   #19
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

вот так заработало
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
if WaitForSingleObject (cikl.HANDLE, 0 )=WAIT_TIMEOUT then begin
cikl.Terminate;
end;
end;
marwell. вне форума Ответить с цитированием
Старый 03.06.2013, 16:21   #20
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Вопрос

доброго дня
продолжаю данную тему
имеется два массива-карты map1 и map2(текущее поколение и следующее), содержащие объекты Tkletka, со свойством life : boolean. Вопрос: как реализовать эти карты в виде поверхности тора? Т.е. низ склеить с верхом, правый край - с левым?
marwell. вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра жизнь Fi11eR Общие вопросы C/C++ 8 22.05.2014 16:52
Игра Жизнь gusluk Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 24.05.2012 15:58
Клеточный автомат (Игра Жизнь) в Delphi nitroes Фриланс 4 12.03.2012 13:11
Игра Жизнь VovanZ Софт 14 02.02.2010 16:46