Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Invalid pointer operation - почему???


Автор: Traum 30.1.2004, 16:11
Суть проблемы:
Есть таблица StringGrid. В ней пользователь задает число строк и вводит числа real (должны быть не равными нулю). Создается динамический массив для введенных данных. Далее проверяется не равен ли нулю хоть один. Если равен нулю хоть одно значение то обнуление динам. массива (:=nil) и прерывание процедуры с помощью exit. Если пользователь несколько раз будет ошибаться то периодически (причем не всегда) начнет появляться ошибка "Invalid pointer operation" В чем проблема?

Автор: Serggggg 30.1.2004, 16:38
Не совсем понятно.
Если пользователь ошибся один раз из N возможных, то автоматом затирается весь массив? И потом, если пользователь ошибается во второй раз, то массив снова стирается?
Может, я не совсем въехал в суть метода, но, по-моему, во второй раз уже происходит попытка затирания пустой области памяти. Поэтому pointer может и обругать. Но не совсем уверен, что проблемма именно в этом.
Приведи код, если не сложно.

С уважением, Serggggg

Автор: <Spawn> 30.1.2004, 18:40
Traum код в студию.

Автор: Гость_Traum 30.1.2004, 18:46
Вот упрощенно:

procedure TForm_Daten.Button1Click(Sender: TObject);
begin
//создаем массив (n- получено от пользователя)
SetLength(L,n);
//считываем данные
For i:=0 to n-1 do
try L:=StrToFloat(Tabl.Cells[1,i+1]);except L:=nil; exit;end;
[I]//проверяем на допустимость

For i:=0 to n-1 do
if L[i]<L_min then begin L:=nil; exit; end;
end;
Ну там еще вводятся другие данные (обычные) (прием и обработка анологично как для L)
Если несколько раз вводить не то что надо то почемуто возникает (причем периодически) выше указанная ошибка.

Автор: Петрович 30.1.2004, 22:37
Ошибка в
Код
try L:=StrToFloat(Tabl.Cells[1,i+1]);except L:=nil; exit;end;

А точнее в L:=StrToFloat(Tabl.Cells[1,i+1]);
Присваивание наверное надо делать не всему массиву, а лишь текущему элементу:
Код
try L[i]:=StrToFloat(Tabl.Cells[1,i+1]);except L:=nil; exit;end;

Странно, но мне кажется что ошибка должна возникать не иногда, а всегда!
Либо, когда она не возникает, то во втором цикле ты работаешь не с введенными данными, а с лабудой.

Автор: Traum 31.1.2004, 14:37
Петрович
Я тоже был удивлен когда сначала возникала ошибка а при последующих двух нажатиях ее нет (а потом снова ...)

Переписал заново большой блок программы с тестированием после добавления каждой строки и вроде бы ничего не изменял, а ошибка исчезла (вроде бы). Единственное подозрение: в одном месте старой версии сравнивал k1>k2, где k1 - double, а k2 - const.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)