Химия и PascalABC.Net

RAlex, не будет ли Вам сложно дать несколько комментариев по поводу приведённого кода? К сожалению, некоторые моменты мне не ясны. И так, мы в начале даём описание функции, которую обозначаем словом Mass:

function Mass(s: string): real; Данная функция оперирует переменно S, поиск которой будет проведён в строке с вещественным типом данных.

Далее мы запускаем блок программы, где производим генерацию случайных чисел в периоде от 110,0 до 250,0.

begin Result := Random(110.0, 250.0) end;

Данный блок относится к функции Mass. Прошу вас пояснить, зачем он нужен?

Далее начинается новый, основной блок программы. Мы объявляем переменную “a” которая будет наполнена данными от прочтения (ReadAllText) и дальнейших действий, которые приводятся в программе после точки. Вот этой командой, как я понял, мы отбрасываем первые значения в файле

.ToWords[1::2]

Но далее появляются переменные V и i. когда мы их описывали?

.Select((v, i) -> (i + 1, Mass(v)))

Буду рад прочитать комментарии.

Чисто в демонстрационных целях. По факту, он должен анализировать строку - параметр и и возвращать молекулярную массу. Сейчас же он возвращает псевдослучайное вещественное число.

ReadAllText('file_SMILES_02.txt')  // читаем весь файл в строковую переменную
      .ToWords[1::2] // разбиваем считанное на слова по пробелу, получая массив слов.
                      // Из которого посредством среза выбираем каждое второе слово,
                      // т.е. строку SMILES
      .Select((v, i) -> (i + 1, Mass(v))) // на основе каждой SMILES (v) делаем
                                          // кортеж с массой и номером.
      .OrderBy(t -> t[1])       // сортируем кортеж по массе
      .Select(t -> $'{t[0]} {t[1]}')  // формируем строку вида "номер масса"
      .ToArray;     // и помещаем эти строки в массив, называя его а.

Что касается вопросов про “почему не описаны v и i” и им подобных - пожалуйста, читайте про лямбда-выражения. У меня ведь не случайно получалась книга объемом почти в 600 страниц - именно, чтобы особенности языка не приходилось рассказывать на форуме или в личной переписке.

Как получается, что один оператор PascalАВС.NЕТ делает такой гигантский объем работы? Ну, это ответ разработчиков любителям языка Python.

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

2 лайка

Для начала посмотрите на битность и версию .dll . Все декомпиляторы это показывают.

Версия должна быть, конечно, .Net Framework. А исходя из битности - попробуйте подставлять $platformtarget (или как его там).

Скачивал версию 64-бит. Насчет $platformtarget - я даже не знаю, что это. Ну вот не было нужды работать с чужими dll. Думаю, наличие компонента “C:\Program Files\OpenBabel-3.1.1\vc_redist.x64.exe” и имя папки в какой-то степени показывают, что установлена именно 64-битная версия.

А по моему это значит что это установщик для 64-битной системы. Не обязательно устанавливающий 64-битную .dll .

@Admin всюду (но, почему то, кроме справки) чуть что про него пишет. Это директива изменяющая целевую битность .exe:

{$platformtarget x86}
{$platformtarget x64}
1 лайк

Попробую заново код написать и прислать скрин, что ли…

Вот, чего-то ей не хватает… Забавно, что она dll копирует в папку, где лежит исходный текст.

Лучше .dll пришлите.

Да и программу и вывод лучше текстом прикладывать, если уже слать.

Да, это специальная фича. Если не копировалось бы - .exe не запустился бы. .exe в .Net не умеют брать .dll из папок вроде Program Files.
Правда, пока эта фича не до конца работает.

Надо

{$platformtarget x86}
1 лайк
{$reference OBDotNet.dll}
{$platformtarget x86}

uses OpenBabel;

begin
  var oB := new ObConversion;
  
end.

Program1.pas(8) : Ошибка времени выполнения: Инициализатор типа “OpenBabel.openbabel_csharpPINVOKE” выдал исключение.

OBDotNet.zip (128,5 КБ)

Лучше сразу в tryo+Shift+Space оборачивать:

{$reference OBDotNet.dll}
{$platformtarget x86}

uses OpenBabel;

begin
  try
    var oB := new ObConversion;
  except
    on e: Exception do
      Writeln(e);
  end;
end.

Тогда ошибка более ошибка:

System.TypeInitializationException: Инициализатор типа "OpenBabel.openbabel_csharpPINVOKE" выдал исключение. ---> System.TypeInitializationException: Инициализатор типа "SWIGExceptionHelper" выдал исключение. ---> System.DllNotFoundException: Не удается загрузить DLL "openbabel_csharp": The specified module could not be found. (Исключение из HRESULT: 0x8007007E)
   в OpenBabel.openbabel_csharpPINVOKE.SWIGExceptionHelper.SWIGRegisterExceptionCallbacks_openbabel_csharp(ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate)
   в OpenBabel.openbabel_csharpPINVOKE.SWIGExceptionHelper..cctor()
   --- Конец трассировки внутреннего стека исключений ---
   в OpenBabel.openbabel_csharpPINVOKE.SWIGExceptionHelper..ctor()
   в OpenBabel.openbabel_csharpPINVOKE..cctor()
   --- Конец трассировки внутреннего стека исключений ---
   в OpenBabel.openbabel_csharpPINVOKE.new_OBConversion__SWIG_2()
   в OpenBabel.OBConversion..ctor()
   в 0.Program.$Main() в C:\Users\SunMachine\Desktop\OBDotNet\0.pas:строка 8

То есть какой то openbabel_csharp ещё ему нужен.

Такой есть, это библиотека констант C#. Сейчас попробую прицепить

openbabel_csharp.zip (149,3 КБ)

{$reference OBDotNet.dll}
{$reference openbabel_csharp.dll}
{$platformtarget x86}

uses OpenBabel;

begin
  try
    var oB := new ObConversion;
  except
    on e: Exception do
      Writeln(e);  
  end;
end.

Program1.pas(2) : Ошибка при чтении сборки ‘C:\PABCWork.NET\openbabel_csharp.dll’

Потому что она повреждена.

Или просто не_.Net .dll . CLI заголовок не видит:

image

“Отлично”. Но вообще-то она автоматом инсталлируется.

А, ну да, она таки неуправляемая, её через [DllImport] подключает в SWIGExceptionHelper, инициализация которого падает.

Ну, в любом случае, это уже явно к разработчику OpenBabel. Иначе остаётся только гадать.

Разработчики не наши, вряд ли они ответят, они и про РАВС ничего не знают, а примеры у них даны под C#, VB.NET и какую-то версию Пайтона.Ну значит не повезло химику нашему… Она с 2016 года не обновлялясь.

При чём тут язык, если внутренняя .dll не загружается.

А вот то что обновлений давно небыло - с этого надо было начинать.
Нечего вообще мёртвый код к новым проектам подключать.
А по не мёртвому можно было бы ожидать поддержки для любого .Net языка, если на C# работает.

Примеры там даны на C# я давал ссылку выше

Ну да что тут поделаешь. Спасибо за помощь.

The OBDotNet.dll assembly provided on Windows was compiled using the .NET framework v3.5 for the x86 platform.

Так это дохлая библиотека.

Тут более новая версия:

В этой программе можно работать, но библиотеки не грузятся в паскаль.

Можно тут поискать: https://sourceforge.net/directory/science-engineering/chemistry/os:windows/?q=SMILES

1 лайк

Только что осознал, что Карл и Маркс - один и тот же человек! Александр Викторович, вашу книгу прочитал с большим интересом. Для меня проблема в том, что читать про танцы и танцевать - это не одно и то же! Когда я читал про лямбда-выражения, я даже не представлял, что встречу их так скоро. Такое отношение вытеснило их из памяти и вот сейчас, конечно, я их опознал по синтаксису.

Отсюда, в секции “Самое важное”:

Лямбда-выражения – современный примитив программирования, используемый во многих программах

Современный примитив значит что это что то на уровне += по простоте и применяемости.