Помощь новичкам

А как же на 100% бессмысленная проверка индексов массива в отлаженной программе?

Это лишь в простейшей. Да и то, В ОТЛАЖЕННОЙ. А мы помним известную фразу о том, что “Тестирование может доказать наличие ошибок в программе, но никогда не докажет их отсутствия”. Или это я помню, а Вы - нет? ))))

И многократно протестированной тоже.

Я то помню, только вот что даст исключение простому пользователю? Особенно если нет отладочной информации и проект с закрытым исходным кодом? Я понимаю, что Вы не верите, что эта проверка замедляет программу, но я уже приводил пример. И опять таки, 2,5 раза.

Как это - не верю? Любая проверка замедляет, это очевидно. Другой вопрос, что PascalABС.NET - он не для этого. Супероптимизацию при математических вычислениях и работе с массивами дает только Фортран и с этим нужно смириться, нравится Вам это, или нет. Ну вот просто он именно ради этого делался. Отрицать, что нечто специализированное хуже универсального - это не очень логично.

А я и не буду отрицать. Фортран - язык для объёмных научных вычислений. Вы правы. Только почему нельзя оптимизировать Паскаль? Это что, помешает ему?

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

А можно ведь и с другой стороны зайти. Почему бы не сделать директиву компилятора, отключающую проверку на выход за границы массива? А её реализация будет использовать указатели, так как .NET иначе не умеет.

Т.е. дать возможность пользователю развалить свой код? Индекс вышел за границу, адресовались неизвестно куда, случайно попали с модификацией в какую-то ссылку… дальше что? " Ах-вах, шайтан какой, совсем этот Паскаль крышей поехал ! " ? Не знаю, мне это неинтересно, а “заднее слово” - оно, как обычно, за разработчиками.

Почему? Я же сказал, что эта возможность подключается ДИРЕКТИВОЙ, а по умолчанию отключена. Если пользователь уверен в том, что программа работает правильно, он может подписать сверху директиву и ускорить программу.

Это и называется “дать возможность…”.

Вы не замечаете, что все время пытаетесь предложить сделать Паскаль таким, каким он будет удобен лично Вам ? Несмотря на явно сдержанную в этом отношении позицию разработчиков.

Давайте сделаем опрос. Кто хотел бы такую директиву. Описать все за и против, как это сделал @Sun_Serega.

Ну, делайте, чтоб создавать опросы - особые права не нужны)))

Вот только я сомневаюсь что это возможно, пока паскаль это надстройка над .Net, потому что проверка выхода за границы массива это внутренние дела .Net, её в IL коде который генерирует паскаль - нету.

Хотя, можно вместо доступа к массивам - генерировать IL код работы с указателями…

1 лайк

Он именно сделал, а не предлагал сделать. Считаете нужным - делайте, кто же Вам запрещает? Вы ведь наверно уже поняли, что в жизни ценятся не те, кто постоянно предлагает, а те, кто хоть что-то делает ))

В Release версии выход за границы массива по возможности не проверяется.

Вот именно, что по возможности. А надо везде. Куда тогда половина ресурсов улетучивается?

И тут:

begin
  var a := new integer[10];
  var n := ReadInteger('Пожалуйста, не вводите число большее 10: ');
  for var i:= 0 to n-1 do
    a[i] := i;
end.

?

Проверку можно сделать отдельно. Чтоб она проверялась 1 а не 20 (10 раз доступ * 2 проверки, нижняя и верхняя граница):

begin
  var a := new integer[10];
  var n := ReadInteger('Пожалуйста, не вводите число большее 10: ');
  if n > 10 then raise new Exception;
  {$arrptr a}
  {$arrptr for i in a}//это типо значит, что для "a" мы создаём здесь указатель и следующий цикл вместе с изменением "i" будет прибавлять 1 к тому указателю
  for var i:= 0 to n-1 do
    a[i] := i;
end.

Ожидается, что это развернётся во что то такое (конечно, в паскале нет fixed, поэтому это псевдокод)

begin
  var a := new integer[10];
  var n := ReadInteger('Пожалуйста, не вводите число большее 10: ');
  if n > 10 then raise new Exception;
  fixed a do//{$arrptr a}
  begin
    var ptr := @a[0]//{$arrptr for i in a}
    for var i:= 0 to n-1 do
    begin
      ptr^ := i;
      ptr += 1;
    end;
  end;
end.
1 лайк

Ваша идея очень интересная, но всё же было бы проще ввести сначала fixed. Но мне кажется, что в Паскале массивы по умолчанию fixed.

Можно и тут. :smile: