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

Вниз

Оператор if   Найти похожие ветки 

 
SergeyM   (2003-09-20 21:16) [0]

Привет мастерам!
Сталкнулся с такой проблемой, почему
if not (i = m) or (j = n) then
begin
...
работает не правильно, а
if (i = m) or (j = n) then
p:=p
else
begin
...
работает как надо. Но зачем писать лишнюю строку р:=р, ведь для этого же и сделан оператор not, ни че не пойму.


 
Sam Stone ©   (2003-09-20 21:20) [1]

у NOT приоритет выполнения больше, чем у OR
Может, вот так: if NOT ((i=m) OR (j=n)) then.... ?????


 
Вася Пупкин ©   (2003-09-20 21:22) [2]

А ты не пробовал скобки поставить правильно?
if not ((i = m) or (j = n)) then


 
SergeyM   (2003-09-20 21:32) [3]

На счет скобок так это в хелпе так как у меня написано, да и я с этим институтом и Сями все путать начал. Короче при рабочем условии все показывает отлично, но когда закрываю окно то отладчик ругается и говарит что "Неправильный указатель оператора" EInvalidPointer вот кусок кода
function TForm1.Dop(m, n, k: integer): Integer;
var i,j,x,y,p:integer;
begin
x:=0;
y:=0;
SetLength(a,k,k);
for i:=Low(a) to High(a) do
begin
Memo2.Lines.Add("");
for j:=Low(a) to High(a) do
begin
p:=a[i,j];
if (i = m) or (j = n) then p:=p
else
begin
SetLength(e,k-1,k-1);
e[x,y]:=p;
Memo2.SelText:=IntToStr(e[x,y])+" ";
if y = k-1 then
begin
inc(x);
y:=1;
end
else inc(y);
end;
end;
end;

end;


 
SergeyM   (2003-09-20 21:34) [4]

Попробовал if not ((i = m) or (j = n)) then все работает но с предыдущей ошибкой


 
SergeyM   (2003-09-21 18:11) [5]

Мастера помогите почему компилятор выдает исключение EInvalidPointer или EAccessViolation причем может сработать без исключит стуации, может сразу выдать искл., может при закрытии выдать "Runtime error 217 .......". подскажите в чем дело плиззззз.
Вот немного модифицир. от пред. код

function TForm1.Dop(m, n, k: integer): Integer;
var i,j,x,y,p:integer;
begin
{$R-}
x:=0;
y:=0;
SetLength(a,k,k);
for i:=Low(a) to High(a) do
begin
Memo2.Lines.Add("");
for j:=Low(a) to High(a) do
begin
p:=a[i,j];
if not ((i = m) or (j = n)) then
begin
SetLength(e,k-1,k-1);
e[x,y]:=p;
Memo2.SelText:=IntToStr(e[x,y])+" ";
if y = k-1 then
begin
inc(x);
y:=1;
end
else inc(y);
end;
end;
end;
//Result:=0;
end;


 
SergeyM   (2003-09-21 18:26) [6]

Попробовал без динамических массивов все работает в чем же ошибка ?


 
Fenik ©   (2003-09-21 18:31) [7]

SetLength(a,k,k);
->
SetLength(a,k);


 
SergeyM   (2003-09-21 18:35) [8]

Всмысле?. Я пробовал и по одиночке SetLength(a,k); и вместе SetLength(a,k,k);
ошибка и все тут.


 
Fenik ©   (2003-09-21 19:53) [9]

В постинге [3]
http://delphimaster.net/view/8-1063873505/
пример работы с такими массивами.


 
Sam Stone ©   (2003-09-21 21:18) [10]

С помощью SetLength можно задавать длину до 255


 
Fenik ©   (2003-09-21 22:28) [11]

>Sam Stone © (21.09.03 21:18) [10]
>С помощью SetLength можно задавать длину до 255

Шутить не вредно?


 
Плохиш_   (2003-09-21 22:34) [12]

Можно вопрос?

А вообще "a" в этом коде уже существует?


 
Zacho ©   (2003-09-21 23:26) [13]

Не совсем понятен смысл SetLength(e,k-1,k-1); в цикле. Imho, должно быть перед циклом. И проверь, не выходят ли x и y за границы массива e, на первый взгляд - весьма возможно.
Да, и на всякий случай приведи объявление a и e.


 
Zacho ©   (2003-09-21 23:47) [14]

Всяко возможен выход за границы массива e. У первого эл-та динамического массива индекс всегда 0, т.ч. у последнего будет k-2, а не k-1.


 
Zacho ©   (2003-09-21 23:54) [15]

И еще не понятно: в процедуре в массив a ничего не пишется, похоже массив уже заполнен до вызова процедуры, тогда зачем в процедуре SetLength(a,k,k); ?


 
Alex Konshin ©   (2003-09-22 00:17) [16]

if (i<>m) and (j<>n)

И чему вас только в школе учат?


 
SergeyM   (2003-09-22 11:38) [17]

>Не совсем понятен смысл SetLength(e,k-1,k-1); в цикле. Imho, должно быть перед циклом.

Ну а какая разница если и так и эдак не робит.

>Да, и на всякий случай приведи объявление a и e.

a,e: array of array of integer; //глобальные т.к. используются впроцедуре клика и в функции.

>И еще не понятно: в процедуре в массив a ничего не пишется, похоже массив уже заполнен до вызова процедуры, тогда зачем в процедуре SetLength(a,k,k); ?

