Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Указатели на шаблонные записи в PascalABC.Net 2.2

12.08.2018, 18:55. Показов 1121. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скачал недавно PascalABC.Net 2.2. (Надоели новшества из 3.4.)

Написал пример:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record
    where T: record;
    
    fNext: PSomething<T>;
  end;
 
function NewSomething<T>(x: T; v1, v2: PSomething<T>): object;
begin
end;
 
begin
end.
Выдал:
Program3.pas(2) : Невозможно инстанцировать, так как тип T не является размерным
Я согласился с этим. Ведь, неизвестно, что прячется за T (хотя, смутило немного - я же указал ограничение на T). В справке, например, написано:
Ввиду особенностей платформы .NET тип T типизированного указателя не должен быть ссылочным или содержать ссылочные типы на каком-то уровне (например, запрещены указатели на записи, у которых одно из полей имеет ссылочный тип).
Дальше, посмотрел поведение компилятора на трех случаях:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record
    //where T: record; // <-- Магия, скомпилировалось. Хотя, я не думаю, что это правильно.
    
    fNext: PSomething<T>;
  end;
 
function NewSomething<T>(x: T; v1, v2: PSomething<T>): object;
begin
end;
 
begin
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record
    where T: record;
    
    fNext: PSomething<T>;
  end;
 
{function NewSomething<T>(x: T; v1, v2: PSomething<T>): object; // <-- Скомпилировалось благодаря тому, что закомментировал функцию - тоже не понятно почему.
begin
end;}
 
begin
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Тут тоже не понятно почему скомпилировалось - неизвестно что это за тип T.
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record
    //where T: record;
    
    fNext: PSomething<T>;
  end;
 
{function NewSomething<T>(x: T; v1, v2: PSomething<T>): object;
begin
end;}
 
begin
end.
Какое Ваше мнение по этому поводу?

Добавлено через 23 минуты
В общем: если закомментировать функцию или ограничение в where - ошибка компиляции исчезает.

Добавлено через 19 минут
Кликните здесь для просмотра всего текста

В 3.4 (сборка 1738) компилируется это:
Pascal
1
2
3
4
5
6
7
8
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record
    fX: T;
  end;
 
begin
end.
На мой взгляд, не должно - тип T неизвестно размерный ли или ссылочный. И никак не гарантировать, что fX не будет ссылочного типа.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2018, 18:55
Ответы с готовыми решениями:

PascalABC.NET Записи
Помогите переделать по процедуры и функции:cry: type spisok = record surname: string; name: string; otchestvo:...

PascalABC.NET Тема: Записи
Задание: В библиотеке для каждого посетителя заполняется карточка: фамилия, дата заказа, дата выдачи книги. Определить: 1) кто чаще всего...

В чем разница PascalABC.net и PascalABC
Скажите в чем разница PascalABC.net И PascalABC. Помню когда-то давно программы работающие в PascalABC у меня не работали в .net

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
12.08.2018, 22:01
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
И никак не гарантировать, что fX не будет ссылочного типа.
Даже если и будет - это не помешает приведенной программе откомпилироваться:

Pascal
1
2
3
4
5
6
7
8
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record where T : class;
    fX: T;
  end;
 
begin
end. // Все нормально, ошибки нет
, но вот при инстанцировании получишь ошибку:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  PSomething<T> = ^TSomething<T>;
  TSomething<T> = record where T : class;
    fX: T;
  end;
 
type
  Cl = class
  end;
var
  v : PSomething<Cl>; // Облом-с
  
begin
end.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
12.08.2018, 22:04  [ТС]
volvo, странно. Я думал, что компилятор сразу должен ошибку выдавать. Точнее, ошибка будет всегда только при инстанцировании?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
12.08.2018, 22:26
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

В большинстве случаев - да, только при инстанцировании. Но если тело функции заведомо ошибочно для какого-то из типов - то еще до инстанцирования получишь ошибку (в хелпе есть пример с функцией Sum, скажем. Сложение определено для чисел, строк. Но не для указателей, не для классов, и т. д.)

Кстати,
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
// <-- Скомпилировалось благодаря тому, что закомментировал функцию - тоже не понятно почему.
Мог бы скомпилировать и не комментируя функцию, если бы для функции задал тот же констрейнт, как и для класса.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.08.2018, 22:26
Помогаю со студенческими работами здесь

Установится ли PascalABC.NET на систему, где установлен только .NET 4.6.1?
Привет всем. Вопрос, собственно, озвучен выше. Конкретнее: есть компьютер со свежеустановленной Win10 x64, на которой присутствует...

Указатели в Turbo Pascal и PascalABC
Вопрос: почему в Turbo Pascal тактая конструкция const TAB = ^I; begin end. работает, а в PascalABC - нет. Ошибка:...

Шаблонные указатели на функции и их генерация
Здравствуйте! Насколько я понимаю, не существует синтаксиса для объявления указателей на функции при помощи using. Однако typedef не...

График температур. Подправить код из turbo (не знаю где писать в PascalABC или PascalABC.net)
На Pascal ABC не запускается(( uses crt,graph; const n=31; {массив - константа, можно ввести с клавиатуры} ...

Где можно скачать PascalABC а не PascalABC.Net
Где можно скачать PascalABC а не PascalABC.Net?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru