Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизAccess violation... :((( Найти похожие ветки
← →
$Hic0 (2003-03-28 17:57) [0]День добрый! Есть процедура
procedure SHIFTL(var AA);
var
i :integer;
A :array[0..Ammount] of integer absolute AA;
begin
for i:=Ammount-1 downto 0 do
Begin
A[i]:=A[i+1];
End;
end;{ SHIFTL }
Обычный сдвиг влево, все работает как надо... а когда я пишу вместо A[i]:=A[i+1]; вот это A[i]:=A[i+1];, т.е. превращаю его в свид вправо, программа через некоторое количество тактов вылетает, причем дебагер не показывет причину ошибки, а выплевывается ассемблерное окно... в чем дело? Может кто подскажет? Ammount константа, передаваемый массив естесна динамический, но создан проинициализирован и все как надо, причем программа может работать довольно долго... в чем баг никак не пойму...
Кто знает... помогите, зарнее спасибо.
← →
$Hic0 (2003-03-28 17:58) [1]Ссоории, вкралась опечатка, когда я пишу A[i+1]:=A[i]... именно после этого программа вылетает...
← →
Anatoly Podgoretsky (2003-03-28 18:03) [2]Найдите два отличия
вместо A[i]:=A[i+1];
вот это A[i]:=A[i+1];
Второе, зачем нужно var AA, когда можно сразу передавать нужный тип, без лишнего приведения, наверно для того, что бы получить некоторое количество ошибок.
← →
Palladin (2003-03-28 18:09) [3]
> $Hic0 © (28.03.03 17:57)
приведи код с вызовом процедуры...
← →
$Hic0 (2003-03-28 18:10) [4]Анатолий, я к сожалению немного запарился, но уже поправился :) А так, сделанно для того что-бы передавать туда то что нужно мне, например иногда завместо массива целых чисел я передаю туда матрицу типа boolean :) Не было такой цели захламлять итак раздутый класс оверрайдами, поэтому сделанно именно так :)
← →
Palladin (2003-03-28 18:14) [5]
> $Hic0 © (28.03.03 18:10)
надеюсь ты учитываешь что, передаваемое в общей сложности должно иметь размер кратный SizeOf(integer)?
← →
$Hic0 (2003-03-28 18:16) [6]2Palladin
begin
if ChangedPos(Image,Estem) then begin
SHIFTR(FActs); FActs[0]:=Action;
SHIFTR(FEstems); FEstems[0]:=Estem;
p:=FImages[Ammount];SHIFTR(FImages);FImages[0]:=p;
EQUAL(p,Image);
FindPositions;
end;
p:=nil;
end; { Save }
Где FActs и FEstems массивы целыйх чисел. А FImages :array[0..Ammount] of TArrayBOL; где TArrayBOL : array of Boolean
Соответственно и p: TArrayBOL :)
В общем вот так вот... Большой проект, но дело именно внутри, почему сам не пойму, да и Дельфи, для дебагера это явно внештатная ситуация, потому-что, как я уже говорил выдается ассембелрное окно без указания строки вызвавшей ошибку... в общем чудеса на виражах :)
← →
$Hic0 (2003-03-28 18:19) [7]2Palladin
SizeOfInteger=SizeofPointer=4, разве нет? :)
← →
Palladin (2003-03-28 18:21) [8]
> $Hic0 © (28.03.03 18:16)
смотри
> Palladin © (28.03.03 18:14)
и проверь на кратность...
в любом случае так будет интересней...
procedure SHIFTL(var AA);
var
i :byte;
A :array[0..Ammount] of byte absolute AA;
begin
i:=A[Ammount];
Move(A[0],A[1],Ammount-1);
A[0]:=i;
end;
← →
Mike Kouzmine (2003-03-28 18:22) [9]На каком i вылетает, соответствие Ammcount и действительного размера массива
← →
Palladin (2003-03-28 18:22) [10]
> $Hic0 © (28.03.03 18:19)
ну не всегда... но в подавляющем большинстве случаев да...
← →
$Hic0 (2003-03-28 18:27) [11]2Mike Kouzmine
1. Без малейшего понятия, процедура запускается множество раз, за всю жизнь программы, ну очень часто, и на каком именно i отслеидить не могу... пытался по F7, но ничего не вышло, два часа кликал по пимпе, а ошибка не появилась, программа может работать минут 10, а потом вылететь :)
2. Соответсвие один к одному железно. Ammount -константа, и в конструкторе все массивы инициализируются именно такого размера.
← →
Palladin (2003-03-28 18:28) [12]интересно...
поподробней разобрав пример чувствую как Anatoly Podgoretsky © был прав в отношении
зачем нужно var AA, когда можно сразу передавать нужный тип, без лишнего приведения, наверно для того, что бы получить некоторое количество ошибок.
← →
Palladin (2003-03-28 18:31) [13]что происходит на самом деле...
на самом деле у тебя идет работа с указателем и не с массивом...
я тоже по глупости не заметил...
оставь процедуру как есть но в программе замени
begin
if ChangedPos(Image,Estem) then begin
SHIFTR(FActs[0]); FActs[0]:=Action;
SHIFTR(FEstems[0]); FEstems[0]:=Estem;
p:=FImages[Ammount];SHIFTR(FImages[0]);FImages[0]:=p;
EQUAL(p,Image);
FindPositions;
end;
p:=nil;
end; { Save }
← →
Anatoly Podgoretsky (2003-03-28 18:36) [14]Матрицу? Это нечто двузмерное и при этом динамический массив, тогда твоя конструкция в принципе работать не может, поскольку первое измерение указатели.
← →
$Hic0 (2003-03-28 19:12) [15]Спасибо ребяты, Боже, я говорил что я туда передаб массивы?:) Проситет дурака грешного, как я могу туда передавать масивы а тем более матрицы, естесвенно указатели :)
2Palladin
Спасибо, последнее решение кажется очень логичным :) Сейчас пойду пробовать!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c