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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2010, 19:50   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
Вопрос Проблема с динамическим массивом

Доброго всем!

Код:
  Shot=record
    x,y: single;
    square: array[1..4,1..2] of single;
    angle: integer;
    power: byte;
    speed: byte;
  end;
Код:
  TTank=class
    ...
    Shots: array of Shot;
    ...
    procedure TraceShots;
    procedure Fire(power: byte);
    ...
  end;
Код:
procedure TTank.TraceShots;
var
  i: integer;
  alfa: single;

function Border(i: integer): boolean;
begin
  result:=true;
  if (Shots[i].x<0) or (Shots[i].x>1280) or (Shots[i].y<0) or (Shots[i].y>1024) then
    result:=false;
end;

procedure Construction(i: integer);
var
  alfa,r: single;
begin
  alfa:=(-Shots[i].Angle-45)*pi/180;
  r:=sqrt(2)*3;
  Shots[i].square[1,1]:=Shots[i].x+r*cos(alfa+pi/2);
  Shots[i].square[1,2]:=Shots[i].y+r*sin(alfa+pi/2);

  Shots[i].square[2,1]:=Shots[i].x+r*cos(alfa);
  Shots[i].square[2,2]:=Shots[i].y+r*sin(alfa);

  Shots[i].square[3,1]:=Shots[i].x+r*cos(alfa+3*pi/2);
  Shots[i].square[3,2]:=Shots[i].y+r*sin(alfa+3*pi/2);

  Shots[i].square[4,1]:=Shots[i].x+r*cos(alfa+pi);
  Shots[i].square[4,2]:=Shots[i].y+r*sin(alfa+pi);
end;

procedure Shift(i: integer);
var
  buf: Shot;
begin
  if i<Length(Shots)-1 then
  begin
    buf.x:=Shots[i].x;
    buf.y:=Shots[i].y;
    buf.angle:=Shots[i].angle;
    buf.power:=Shots[i].power;
    buf.speed:=Shots[i].speed;
    Shots[i].x:=Shots[i+1].x;
    Shots[i].y:=Shots[i+1].y;
    Shots[i].angle:=Shots[i+1].angle;
    Shots[i].power:=Shots[i+1].power;
    Shots[i].speed:=Shots[i+1].speed;
    Shots[i+1].x:=buf.x;
    Shots[i+1].y:=buf.y;
    Shots[i+1].angle:=buf.angle;
    Shots[i+1].power:=buf.power;
    Shots[i+1].speed:=buf.speed;
    Construction(i);
    Construction(i+1);
    Shift(i+1);
  end;
end;

begin
  for i:=0 to Length(Shots)-1 do
  begin
    if Border(i) then
    begin
      alfa:=Shots[i].angle*pi/180;
      Shots[i].x:=Shots[i].x+Shots[i].speed*sin(alfa);
      Shots[i].y:=Shots[i].y+Shots[i].speed*cos(alfa);
      Construction(i);
    end
    else
    begin
      Shift(i);
      SetLength(Shots,Length(Shots)-1);
    end;
  end;
end;
помогите найти причину проблемы. где то в недрах этой процедуры (она вызывается 24 раза в секунду) появляется acces violation если вызвать вот эту процедуру

Код:
procedure TTank.Fire(power: byte);

procedure Construction;
var
  alfa,r: single;
begin
  alfa:=(-Shots[Length(Shots)-1].Angle-45)*pi/180;
  r:=sqrt(2)*3;
  Shots[Length(Shots)-1].square[1,1]:=Shots[Length(Shots)-1].x+r*cos(alfa+pi/2);
  Shots[Length(Shots)-1].square[1,2]:=Shots[Length(Shots)-1].y+r*sin(alfa+pi/2);

  Shots[Length(Shots)-1].square[2,1]:=Shots[Length(Shots)-1].x+r*cos(alfa);
  Shots[Length(Shots)-1].square[2,2]:=Shots[Length(Shots)-1].y+r*sin(alfa);

  Shots[Length(Shots)-1].square[3,1]:=Shots[Length(Shots)-1].x+r*cos(alfa+3*pi/2);
  Shots[Length(Shots)-1].square[3,2]:=Shots[Length(Shots)-1].y+r*sin(alfa+3*pi/2);

  Shots[Length(Shots)-1].square[4,1]:=Shots[Length(Shots)-1].x+r*cos(alfa+pi);
  Shots[Length(Shots)-1].square[4,2]:=Shots[Length(Shots)-1].y+r*sin(alfa+pi);
end;

begin
  SetLength(Shots,Length(Shots)+1);
  Shots[Length(Shots)-1].power:=power;
  Shots[Length(Shots)-1].angle:=tower.CurrentAngle;
  case power of
    1: Shots[Length(Shots)-1].speed:=30;
    2: Shots[Length(Shots)-1].speed:=20;
  end;
  Shots[Length(Shots)-1].x:=50*sin(tower.CurrentAngle*pi/180)+x;
  Shots[Length(Shots)-1].y:=50*cos(tower.CurrentAngle*pi/180)+y;
  Construction;
end;
2 раза подряд, тоесть если пальнуть один раз, а потом второй пока не скрылась предидущая пуля. А если палить с интервалами то все норм.
Прикручу exe для наглядности.
Вложения
Тип файла: rar Mamont.rar (237.7 Кб, 4 просмотров)
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 09.07.2010, 20:00   #2
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Цитата:
появляется acces violation если вызвать вот эту процедуру
где-то идет обращение к несуществующему адресу.
Miha85193 вне форума Ответить с цитированием
Старый 09.07.2010, 20:06   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
begin
  for i:=0 to Length(Shots)-1 do
  begin
    if Border(i) then
    begin
      alfa:=Shots[i].angle*pi/180;
      Shots[i].x:=Shots[i].x+Shots[i].speed*sin(alfa);
      Shots[i].y:=Shots[i].y+Shots[i].speed*cos(alfa);
      Construction(i);
    end
    else
    begin
      Shift(i);
      SetLength(Shots,Length(Shots)-1);
    end;
  end;
end;
А где начальное выделение памяти (длины) под Shots ?

Код:
SetLength(Shots,Length(Shots)+1);
тут не вникал, но исходя из того что первый раз Length(Shots) даст 0, то Shots длина будет 0 + 1 = 1. Следовательно дальше во втором случае вы не часто вызываете Shots вот и получаете парочку. Хотя..

Вообщем нормально организуйте код для публики, а то разбираться в вашей писанине думаю всем лень и мне в том же числе.
BOBAH13 вне форума Ответить с цитированием
Старый 09.07.2010, 20:20   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Вообщем нормально организуйте код для публики
О_о прокомментировать что ли?

PS и забыл, TraceShots вызывается только если длинна массива не больше нуля
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с динамическим массивом TheKnyazz Общие вопросы C/C++ 3 28.04.2009 18:37
Проблемма с динамическим массивом Arassir Помощь студентам 3 15.02.2009 12:37
Проблема с динамическим массивом dee_lv Помощь студентам 7 09.06.2008 16:58
проблема с динамическим массивом romeo007.06 Общие вопросы Delphi 1 03.04.2008 20:18
проблема с динамическим массивом kommunist Помощь студентам 6 11.11.2007 21:18