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

> ВНИМАНИЕ!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Работа с динамическим массивом
сообщение
Сообщение #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 -


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


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 29.04.2024 14:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name