Работа с динамическим массивом |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Работа с динамическим массивом |
Tan |
1.11.2011 13:52
Сообщение
#1
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Доброго времени суток ув. форумчане! Обращаюсь к вам со своей проблемой, для начала опишу текущую картину.
Имеется следующий класс : type Описание функции этого класса : function point.Point (x : real; y : real; id_get : integer) : integer; Типы данных : init_points : array of integer; Так же есть функция которая заполняет переменные xPos, yPos, zPos значениями и вызывает функцию добавления точки. procedure TForm1.GiveValues(); И вот сама ключевая функция AddPoint() : procedure TForm1.AddPoint(); Как я отметил в коде, программа вылетает на строке new_point.Z := zPos + 150; с ошибкой EAccessViolation. Мне кажется это связано с неверной работой с динамическими массивами, но более детально я не могу понять суть этой проблемы. Буду рад помощи, заранее спасибо. Сообщение отредактировано: Tan - 1.11.2011 14:16 -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
1.11.2011 14:35
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Для начала: Point у тебя - класс, и его перед использованием надо что? Правильно, создать. У тебя в коде создания экземпляра класса нет. Как-то вот так:
if ( deletion = FALSE ) thenНу, или сделать Point.Point конструктором (не понимаю я этой С++-ной привычки называть конструктор точно так же, как и сам класс. Я больше привык к Create-у) и вызывать соответствующим образом (как принято в Дельфи, а не так, как в Турбо Паскале) |
Tan |
1.11.2011 16:07
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Спасибо за ответ Владимир, идея понятна, есть несколько вытекающих вопросов :
1 - Destroy надо делать каждый раз после того как я уже использовал это значение? 2 - Нет идей почему теперь может писать invalid pointer operation ссылаясь на end в конце функции GiveValues? -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
1.11.2011 16:25
Сообщение
#4
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Destroy надо делать каждый раз после того как я уже использовал это значение? Destroy надо делать тогда, когда значение больше не нужно. Чтоб не было утечек. То есть, при уменьшении размера Tab. Кстати, замени там цикл Цитата for i := Low(tab) to High(tab) do Цитата Нет идей почему теперь может писать invalid pointer operation ссылаясь на end в конце функции GiveValues? Выход за пределы массива - как минимум. Ты ж идешь до High(init_points), так откуда у тебя будет init_points[i + 2]? Вот тебе и вылет программы. |
Tan |
1.11.2011 18:14
Сообщение
#5
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Я переписал указанные места (destroy пока не делал, потому что основная задача сначала скомпилить то, что есть). Теперь компилятор указывает ту же ошибку только в строке dx := p.X - xPos; Вероятно где-то что-то опять я проворонил.
procedure TForm1.AddPoint(); -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
1.11.2011 19:34
Сообщение
#6
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Я переписал указанные места Не вижу:Цитата i := 0; Как у тебя изначально инициализируется массив init_points? Какого он размера на момент входа в GiveValues? |
Tan |
1.11.2011 20:06
Сообщение
#7
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Cпасибо за ответ, Владимир. Массив считывает из файла значения, которых 256. Делаю я это так:
procedure TForm1.DataFromFile (); //pick ups data from file -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
1.11.2011 20:20
Сообщение
#8
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Стоп, стоп... Сразу не посмотрел вот сюда:
Цитата i := 1; for i := Low(tab) to High(tab) do. Массивы индексируются с 0, а не с 1. Надо делать: i := 0; Еще одно (причина - та же, индексация с 0) : Цитата SetLength(tab, Length(tab) + 1); Пересмотри еще раз всю программу, с учетом того, что ты теперь знаешь о начале отсчета с 0, а не с 1... |
Tan |
2.11.2011 0:44
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Спасибо Владимир, я смог скомпилировать код - основная моя проблема была в том, что я по массиву не с 0 шёл.
У меня остался последний вопрос по моему коду - в моём первом посте описана функция Point. В этой функции каждрому экземпляру класса point должно быть присвоено значение X и Y, которое передаётся через параметр этой функции через x и y. Но когда в моём случае создаётся экзсемпляр new_point, и после вызова функции new_point.Point(параметры) значения new_point.X и new_point.Y равны 0 (по крайней мере я так заметил) - я сделал вывод что каким-то образом эти значения не передаются вне функции. Если я не ошибаюсь, то в паскале для таких случае перед параметром функции требовалось написать var, мне очень интересно что для этого надо сделать на Delphi. -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
2.11.2011 0:54
Сообщение
#10
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Так что чему в функции присваивается? Одинаковые имена полей класса и параметров - зло. Хотя бы перед именем поля поставь Self, чтобы было понятнее, что происходит...
Цитата Но когда в моём случае создаётся экзсемпляр new_point, и после вызова функции new_point.Point(параметры) значения new_point.X и new_point.Y равны 0 (по крайней мере я так заметил) - я сделал вывод что каким-то образом эти значения не передаются вне функции. Бррр... Теперь я не понял. А что должно вернуться? Где инициализация полей класса? Если добавишь Var (да, в Дельфи точно так же, как и в Паскале) - что должно вернуться из функции? Где вообще возврат результата? Функция не возвращает ничего. Компилятор должен выбрасывать предупреждение... |
TarasBer |
2.11.2011 9:22
Сообщение
#11
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> не понимаю я этой С++-ной привычки называть конструктор точно так же, как и сам класс
Она, кстати, не всегда выполняется. Вообще это неудобно. > Кстати, замени там цикл на while Не надо заменять его на while, потому что там останется тот же дурацкий алгоритм за квадрат. -------------------- |
Tan |
2.11.2011 12:47
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Я хочу чтобы внутри функции Point формировались значения для new_point.X и new_point.Y. Для этого я делаю там присваивание X := x, Y := y, но значения не присваиваются и равны 0 (внутри функции они верные), вне функции new_point.X и new_point.Y - 0.
Сообщение отредактировано: Tan - 2.11.2011 12:51 -------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
IUnknown |
2.11.2011 14:38
Сообщение
#13
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Я ж написал:
Цитата Хотя бы перед именем поля поставь Self Т.е., вот так: function point.Point (x : real; y : real; Var id_get : integer) : integer;(Паскаль, как и все языки его группы, не делает разницы между X и x, это для него одна и та же переменная. И то, что ты делаешь - это присвоение параметру самого себя. Смысла - никакого, поле класса вообще не затрагивается). Если перед id_get не поставишь Var, то изменение ее значения внутри Point.Point наружу не выйдет. Только смысла в этом параметре вообще ноль: "если id_get не (-1), то присвоить его значению id, которое в самом начале принудительно ставится в (-1). Если же оно и так (-1) - то ничего не делать" Вдумайся, что тут написано. Это именно то, что ты запрограммировал. Цитата Не надо заменять его на while, потому что там останется тот же дурацкий алгоритм за квадрат. Там останется не "тот же дурацкий", а корректно работающий (в отличие от For-а, я написал почему) алгоритм за квадрат...Сообщение отредактировано: IUnknown - 2.11.2011 14:41 |
TarasBer |
2.11.2011 15:07
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> а корректно работающий (в отличие от For-а, я написал почему) алгоритм за квадрат...
Хорошая отмаза. -------------------- |
Tan |
2.11.2011 15:14
Сообщение
#15
|
Профи Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: 10 |
Спасибо огромное за помощь, ввиду некоторых жизненных обстоятельств мне пришлось вернуться к Delphi - из-за того, что давно там не работал - оттуда и все вытекающие ошибки, на которые вы указали.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Текстовая версия | 7.05.2024 13:00 |