Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

"Invalid pointer operation" при закрытии.   Найти похожие ветки 

 
VitGun ©   (2004-11-19 19:30) [0]

Проблема вот в чем. При закрытии программы вываливается сообщение "Invalid pointer operation".
В программе есть динамический массив. Если не задавать ему длину и не создавать его элементы, то прога
закрывается нармально, но если создать, то "Invalid pointer operation". В собыии OnClose главной формы написал

cap:=nil

где:
cap:array of real;

Прочитал в одной статье, что так массивы уничтожаються (aka Dispose для указателей в Pascal), но нифига не
помогает...что я не сделал? Где руки выпрямлять?


 
wicked ©   (2004-11-19 19:47) [1]

а зачем ему nil присваивать?.... он и сам уничтожится....


 
GLFox   (2004-11-19 20:07) [2]

SetLength(YourDynamicArray,0);


 
VitGun ©   (2004-11-19 20:07) [3]

2 wicked
Нифига...хоть присваивай nil, хоть не присваивай...все равно "Invalid pointer operation"


 
VitGun ©   (2004-11-19 20:10) [4]

2 GLFox и это тож пробовал...те же яйца только в профиль...


 
GLFox   (2004-11-19 20:12) [5]

А еще какие поинтеры используешь?


 
VitGun ©   (2004-11-19 20:19) [6]

Никаких...в том то и дело. Это единственный DynamicArray во всей проге...


 
Anatoly Podgoretsky ©   (2004-11-19 20:20) [7]

У тебя ошибка в программе.


 
VitGun ©   (2004-11-19 20:22) [8]

2 Anatoly Podgoretsky. Угу. Я догадался...вопрос в другом...где?
Если динаические массивы не использовать, то все ОК, если использовать - то трабл.


 
DrPass ©   (2004-11-19 20:27) [9]


> Если динаические массивы не использовать,

Второй наводящий вопрос: а как ты их используешь?


 
VitGun ©   (2004-11-19 20:39) [10]

2 DrPass.

...
Setlength(cap,len);
...
где len - некоторая переменная типа integer
...
for i:=0 to len do
begin
  cap[i]:=something;
end;
...


 
begin...end ©   (2004-11-19 20:40) [11]


> [10] VitGun ©   (19.11.04 20:39)

Ну вот видишь, как всё просто оказалось, всего-то надо заменить len на len - 1 (в заголовке цикла).


 
Anatoly Podgoretsky ©   (2004-11-19 20:41) [12]

VitGun ©   (19.11.04 20:22) [8]
Да, да именно так, ошибка при работе с динамическими массивами, вот теперь когда способился привести хоть чуть кода, то это уже стало не предположением, а истиной. Ты выходишь за пределы массива, а контроль за этим явно отключил.
Для начала срочно в настройки компилятор, проштудировать их и до тех пор ни строчки кода или же пиши без ошибок.


 
Anatoly Podgoretsky ©   (2004-11-19 20:43) [13]

begin...end ©   (19.11.04 20:40) [11]
Ну сдесь исправит, так в другом месте вылезет, надо не заплатки, а как минимум включить контроль за границами.


 
Anatoly Podgoretsky ©   (2004-11-19 20:45) [14]

Сделай для начала так
SetLength(,2) затем на бумажке пишешь, вручную прокручивая цикл
I = ?
..
I = ?

и считаешь количество строк, затем сравниваешь с количеством строк массиса


 
begin...end ©   (2004-11-19 20:45) [15]


> [13] Anatoly Podgoretsky ©   (19.11.04 20:43)

Ну это само собой, а также, ИМХО, лучше пользоваться в таких случаях не конкретной переменной, а High(cap).


 
VitGun ©   (2004-11-19 20:47) [16]

2 Anatoly Podgoretsky

Уж извините..нет. За пределы массива я не выпадаю. Сие мне известно и контроль включен. Ошибка появляется при ЗАКРЫТИИпрограммы, а не во время выполнения.


 
begin...end ©   (2004-11-19 20:48) [17]


> [16] VitGun ©   (19.11.04 20:47)

Какой недоверчивый, какая разница - во время выполнения или при закрытии, программа просто злопамятная, вот и ругается только в конце.


 
VitGun ©   (2004-11-19 20:51) [18]

Хм...
Полтергейтс однако... len - 1 не помогло, а вот len-2 помогло.


 
GLFox   (2004-11-19 20:51) [19]


for i:=0 to len do
begin
 cap[i]:=something;
end;

Данный код не может быть верным! Индексы в динамических массивах начинаются с НУЛЯ и заканчиваются на Length(YourArray)-1.


 
VitGun ©   (2004-11-19 20:53) [20]

Блин...работает...
2 begin...end & Anatoly Podgoretsky - respect. Спасибо за помощь!


 
Anatoly Podgoretsky ©   (2004-11-19 20:56) [21]

VitGun ©   (19.11.04 20:47) [16]
Ой не надо отпираться от горячего, ты бы уж не проводил свой код, а теперь краснеть надо за продолжающее развешивание лапшию
Кроме того ты выполнил домашнее задание в 14, сколько у тебя получилось?


 
Anatoly Podgoretsky ©   (2004-11-19 20:58) [22]

begin...end ©   (19.11.04 20:45) [15]
Ну это способ писать без ошибок, особенно если к ней добавить еще и Low


 
Palladin ©   (2004-11-19 20:59) [23]


> [16] VitGun ©   (19.11.04 20:47)

ты может быть сначала вникнешь прежде чем сопротивляться... не веди себя как ламер...


 
VitGun ©   (2004-11-19 21:07) [24]

2 Anatoly Podgoretsky:
[14] пост не видел - сорри.
2 Palladin.
Да понял я в чем моя ошибка. Я то был уверен, что обращаюсь к верному кол-ву элементов массива, т.е ошибка была именно в цикле.

len - есть кол-во записей в ValueListEditor. Я брал
len=ValueListEditor.RowCount-1.



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.219 c
14-1100708745
Димитрий
2004-11-17 19:25
2004.12.05
Лавров высказался за продажу Курильских островов


3-1099648336
vvv
2004-11-05 12:52
2004.12.05
MasterSource-MasterField


8-1094490378
Klopan
2004-09-06 21:06
2004.12.05
mp3 player в DOS


9-1090574993
Megabyte-CeerCop
2004-07-23 13:29
2004.12.05
Игра готова


1-1100862998
Dolphin001
2004-11-19 14:16
2004.12.05
msEquation