Указатели на ссылочные типы

Добрый день. Есть такая простенькая конструкция

    program test;
    type
      d = string;
      dat = ^d;
       begin
        end.

при компиляции выдает ошибку : Указатели на ссылочные типы недопустимы. В то же время с char и integer нормально работает. Как это исправить?

Не использовать ссылочный тип или не использовать указатель. Или не использовать PascalАВС.NЕТ. Вы подумайте сначала - нужен ли Вам вообще указатель? Указатели - все же удел более низкоуровневых языков типа С/С++. А в .NET языках более популярны ссылки.

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

В fpc предложенный пример компилируется без проблем (проверено на x86 и amd64).

Благодарю за пример для тестового пакета.

Потому что в fpc string размерные. То есть они всегда занимают 256 байт в памяти, вне зависимости фактической длины во время выполнения. И не могут быть больше 255 символов по длине (если не указать string[...], но тогда и памяти больше надо).

В PascalABC.Net тоже можно реализовать размерную строку:

type
  [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit, Size = 256)]
  ShortString = record
    private [System.Runtime.InteropServices.FieldOffset(0)] len: byte;
    
    //ToDo Всякие проверки, чтоб не брать элементы за пределами len и т.п.
    public property Length: integer read integer(len);
    
    public property Item[ind: integer]: byte
    read PByte(pointer(System.IntPtr.Add(new System.IntPtr(@len), ind)))^
    write PByte(pointer(System.IntPtr.Add(new System.IntPtr(@len), ind)))^ := value;
    default;
    
    public property ItemUnicode[ind: integer]: char read ChrAnsi(Item[ind]) write Item[ind] := OrdAnsi(value);
    
  end;
  
begin
  var s: ShortString;
  s[1] := OrdAnsi( 'ж' );
  s.ItemUnicode[2] := 'ж';
  s.ItemUnicode[2].Println;
end.

Но никто, в своём уме, не будет использовать такое для чего-либо кроме совместимости со старым или неуправляемым кодом.

Да и для неуправляемого - уже есть Marshal.PtrToStringAnsi и Marshal.StringToHGlobalAnsi, преобразовывающие между неуправляемым и управляемыми строками, поэтому отдельный тип, обычно, нет смысла объявлять.

2 симпатии

Здесь основное состоит в том, что PascalABC.NET - это не fpc.

1 симпатия

Собственно говоря просто пытался выполнить пример программы написанной в fpc. Ну и столкнулся с этой ошибкой при том что эта программа в fpc и lazarus работает нормально

Тогда совет только 1. Не пытайтесь учить современный язык по учебникам другого, старого языка.

На официальном сайте данного языка (pascalabc.net) полно материалов для самообучения.

2 симпатии

Если Вы хотите хотите гарантированно исполнять код от FPC, взятый из учебника или задачника по FPC, то используйте FPC, пожалуйста. Еще раз: описанная у Вас строка в PascalАВС.NЕТ - это объект .NET - среды ссылочного типа и пытаться получить на него указатель - пустое дело. Даже если бы удалось это сделать, то работать с ним не получится.

Причина здесь в следующем. PascalABC.NET - язык, в котором, как и C#, память управляется сборщиком мусора. Это значит, что строка в любой момент может быть передвинута в памяти в другое место. И ваш указатель - если такое разрешить в компиляторе - станет недействительным.

Если проще, низкоуровневое управление памятью в PascalABC.NET разрешено в ограниченном виде. Указатели на ссылки запрещены. Указатели на любые размерные типы, которые располагаются на стеке, разрешены.

1 симпатия

Рискованное заявление.

ИМХО определение “дотнетовский язык” более точное.

Наличие указателей на любой тип в языке Паскаль требуется по стандарту ISO 7185 http://www.moorecad.com/standardpascal/iso7185.pdf . Несоответствие этому стандарту (то есть существование типов, указатели на которые не допускаются) говорит о том, что язык является “не вполне Паскалем”. Ссылка как элемент языка в стандарте ISO 7185 отсутствует.

Что Вы тогда вообще здесь делаете со своим первичным вопросом,указав в коде d = string; ? Строк без указания длины в стандарте тоже нет. И массивов нет динамических. И классов. И вообще, стандарту не соответствует НИ ОДИН существующий компилятор. Или это так, потроллить? Так тут таких было и до Вас немало, особенно с весенними обострениями, вот только где они все теперь?

1 симпатия

Первичный вопрос вообще-то не мой.

Это прискорбно, кстати.

Это к вопросу о том, на чём учить школьников. Могу объяснить, почему я считаю неприемлемым для этого любой несвободный софт: вкратце – питерские полицейские научились шить 146-ю активистам из школьников и студентов, у которых по неосторожности на смартах или ноутах используется коммерческий софт, в частности, Windows; думаю, ноу-хау обязательно пойдёт вширь по России.

fpc достаточно часто встречается в производственных применениях из-за широчайшего спектра поддерживаемых аппаратных архитектур и ОС, потому с ним связываться есть определённый смысл. Смысл связываться с PascalABC.NET определённо будет, если 1) он будет работать под mono; 2) в нём будет доступны работающие в mono инструментарии для создания пользовательских интерфейсов, пока из таких есть только Windows.Forms, но в сборку для mono он вроде бы не включен.

(Если нужна помощь в доводке проекта на mono – через некоторое время смогу оказать.)

1 симпатия

Статистику видели? Можете продолжать воевать с ветряными мельницами, это Ваше право. Снимок

1 симпатия

Вам по идее нужно разобраться, из-за чего не запускается у Вас консольный компилятор под Mono.

Под Mono неплохо бы было написать простую IDE - желательно с Intellisense - либо интегрировать в уже существующую.

  1. Я знаю, как получаются цифры типа 86,82%, – по строкам User-Agent в веб-обозревателях. Ну дак на юниксах в эту строку обычно записывается “**********/Windows”, дабы избежать подсовывания особенных веб-страниц ретивыми веб-разработчиками.

  2. А оффлайновые установки как считались? ))))))

  3. Проблема развендузовывания даже не в вендах как таковых, а в МСО, не поддерживающем полностью никаких опубликованных стандартов и описаний, включая микрософтовские; в частности, и OOXML, и ODF в МСО поддерживаются не полностью, причём по-разному в разных версиях (это значит, в частности, что разные версии МСО не полностью совместимы друг с другом). Если на ключевых точках подсадки будет стоять LO или OOo (не важно, на какой операционной платформе), от МСО можно будет сравнительно легко избавиться.

  1. Работаю.
  2. В Mono достаточно муторно делать оконные интерфейсы – на выбор Windows.Forms, GTK# или инструментарии для использования Qt, в любом случае писать с нуля немыслимо, а адаптация существующего проекта – несколько человеко-лет работы.

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

Ага, Вам особую страничку по запросу GET с “User-Agent: Mozilla/5.0 (Linux)” не выдавали. Везёт же людям.

Дело не в том, что “линуксов больше, чем кажется”, я этого не утверждаю. Я утверждаю, что “годных методик оценки распространённости ОС в глобальных сетях не существует”. Подделать можно даже тайминги отклика сетевого стека, если нужно, а не соответствующий реальности профиль парка сетевых клиентов – важный элемент безопасности их владельца.

 Институт математики, механики и компьютерных наук ЮФУ, 2005–2018
Администрация форума: В.Н. Брагилевский, С.С. Михалкович, А.М. Пеленицын
Yandex.Metrica