Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

У меня тоже вопрос... По массивам...   Найти похожие ветки 

 
olookin ©   (2004-12-24 21:55) [0]

Почему можно вылезать за пределы массива с четким определением границ? Например, array [0..10] of integer?


 
begin...end ©   (2004-12-24 21:58) [1]

Почему "можно"? В Delphi 7, например, нельзя.


 
olookin ©   (2004-12-24 22:07) [2]

[1] begin...end ©   (24.12.04 21:58)

В 5-ом можно... По крайней мере ничего не происходит, каков бы индекс у элемента массива ни был бы....

Да, я никогда не имел дела с массивами, выписанными в такой форме... Вот поимел недавно... Удивлен был...


 
Поручик ©   (2004-12-24 22:24) [3]

Иногда, поле этого выскакивает AV. А почему иногда, сам не разобрался.


 
olookin ©   (2004-12-24 22:26) [4]

[3] Поручик ©   (24.12.04 22:24)

Иногда? Пустой проект с таким массивом не дал никаких знаков недовольства, хоть бы я вместо 10 написал 139467398541...


 
Sun bittern ©   (2004-12-24 22:29) [5]

Project|Options|Compiler|...


 
SergP ©   (2004-12-24 23:11) [6]


>  olookin ©   (24.12.04 21:55)
> Почему можно вылезать за пределы массива с четким определением
> границ? Например, array [0..10] of integer?


В настройках компилятора есть опция проверять "выползание" за пределы или нет. Если она выключена, то "вылезание" за пределы массива лежит чисто на твоей совести. Т.е. ты сам должен следить за тем чтобы не вылазить за пределы массива.
Да и такой контроль выхода за пределы массива очень часто просто не нужен, особенно если программист не ставит перед собой задачу сделать выход за границы преднамеренно. А проверка - это лишний размер проги и лишние тормоза, так как на это тратится время (пусть и не большое, но тратится)


 
olookin ©   (2004-12-24 23:14) [7]

[6] SergP ©   (24.12.04 23:11)

Можно сделать вывод, что лучше использовать динамические массивы, нежели чем предопределенные? Лично я считаю, что да...


 
SergP ©   (2004-12-24 23:40) [8]


>  [7] olookin ©   (24.12.04 23:14)
> [6] SergP ©   (24.12.04 23:11)
>
> Можно сделать вывод, что лучше использовать динамические
> массивы, нежели чем предопределенные? Лично я считаю, что
> да...


Но ведь очень часто бывает, что заранее известны границы массива, т.е. нужен массив с определенным числом элементов которое не меняется в процессе работы программы. В таком случае и обычный массив подойдет.
Вобщем в разных ситуациях есть свои предпочтения.

Кстати даже если у тебя динамический массив, то тебе все равно нужно следить за тем чтобы не выйти за границы и если понадобились дополнительные элементы, то нужно перед этим изменить длину массива.


 
olookin ©   (2004-12-24 23:44) [9]

[8] SergP ©   (24.12.04 23:40)

С динамическим массивом вышеприведенный пример даст ошибку. Чего и хочется получить...


 
olookin ©   (2004-12-24 23:47) [10]

[8] SergP ©   (24.12.04 23:40)

А насчет предопределенных массивов... Может я и дурак... Может и нет... Но взявши чужой код (и переделавши его на свой лад), я долго не мог понять, почему у меня не считается модель (а там считается). Лишь позже я понял, что там штука в том, что массивы предопределены... Причем обращение к несуществующему элементу запросто игнорировалось там....


 
SergP ©   (2004-12-25 00:00) [11]


> [8] SergP ©   (24.12.04 23:40)
>
> С динамическим массивом вышеприведенный пример даст ошибку.
> Чего и хочется получить...


Вот тебе такой пример:

procedure TForm1.Button1Click(Sender: TObject);
var
 a:array of integer;
begin
 SetLength(a,5);
 label1.Caption:=inttostr(a[9]);
 a[9]:=777;
 label2.Caption:=inttostr(a[9]);
end;


Только что проверял. У меня оно работало без ошибок. Хотя я вылез за пределы масссива. но это не значит что у кого-нить другого в аналогичном коде не возникнет что-то типа "Программа выполнила недопустимую операцию" или AV. Просто я определил длину массива SetLength(a,5); а потом полез к 9-му элементу (а это за пределами массива). Но на самом деле я полез в память которая не принадлежит массиву, она может быть как свободна, так и там может размещаться что-нить нужное, что мы можем испортить.


 
SergP ©   (2004-12-25 00:01) [12]


> [8] SergP ©   (24.12.04 23:40)
>
> С динамическим массивом вышеприведенный пример даст ошибку.
> Чего и хочется получить...


Вот тебе такой пример:

procedure TForm1.Button1Click(Sender: TObject);
var
 a:array of integer;
begin
 SetLength(a,5);
 label1.Caption:=inttostr(a[9]);
 a[9]:=777;
 label2.Caption:=inttostr(a[9]);
end;


