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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
6-19732
Vampire
2003-02-11 18:51
2003.04.07
Перекачка


1-19671
Filmax
2003-03-26 05:06
2003.04.07
Как преобразовать строку2


3-19498
Smalik
2003-03-19 15:20
2003.04.07
База данных - риторический вопрос.


14-19768
GDBoy
2003-03-20 20:50
2003.04.07
Посоветуйте, плз, на каких сайтах можно найти хорошие книги...


14-19834
Link-ov
2003-03-20 16:35
2003.04.07
QReport