Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.007 c
3-19474
Сергей Шапранов
2003-03-19 14:08
2003.04.07
Работа Paradox в сети


1-19673
Dimonich
2003-03-24 15:04
2003.04.07
Авторан


3-19484
spogi
2003-03-19 12:58
2003.04.07
v Paradox ne integer a real, ili float. ctobi...


14-19842
ruben
2003-03-15 04:39
2003.04.07
Почему меня не понимают?


3-19427
ArtemB
2003-03-18 12:28
2003.04.07
Работа с базами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский