Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-3954
MIKL
2003-09-20 16:01
2003.10.02
Кисть!


1-3835
Sunny
2003-09-19 13:39
2003.10.02
COM + потоки


1-3891
dmtr
2003-09-17 15:31
2003.10.02
Масштабирование записей в QuickReport


1-3868
Дима
2003-09-18 19:55
2003.10.02
Перерисовка окна при передвижении


6-4031
SergeyB
2003-07-15 10:59
2003.10.02
NetDDe & Delphi 5.0





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский