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

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Работа с динамическим массивом
Tan
сообщение 1.11.2011 13:52
Сообщение #1


Профи
****

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

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


Доброго времени суток ув. форумчане! Обращаюсь к вам со своей проблемой, для начала опишу текущую картину.

Имеется следующий класс :
type
  point = class 
       id : integer;
        X : real;
        Y : real;
        Z : real;
    function Point (x : real; y : real; id_get : integer) : integer;
    end;

Описание функции этого класса :
function point.Point (x : real; y : real; id_get : integer) : integer;
var id : Integer;
begin
       id := - 1;
 	X := x;
 	Y := y;
 	if ( id_get <> -1 ) then id_get := id;
end;

Типы данных :
    init_points : array of integer;
    xPos, yPos, zPos : integer;
    tab : array of point;

Так же есть функция которая заполняет переменные xPos, yPos, zPos значениями и вызывает функцию добавления точки.
procedure TForm1.GiveValues();
var i : integer;
begin
  for i:= Low(init_points) to High(init_points)
  do
    if ( ( i mod 3 ) = 0 ) then
    begin
        xPos := init_points[i]; 
        yPos := init_points[i + 1];
        zPos := init_points[i + 2] - 150;
        AddPoint();
    end;
end;


И вот сама ключевая функция AddPoint() :
procedure TForm1.AddPoint();
var deletion : boolean;
    dx, dy, dist : real;
    i, y : integer;
    p : point;
    new_point : point;
begin
   deletion := FALSE;
   if ( ( zPos > 0 ) or ( xPos < 0 ) ) then Exit;
   if ( Length(tab) > 0 ) then
   begin
     for i := Low(tab) to High(tab) do
       begin
         p := tab[i];
         dx := p.X - xPos;
         dy := p.Y - yPos;
         dist := sqrt (dx * dx + dy * dy);
          if (dist < 4) then
             begin
                deletion := TRUE;
                for y := i to High(tab) - 1 do tab[y] := tab[y + 1];  //смещаем на элемент вниз
                SetLength(tab, High(tab) - 1);  //уменьшаем размер так как убрали 1 элемент
             end;
       end;
   end;
    if ( deletion = FALSE ) then
      begin
             new_point.Point(xPos, yPos, -1);
             new_point.Z := zPos + 150; // !!!! Вот тут программа вылетает !!!!
             SetLength(tab, High(tab) + 1);
             tab[Length(tab)] := new_point; // добавляем в конец новый элемент
      end;
end;

Как я отметил в коде, программа вылетает на строке new_point.Z := zPos + 150; с ошибкой EAccessViolation. Мне кажется это связано с неверной работой с динамическими массивами, но более детально я не могу понять суть этой проблемы. Буду рад помощи, заранее спасибо.

Сообщение отредактировано: Tan - 1.11.2011 14:16


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Tan   Работа с динамическим массивом   1.11.2011 13:52
IUnknown   Для начала: Point у тебя - класс, и его перед испо...   1.11.2011 14:35
Tan   Спасибо за ответ Владимир, идея понятна, есть неск...   1.11.2011 16:07
IUnknown   Destroy надо делать тогда, когда значение больше н...   1.11.2011 16:25
Tan   Я переписал указанные места (destroy пока не делал...   1.11.2011 18:14
IUnknown   Не вижу: Как у тебя изначально инициализируется...   1.11.2011 19:34
Tan   Cпасибо за ответ, Владимир. Массив считывает из фа...   1.11.2011 20:06
IUnknown   Стоп, стоп... Сразу не посмотрел вот сюда: Это ни ...   1.11.2011 20:20
Tan   Спасибо Владимир, я смог скомпилировать код - осно...   2.11.2011 0:44
IUnknown   Так что чему в функции присваивается? Одинаковые и...   2.11.2011 0:54
TarasBer   > не понимаю я этой С++-ной привычки называть к...   2.11.2011 9:22
Tan   Я хочу чтобы внутри функции Point формировались зн...   2.11.2011 12:47
IUnknown   Я ж написал: Т.е., вот так: function point.Point ...   2.11.2011 14:38
TarasBer   > а корректно работающий (в отличие от For-а, я...   2.11.2011 15:07
Tan   Спасибо огромное за помощь, ввиду некоторых жизнен...   2.11.2011 15:14


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

 

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