Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.10.2012, 11:54
user2001 user2001 вне форума
Прохожий
 
Регистрация: 20.10.2012
Сообщения: 2
Репутация: 10
Восклицание Access Violation

Всем доброго времени суток.

Предыстория- мне задали задачу по комп графике нарисовать анимацию открывающейся двери. Дверь открывается по эллиптической траектории, а это усложняет задачу. Решить по умным формулам не могу, поэтому решил схитрить немного: заранее просчитать координаты для рисования и сбросить их в массив TPoint.

Проблема- задача компилися, и даже работает(частично)-ровно до момента рисования полигона. Потом выдает мне 'Access Violation at 0x7791deb9: write off address 0x00090ffc'. Гугил сказал мне что это ошибка обращения к еще, либо уже не существующей памяти. Как это исправить я не знаю. Подскажите пожалуйста. Вот код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    image1: TImage;
    button1: TButton;
    procedure button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  arr_u, arr_d : array of tpoint;
  pd, pu : tpoint;
implementation

{$R *.dfm}
procedure Draw();
var
  I : Integer;
begin
  pu.X :=100; //   Верхняя точка неподвижной части двери
  pu.Y :=100; //

  pd.X :=100; //   Нижняя точка неподвижной части двери
  pd.Y :=200; //

  SetLength(arr_u, 24);//Рисование задумано в 25 шагов
  SetLength(arr_d, 24);

  arr_u[0].X := pu.X + 50;  //Решил руками задать 1й элемент массива,
  arr_u[0].Y:= pu.Y;         //и вычитывать следующую координату исходя
                                    //из предыдущей
  arr_d[0].X := pd.X + 50;;
  arr_d[0].Y := pd.Y;

  for I := 1 to Length(arr_d) do begin //Тут по задумке высчитываются координаты
    arr_u[i].X := arr_u[i-1].X - 2;    //точек. Должно получиться что то вроде
    arr_u[i].Y := arr_u[i-1].y + 1;    //эллиптической траектории

    arr_d[i].X := arr_d[i-1].X - 2;
    arr_d[i].y := arr_d[i-1].Y -1;
  end;

  for I := 0 to Length(arr_d)  do begin  //А вот тут он как раз и выдает //ошибку
    Form1.Image1.Canvas.Polyline([point(pd.X, pd.Y),point(pu.X, pu.Y),
    point(arr_u[i].X, arr_u[i].Y), point(arr_d[i].X, arr_d[i].Y)]);
    Application.ProcessMessages;
    Sleep(100);
  end;

end;

procedure TForm1.button1Click(Sender: TObject);
begin
  Draw();

end;

end.

Заранее благодарен=)

З.Ы.-ответы типа "Ошибка в твоем коде...генетическом..." просьба оставить при себе...

Последний раз редактировалось user2001, 20.10.2012 в 12:01.
Ответить с цитированием
  #2  
Старый 20.10.2012, 13:59
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

надо for I := 0 to Length(arr_d) -1

На счет двери, там все через синус и косинус считается, ничего сложного.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
user2001 (20.10.2012)
  #3  
Старый 20.10.2012, 14:01
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Смотрим на строки:
Цитата:
for I := 1 to Length(arr_d) do
...
for I := 0 to Length(arr_d) do
А теперь думаем. Мы установили длину массива равной, допустим, 2. Таким образом существуют два индекса - 0 и 1. Мы же идем по индексам от 0 и до длины массива, т.е. 2. Получается используем 0, 1, 2. Но индекса 2-то не существует.
Теперь переводим эти рассуждения на длину массива в 24.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 20.10.2012 в 14:04.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
user2001 (20.10.2012)
  #4  
Старый 20.10.2012, 14:25
user2001 user2001 вне форума
Прохожий
 
Регистрация: 20.10.2012
Сообщения: 2
Репутация: 10
По умолчанию

ошибка в
Код:
for I := 1 to Length(arr_d) do begin //Тут по задумке высчитываются координаты
    arr_u[i].X := arr_u[i-1].X - 2;    //точек. Должно получиться что то вроде
    arr_u[i].Y := arr_u[i-1].y + 1;    //эллиптической траектории
 
    arr_d[i].X := arr_d[i-1].X - 2;
    arr_d[i].y := arr_d[i-1].Y -1;
  end
;
ее закомментировал, и все заработало. Осталось только придумать как нормально найти координаты

Последний раз редактировалось user2001, 20.10.2012 в 14:54.
Ответить с цитированием
  #5  
Старый 20.10.2012, 15:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от user2001
Осталось только придумать как нормально найти координаты
См. сюда, сюда и сюда.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
user2001 (20.10.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025