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. когда мы их описывали?
Чисто в демонстрационных целях. По факту, он должен анализировать строку - параметр и и возвращать молекулярную массу. Сейчас же он возвращает псевдослучайное вещественное число.
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, чтобы сразу возвращать молекулярную массу, но не пошло (надеюсь, пока не пошло, может подскажет коллективный разум).
Скачивал версию 64-бит. Насчет $platformtarget - я даже не знаю, что это. Ну вот не было нужды работать с чужими dll. Думаю, наличие компонента “C:\Program Files\OpenBabel-3.1.1\vc_redist.x64.exe” и имя папки в какой-то степени показывают, что установлена именно 64-битная версия.
Да и программу и вывод лучше текстом прикладывать, если уже слать.
Да, это специальная фича. Если не копировалось бы - .exe не запустился бы. .exe в .Net не умеют брать .dll из папок вроде Program Files.
Правда, пока эта фича не до конца работает.
{$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
{$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’
Разработчики не наши, вряд ли они ответят, они и про РАВС ничего не знают, а примеры у них даны под C#, VB.NET и какую-то версию Пайтона.Ну значит не повезло химику нашему… Она с 2016 года не обновлялясь.
При чём тут язык, если внутренняя .dll не загружается.
А вот то что обновлений давно небыло - с этого надо было начинать.
Нечего вообще мёртвый код к новым проектам подключать.
А по не мёртвому можно было бы ожидать поддержки для любого .Net языка, если на C# работает.
Только что осознал, что Карл и Маркс - один и тот же человек!
Александр Викторович, вашу книгу прочитал с большим интересом.
Для меня проблема в том, что читать про танцы и танцевать - это не одно и то же!
Когда я читал про лямбда-выражения, я даже не представлял, что встречу их так скоро. Такое отношение вытеснило их из памяти и вот сейчас, конечно, я их опознал по синтаксису.