Только что проверял. У меня оно работало без ошибок. Хотя я вылез за пределы масссива. но это не значит что у кого-нить другого в аналогичном коде не возникнет что-то типа "Программа выполнила недопустимую операцию" или AV. Просто я определил длину массива SetLength(a,5); а потом полез к 9-му элементу (а это за пределами массива). Но на самом деле я полез в память которая не принадлежит массиву, она может быть как свободна, так и там может размещаться что-нить нужное, что мы можем испортить.


 
olookin ©   (2004-12-25 00:05) [13]

[11] SergP ©   (25.12.04 00:00)

Да. Согласен, есть такое. Тогда я вообще ничего не понимаю в Дельфи... Равно как и в остальных средах (и средствах) программирования


 
Cobalt ©   (2004-12-25 01:33) [14]

2 olookin ©   (25.12.04 00:05) [13]
Хочу ещё разок процитировать:
Sun bittern ©   (24.12.04 22:29) [5]
Project|Options|Compiler|...

Причём, для вступления изменений в силу, проект надо пересобрать.
Вышеприведённый пример SergP ©   (25.12.04 00:00) [11]
При включённой проверке генерит исключение, а при выключенной - нет (AV  у меня не случилось).
У меня стоит по умолчанию - проверка.


 
olookin ©   (2004-12-25 01:50) [15]

[14] Cobalt ©   (25.12.04 01:33)

Range Checking? Или что?


 
Поручик ©   (2004-12-25 05:02) [16]

olookin ©   (25.12.04 1:50) [15]

> Range Checking? Или что?

Да, Range Checking.

olookin ©   (24.12.04 22:26) [4]

> Иногда? Пустой проект с таким массивом не дал никаких
> знаков недовольства, хоть бы я вместо 10 написал
> 139467398541...


Да, иногда. Я писал игру - РПГ. Там карта у меня была - массив 128x128, в первых версиях не было проверки на столкновения с краем, и я гулял туда - сюда. Погуляв в отрицательной области массива, а затем возвращаясь в положительную - пару раз из 20, наверное, дебагов происходило AV.


 
Поручик ©   (2004-12-25 05:11) [17]

Посидел, написал такой искусственнай код, он у меня вызывает AV:
var
 i: integer;
 a: array[0..6] of byte;
begin
 for i:=0 to 6 do
   a[i]:= i;
 for i:= 6 to 100 do
   begin
     a[40-i]:= 7;
     if a[i] = 5 then
       sleep(200);
   end;
 sleep(200);
end;


Причем, если убрать строчку a[40-i]:= 7; то никакого AV не происходит.


 
Ozone ©   (2004-12-25 05:41) [18]


{$R+}
{$R-}


тебе поможет.


 
Поручик ©   (2004-12-25 06:05) [19]

Ozone ©   (25.12.04 5:41) [18]
{$R+}
{$R-}

тебе поможет.


В общем-то мы об этом и говорим.

И еще вопрос.
Чем отличается {$R+} от галочки Range Checking?
Когда ставлю голочку в коде Поручик ©   (25.12.04 5:11) [17], то все равно AV, а когда явно директиву прописываю, то генерируется ERangeError с сообщением Range Checking Error. Аномалия однако. (Delphi 7)


 
SergP ©   (2004-12-25 09:04) [20]


>  [19] Поручик ©   (25.12.04 06:05)
> Ozone ©   (25.12.04 5:41) [18]
> {$R+}
> {$R-}
>
> тебе поможет.
>
> В общем-то мы об этом и говорим.
>
> И еще вопрос.
> Чем отличается {$R+} от галочки Range Checking?
> Когда ставлю голочку в коде Поручик ©   (25.12.04 5:11)
> [17], то все равно AV, а когда явно директиву прописываю,
> то генерируется ERangeError с сообщением Range Checking
> Error. Аномалия однако. (Delphi 7)


см. [14] Cobalt ©   (25.12.04 01:33)


 
Поручик ©   (2004-12-25 09:08) [21]

SergP ©   (25.12.04 9:04) [20]
см. [14] Cobalt ©   (25.12.04 01:33)


Да, действительно.


 
Anatoly Podgoretsky ©   (2004-12-25 14:41) [22]

Можно, но не нужно.
Или проверяй границы сам или похволь делать это компилятору.
А пошло это со статрых времен, когда для имммитации динамических массивов делалось такое определение массива array[0..0] и чтобы это могло работать делалось отключение проверки диапазона. Времена изменились, а ошибки выхода за пределы у программистов остались. По умолчанию проверка выключена.


 
DrPass ©   (2004-12-25 15:00) [23]

Включенная range checking значительно влияет на скорость работы программы. Если алгоритм ресурсоемкий, лучше включить свою внимательность, чем проверку диапазона



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

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.031 c
14-1104003219
e-mike
2004-12-25 22:33
2005.01.16
зависаем..


14-1103896711
Тимур
2004-12-24 16:58
2005.01.16
Железо - хелп!


1-1104211072
Тимур
2004-12-28 08:17
2005.01.16
Опять по ListView


1-1104477366
ЕК
2004-12-31 10:16
2005.01.16
TEdit - программно отразить символ клавиатуры


14-1103443452
MDFE
2004-12-19 11:04
2005.01.16
NNTP сервер для delphimaster.ru (еще один клиент)





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