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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 2.11.2011 14:38
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Я ж написал:
Цитата
Хотя бы перед именем поля поставь Self

Т.е., вот так:
function point.Point (x : real; y : real; Var id_get : integer) : integer;
begin
{Self.}id := - 1;
self.X := x;
self.Y := y;
if ( id_get <> -1 ) then id_get := {Self.}id;

Point := { чему равен результат функции??? }
end;
(Паскаль, как и все языки его группы, не делает разницы между X и x, это для него одна и та же переменная. И то, что ты делаешь - это присвоение параметру самого себя. Смысла - никакого, поле класса вообще не затрагивается).

Если перед id_get не поставишь Var, то изменение ее значения внутри Point.Point наружу не выйдет. Только смысла в этом параметре вообще ноль: "если id_get не (-1), то присвоить его значению id, которое в самом начале принудительно ставится в (-1). Если же оно и так (-1) - то ничего не делать" Вдумайся, что тут написано. Это именно то, что ты запрограммировал.

Цитата
Не надо заменять его на while, потому что там останется тот же дурацкий алгоритм за квадрат.
Там останется не "тот же дурацкий", а корректно работающий (в отличие от For-а, я написал почему) алгоритм за квадрат...

Сообщение отредактировано: IUnknown - 2.11.2011 14:41
 Оффлайн  Профиль  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 13:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"