Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];
ВнизОператор 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.011 c