Помощь новичкам


#186

Я Вас понял: проблемы со взаимопониманием возникли из-за того, что я сейчас “сижу” в основном в Фортране и невольно использую фортранную терминологию, которая достаточно вольно трактует некоторые понятия. Плюс к тому, она несколько различается у версий 77, 90 и 95.

Вы же знаете, что сейчас я стараюсь сделать “Библиотеку численных методов”, посему и говорю о ней “библиотека”, временами также используя её синоним “пакет”, как дань основным её источникам - Пакетам числовых методов… Поэтому я ни разу не имел в виду ни библиотек dll (да и к чему бы их тут упоминать?), ни мифических “пакетов”, отсутствующих в PascalABC.NET. В этом контексте ясно: она вся - ОДИН МОДУЛЬ unit, который должен подключаться по uses. И, конечно же, говоря о “программах в библиотеке”, я имею в виду программы в функциональном смысле - набор процедур, функций, классов и т.д., реализующих тот или иной численный метод. В этом смысле библиотека (пакет) состоит из программ, а не подпрограмм.

Тут был неправ, конечно. Хотел сказать именно о вложенных программных единицах - процедурах и функциях. Т.е. если “программе” нахождения корней нелинейного уравнения достаточно получить real->real, то для одномерной оптимизации нужно передавать y->array of real и т.д. Если бы такую функцию можно было локализовать в некоем блоке begin … end вместе с процедурами, реализующими некоторый численный метод, мы бы в рамках одного модуля получили достаточно независимые блоки кода с реализациями, что уберегло бы от коллизий и упростило межпрограммные связи. Видимо тут может быть только один выход - каждый численный метод превратить в класс, чтобы за счет инкапсуляции добиться необходимой его автономности.

Я уже приводил схему. Процедура А получает ссылку на функцию F при вызове из программы пользователя. Она может обратиться к этой функции - это верхний уровень вызова. Далее, процедура A вызывает процедуру В и также передает ей ссылку на функцию F. Процедура В может вызвать функцию F и это будет второй, более глубокий уровень по вложенности программных единиц относительно пользовательской программы.

Т.е. реализация реально может быть только в конструкторе класса… инициализировать некие свойства и вызывать нужный метод, который эти свойства уже будет только менять.

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


#187

Ну да, нормально.

type MyNumMethod = class
  constructor Create(...);
  procedure Execute();
  function Result(): real;
end;

begin
  var m := new MyNumMethod(куча параметров);
  m.Execute(можно еще пару параметров добавить);
  Print(m.Result);
end.

#188

Непонятно каким образом изменяется значение параметра n, хотя это параметр-значение в этой процедуре: procedure rever(n:integer); begin write (n mod 10); if (n div 10)<>0 then rever (n div 10) end; begin rever (3096); readln; end.


#189

А на каком основании Вы решили, что значение параметра n должно изменяться?


#190

Оно изменяется, это видно в окне локальных переменных в режиме “Шаг с входом в подпрограмму”. Сначала 3096, потом 309, потом 30 и в конце 3.


#191

При компиляции на строке: end. выдаёт такое сообщение: Встречен конец файла, а ожидалось '[' Вот программа: type arr=array{1…10,1…10] of integer; procedure print_arr(aa:arr); var i,j:integer; begin for i:=1 to 10 do begin for j:=1 to 10 do begin write (aa[i,j]:3); end; writeln; end; end; var aa1:arr; i,j:integer; begin for i:=1 to 10 do for j:=1 to 10 do aa1[i,j]:=random(100); print_arr(aa1);
end.


#192

Надо быть повнимательнее. Для чего Вы в строке type arr=array{1…10,1…10] of integer; поставили скобки разного типа - фигурную и квадратную?

Естественно, когда Вы входите в процедуру rever, ЛОКАЛЬНОЕ значение параметра в ней меняется, потому что Вы производите рекурсивый вызов с параметром n div 10. Но при завершении каждого вызова прежнее значение восстанавливается.


#193

Спасибо большое.


#194

где узнать что можно подключать в $reference? желательно с хоть каким то описанием, но и просто список лучше чем ничего


#195

dll. exe в принципе можно. С IL-кодом. Всё. Больше ничего


#196

я про то что к примеру в System.Windowns всего 3 пункта, но если что то с $reference подключить там появляется больше пунктов, вот те dll что влияют на анализатор кода хотелось бы услышать


#197

Я не понял, что Вы только что написали


#198

тут 3 пункта я не буду утверждать точно, но вроде с подключением какой то библиотеки этот список удлиняется, появляется большая часть всего что говорит msdn


#199

System.Windows.Forms - это пространство имён. Если в библиотеке dll будут другие пространства имен - например, System.Windows.A System.Windows.B то Вы их тоже увидите


#200

вот как… в таком случае где искать какие библиотеки есть на компьютере? есть ли папка вроде Windows\System32, стандартная для библиотек? и устанавливает ли паскаль ещё какие то библиотеки?

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


#201

Задавайте. Но я не подскажу. Поскольку вопросы - не ко мне.

Windows\System32 - стандартная для неуправляемых dll. Их PascalABC.NET не видит.

Чтобы видел, нужны управляемые dll. Обычно когда ищут какую-то возможность, смотрят сайт msdn.microsoft.com или еще какой-нибудь. Там указано, какую dll надо подключить и какие в ней пространства имен есть.

Их огромное количество. Только msdn хранит их описания.


#202

PABC никак нельзя научить юзать обычные DLL (не написанные под NET). Там же просто требуется найти функцию в DLL и вызвать ее по найденному адресу


#203

Да бросьте, как это нельзя? Весь .NET писался чтобы можно было. Вот, из модуля PT4 кусочек:

procedure StartPT(options: integer);    external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'startpt';
procedure FreePT;                                       external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'freept';
function CheckPT(var res: integer):string;external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'checkptf';
procedure RaisePT(s1,s2: string);       external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'raisept';
procedure Task(name: string);           external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'task';
procedure GetR(var param: real);                external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getr';

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


#204

метаданные? обёртки? всм конструкцию классов и записей надо от руки писать, а из dll только функции достаются?


#205

Как по шагам отлаживать программу с модулем CRT?