А каким образом он будет узнавать какой i,j в данный момент.
Повторюсь что без дин. мас. все работает.

вот код всей проги:

var
Form1: TForm1;
//a: array [0..3,0..3] of integer;
//e: array [0..2,0..2] of integer;
a,e: array of array of integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
SetLength(a,4,4);
for i:=0 to high(a) do
begin
Memo1.Lines.Add("");
Memo1.SelText:=" ";
for j:=0 to high(a) do
begin
randomize;
a[i,j]:=random(10)+11;
Memo1.SelText:=(IntToStr(a[i,j])+" ");
end;
end;
Dop(0,0,4);
end;

function TForm1.Dop(m, n, k: integer): Integer;
var i,j,x,y,p:integer;
begin
{$R-}
x:=0;
y:=0;
SetLength(e,k-1,k-1);
SetLength(a,k,k);
for i:=0 to High(a) do
begin
Memo2.Lines.Add("");
for j:=0 to High(a) do
begin
p:=a[i,j];
if not ((i = m) or (j = n)) then
begin

e[x,y]:=p;
Memo2.SelText:=IntToStr(e[x,y])+" ";
if y = k-1 then
begin
inc(x);
y:=1;
end
else inc(y);
end;
end;
end;
//Result:=0;
end;


 
Skier ©   (2003-09-22 11:42) [18]

неправильная работа с SetLength


 
SergeyM   (2003-09-22 11:47) [19]

Подскажи как?


 
Zacho ©   (2003-09-22 11:52) [20]


> SergeyM (22.09.03 11:38) [17]
>
> А каким образом он будет узнавать какой i,j в данный момент

??? Кто он ? Ты и так получаешь размерность массива с помощью Low и High, т.ч. SetLength - абсолютно лишнее в этой процедуре.
Еще раз повторю - ошибка в выходе за границы массива e. В твоей процедуре x и y могут принимать значение k-1, а верхняя граница массива e - k-2.


 
Verg ©   (2003-09-22 11:53) [21]


> if y = k-1 -1 then
> begin
> inc(x);
> y:=0;//1;> end


По-моему здесь.


 
Verg ©   (2003-09-22 11:56) [22]

И вообще такой любитель low/high уж должен был написать:
> if y = high(e) then
> begin
> inc(x);
> y:=low(e);
> end

не так ли?


 
SergeyM   (2003-09-22 12:04) [23]

Убрал SetLength и изменил у:=0 (точно, когда я делал на статич массивах я задавал от 1..4, после забыл исправить) так все равно один раз работает потом рушиться

>Еще раз повторю - ошибка в выходе за границы массива e. В твоей процедуре x и y могут принимать значение k-1, а верхняя граница массива e - k-2.

Если не трудно поясни, ведь если к изначально равно 4, то массив от 0..3, а если к-1 то 0..2 вроде так оно.


 
Verg ©   (2003-09-22 12:09) [24]


> SergeyM (22.09.03 12:04) [23]


Внимательней посмотри - там две ошибки.


 
SergeyM   (2003-09-22 12:12) [25]

Verg подскажи плиззз а то я уже не знаю где их искать


 
Zacho ©   (2003-09-22 12:13) [26]


> Если не трудно поясни, ведь если к изначально равно 4, то
> массив от 0..3, а если к-1 то 0..2 вроде так оно.

Именно так. А ты пытаешься записать в e[x,k-1], т.е. e[x,3] - вот и ошибка. И с x тоже самое может быть


 
SergeyM   (2003-09-22 12:18) [27]

> Именно так. А ты пытаешься записать в e[x,k-1], т.е. e[x,3] - вот и ошибка. И с x тоже самое может быть

Тогда как быть с процедурой в ней все робит без ошибок
ведь SetLength(a,4,4) это 0..3
а SetLength(e,k-1,k-1) при к=4 то 0..2


 
Verg ©   (2003-09-22 12:19) [28]


> SergeyM (22.09.03 12:12) [25]


ЕКЛМН! Еще раз внимательно посмотри:


> Verg © (22.09.03 11:53) [21]


и найди 2 (два) выделенных жирным шрифтом участка!

Как еще-то объяснить.

Вот и Zacho уже по-моему раз десять тебе одно и тоже говорит.


 
SergeyM   (2003-09-22 12:22) [29]

у=к-1 этот баг остался по той же самой причине что описывал ранее , пока вроде все бахает будем усложнять жизнь далее, а пока огромное спасибо до скорых встречь ;-)


 
Verg ©   (2003-09-22 12:23) [30]


> ведь SetLength(a,4,4) это 0..3
> а SetLength(e,k-1,k-1) при к=4 то 0..2


Вы эти школьные замашки-то бросте (под партой на пальцах считать) :))

SetLength(e,k-1,k-1) при к= любое целое, то 0..(k-1)-1


 
SergeyM   (2003-09-22 12:28) [31]

Исправлюсь ;-)



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

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

Наверх




Память: 0.54 MB
Время: 0.018 c
1-3913
Doctor Deejay
2003-09-20 11:48
2003.10.02
Word и его потомки


3-3764
Raven
2003-09-11 15:12
2003.10.02
Подскажите с OraQuery


1-3946
pum5a
2003-09-19 23:35
2003.10.02
Хитро завернутый проект с кучей dll-ок


7-4144
S.P.V
2003-07-15 16:37
2003.10.02
Проблема при печати на HP LaserJat 1100


1-3909
SergeyM
2003-09-20 21:16
2003.10.02
Оператор if