New и строковые поля.

Да, так и есть. Она требует явного освобождения. Она диспетчеризуется совершенно другим механизмом. Наличие двух видов памяти - это дополнительная сложность системы времени выполнения.

Спасибо. Примерно понятно. Это все штучки из .NET

Может, я опять за свое, но тоже хочу понять. Зачем пытаться тащить в Паскаль то, что Microsoft практически выкинула из C# ? Практически - потому что оставила возможность писать unsafe коды, но оговорилась, что это надо сугубо для “системных штучек”. Ну умерли указатели - и светлая им память! Паскаль для чего - разрабатывать программы для головок самонаведения ракет? Или все же это просто “первый язык” ?

Может я глубоко неправ - пусть меня “старшие товарищи” поправят. Но указатели и ссылки - это спуск на нижний уровень абстракции (в сторону ассемблера).

Мы говорим: давайте сначала научимся строить домики из блоков, а потом разберемся в кирпичиках, из которых эти блоки сделаны. А в ответ разговоры о том, что мол какие кирпичики? Сначала надо организовать глиняный карьер, кирпичный завод построить… а уж потом про кирпичи…

1 лайк

Так и есть. Редко, но бывает надо. Вот кусочек из GraphABC:

Result := False;
  for var y:=0 to b1.Height-1 do
  begin
    for var x:=0 to b1.Width-1 do
    begin
      p1 := PRGB(pointer(iptr1));
      p2 := PRGB(pointer(iptr2));
      if (p1^<>$FFFFFFFF) and (p2^<>$FFFFFFFF) then
      begin
        Result := True;
        goto 1;
      end;
      iptr1 += pixelFormatSize;
      iptr2 += pixelFormatSize;
    end;
    iptr1 += Offset;
    iptr2 += Offset;
  end;
1: 

Первый язык… Если ограничить роль PascalABC.NET первым языком, то им никто пользоваться не будет.

Замечу, что спор возник спустя 10 лет после того как мы это всё сделали. Это значит, сидит это всё глубоко, и до сих пор никто не чувствовал неудобств. Начинающие использовали то, что им надо, прогрессивные использовали своё. Всё было хорошо. Очевидно, где-то в глубине эти миры пересекаются. Ну и относитесь к этому спокойно.

Я и отношусь спокойно. И вовсе не против, что есть средства, позволяющие “закапываться”. А высказаться решил, “патамушта жаба”. Я все жду, пока появятся столь желанные недореализованные средства для работы с матрицами, чтобы закрыть эту тему; там вон еще три ошибки гуляют, надеюсь, как Вы писали, все ошибки кто-то видит и регистрирует, а тут начинается разговор про переделку низкоуровневых операций! Естественно, беспокоит, у вас же там не сто человек в разработчиках (“Верблюд - лошадь созданная комитетом” - помним!).

Совсем не имел в виду “ограничить”. Изучать в качестве первого. И язык должен давать возможность не лезть на низкий уровень, Мы, когда пользуемся бытовой техникой, оргтехникой, автомашиной - все же большинство из нас обходится без “ковыряния отверткой”. Ну отлично, что она есть в PascalABC.NET. Кулибиным её в руки. А большинство все же предпочтет обойтись тем, что есть. В этом прелесть высокоуровневых языков. Наверно, чтобы это понять всеми клеточками организма, стоило лет пять хотя-бы поработать даже без ассемблера, в восьмеричных и шестнадцатиричных кодах напрямую, поковыряться в реализации машинной математики на уровне микрокодов процессора и воспринять ассемблер System/360/370, как откровение. И потом, добравшись до языковых абстракций уровня SQL и им подобных, начинаешь понимать, насколько все же не хочется снова опускаться туда, где указатель ссылается на указатель, который ссылается на вектор указателей…

Станислав Станиславович, у меня предложение. Нельзя ли сделать что-нибудь под названием, например, NewABC (как GraphABC), которая делает то же, что и New, но выделяет блок управляемой памяти? Может, это не так сложно?

Это уже сделано:

var t := new Node;

Да, так получается. Заменой record на class, “^.” на “.” и приравниванием типа указателя к типу записи (класса то есть).

В справке, однако, написано: “Исключение составляют динамические массивы и строки, обрабатываемые особым образом. То есть, можно делать указатели на записи, содержащие в качестве полей строки и динамические массивы.”

А по твоему New единственный способ создать указатель? я всегда пользовался @ и у меня не было такой проблемы. То есть разница в том что для начала в управляемой памяти создаёшь переменную а потом делаешь указатель на неё и уже ничто не удалится сборщиком мусора.

Только сборщик мусора ее переместит через какое-то время и указатель станет недействительным

Дело не том, единственный или не единственный, а в том, что New§ - это настоящий Паскаль с самого его появления. И это высокоуровневое средство, дающее определенную безопасность. А @ - это диалектизм, который нарушает соглашения безопасности. И просьба не “тыкать”.