Болталка PascalABC.NET

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

А в данном случае — альтернативы есть, следовательно про существование FileInfo лучше забыть.

Именно

Не вижу ни одной причины

1 лайк
type
  t0 = class
    i := 3;
  end;
  
  t1 = record
    i := 5;
    o := new t0;
  end;
  
begin
  var a := new t1;
  var p := @a; // потому что ^t1 это глупость - без присвоения и объявить не даст
  New(p); // А теперь собственно выделяем память
  System.GC.Collect;
  var o2 := new t0; // У меня без этого выводит 3 а не 0. У вас может и упасть с ошибкой прав доступа
  p^.o.i.Println;
  //System.GC.KeepAlive(o2); // На всяк, если у вас оптимизатор JIT-а прешит удалить o2
end.

Потому что контролировать управляемые ссылки, которые оказались в неуправляемой (средой выполнения, включая сборщик мусора) области памяти - занятие в целом бесполезное.

Их типизация ничего не значит после этапа компиляции. В отличии от ссылок, имеющих строгую типизацию и во время выполнения (что позволяет эффективно использовать is и as), для слежения за ссылками, оказавшимися под другими ссылками.


В .Net есть средства для борьбы с такими проблемами.

GC.KeepAlive это одно из них, но полезное только для локальных переменных. По сути это вызов процедуры, которая ничего не делает и удаляется при оптимизации, но переданная в неё переменная не может быть так же удалена.

Есть ещё System.Runtime.InteropServices.GCHandle, но оно связывает руки сборщику мусора. И добавляет ещё больше бойлерплейта, поверх явных Dispose-ов, необходимых с указателями.

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

То есть, как я уже сказал раньше, всё с указателями должно использоваться только для связи с неуправляемым кодом.

Нет, достаточно просто посмотреть на все перегрузки функций типа Reset, Rewrite и т.п.

Вы как то странно на это смотрите. Системные библиотеки .Net-а подключаются и загружаются всегда. И большая часть их информации хранится единожды для всех запущенных программ. Так что никакого урона ни производительности, ни тем более размеру .exe от них нет.

Другое дело, PABCSystem, да и сахар языка, дают более сладкий доступ к тому что есть в .Net . Но это не всегда правда. К примеру вы не сможете использовать тип text чтоб прочитать файл, зашитый внутрь .exe-шника. Если нужен общий метод, работающий на все ситуации - надо брать стандартные типы и методы .Net-а.

Потому что их так и задумывали - чтоб во всех .Net языках был, к примеру, один тип string, не требующий дополнительного перевода при пересылке между программами и .dll-ками. И типов вроде System.IO.Stream и FileInfo это так же касается.

Кроме того, у этих типов значительно проработаны детали. К примеру метод вроде FileInfo.Refresh нужен очень редко, так что даже если бы в PABCSystem была обёртка FileInfo (отдельно от типов вроде text и file, не дающих прямого доступа к его возможностям) - его небыло бы смысла добавлять. Но когда он нужен - единственной альтернативой будут external подпрограммы.

1 лайк

Такой вопрос. А можно ли как то сделать для своих функций такие же подсказки по параметрам, как, например, тут? image

Или это всё где то в недрах IDE прописано?

/// <summary>
/// Просто описание
/// </summary>
/// <param name="параметр">Описание параметра</param>
procedure p1(параметр: byte) := exit;

begin
  
end.

Тут можно использовать документацию по C# - там всё так же:

1 лайк

@Sun_Serega как я понимаю, функционал всё таки порезан. например <code></code> и другие работать уже отказались

Проблемы IDE

Посмотрите модуль PABCSystem - там показаны варианты комментариев для подсказок

Базовая форма - поставить /// перед объявлением

А ещё такой вопрос. Когда компилируешь из файловой системы, а не через IDE, компилятор игнорирует настройку на отключение генерации отладочной информации.

Как я понимаю, компилятор при таком методе запускается с настройками по умолчанию. Попытался его поковырять, но не разобрался, можно ли переопределить дефолтные настройки. Есть ли такая возможность? image

ПКМ >> Компилировать это простейший вызов консольного компилятора.
Запускайте его чистую версию (pabcnetcclear.exe) из консоли напрямую, чтоб использовать все опции.
Или копайтесь в реестре, в папке HKEY_CLASSES_ROOT\PascalABCNET.PascalABCNETParser\shell, чтоб изменить/добавить кнопки в меню ПКМ.

проще ide запустить тогда уж.

за метод с реестром спасибо. надо попробовать

Ну, правильно. IDE для пользования компилятором, консоль для автоматизации. У всех программ так.

Да и кстати, для помощи новичкам есть специальная тема:

http://forum.mmcs.sfedu.ru/t/pomoshh-novichkam/263/2817

В общем было достаточно в HKEY_CLASSES_ROOT\PascalABCNET.PascalABCNETParser\shell\compile\command подменить "path\pabcnetc.exe" "%1" на "path\pabcnetcclear.exe" "%1"

ещё раз спасибо

не то что бы я затруднялся в чём то. меня интересовала сама возможность. если бы с какой то существующей возможностью возникли проблемы, то да, уже лучше в эту тему/аналогичную

Я полагаю, ещё и только на самой последней версии десятки?

Естественно. Она же автоматом обновляется, если лицензионная.

вроде бы исправимо даже на лицухе

Конечно, а смысл? Пусть себе обновляется. Не понравится - откачу.

лично я не люблю, когда скачивают что-то в тихаря без моего ведома. да и интернет не у всех безлимитный

В данном-то случае я о себе речь веду. Меня вполне устраивает автообновление от известного производителя (а базы для антивирусника Вы тоже вручную всегда обновляете?), а интернет у меня действительно безлимитный и достаточно быстрый (500 Мбит/с).