Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2017, 16:47
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
По умолчанию Помогите оптимизировать код

Здравствуйте! Пытаюсь написать программу динамического импорта функций DLL для вызова из кода Lua. Столкнулся с проблемой при большом количестве импортируемых функций необходимо объявлять большое количество типов:
Код:
type
  TFunc0 = function(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16: Double): Double; cdecl; // cdecl_r_16
  TFunc1 = function(v1,v2,v3,v4: PChar): Double; cdecl; // cdecl_r_ssss
  TFunc2 = function(v1: Double; v2,v3,v4: PChar): Double; cdecl; // cdecl_r_rsss
  TFunc3 = function(v1: PChar; v2: Double; v3,v4: PChar): Double; cdecl; // cdecl_r_srss
  TFunc4 = function(v1,v2: PChar; v3: Double; v4: PChar): Double; cdecl; // cdecl_r_ssrs
  TFunc5 = function(v1,v2,v3: PChar; v4: Double): Double; cdecl; // cdecl_r_sssr
  TFunc6 = function(v1: PChar; v2,v3,v4: Double): Double; cdecl; // cdecl_r_srrr
  TFunc7 = function(v1: Double; v2: PChar; v3,v4: Double): Double; cdecl; // cdecl_r_rsrr
  TFunc8 = function(v1,v2: Double; v3: PChar; v4: Double): Double; cdecl; // cdecl_r_rrsr
  TFunc9 = function(v1,v2,v3: Double; v4: PChar): Double; cdecl; // cdecl_r_rrrs
  TFunc10 = function(v1,v2: Double; v3,v4: PChar): Double; cdecl; // cdecl_r_rrss
  TFunc11 = function(v1,v2: PChar; v3,v4: Double): Double; cdecl; // cdecl_r_ssrr
  TFunc12 = function(v1: Double; v2: PChar; v3: Double; v4: PChar): Double; cdecl; // cdecl_r_rsrs
  TFunc13 = function(v1: PChar; v2: Double; v3: PChar; v4: Double): Double; cdecl; // cdecl_r_srsr
  TFunc14 = function(v1: PChar; v2,v3: Double; v4: PChar): Double; cdecl; // cdecl_r_srrs
  TFunc15 = function(v1: Double; v2,v3: PChar; v4: Double): Double; cdecl; // cdecl_r_rssr

Это только небольшая их часть. У меня вопрос как можно объединить эти типы в один. Поскольку при вызове придется сначала проверять к какому типу относится функция:
Код:
case FuncTp[Args[0].ForceInteger] of
        cdecl_r_16: begin @Func0:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func0(Args[1].ForceDouble,Args[2].ForceDouble,Args[3].ForceDouble,Args[4].ForceDouble,Args[5].ForceDouble,Args[6].ForceDouble,Args[7].ForceDouble,Args[8].ForceDouble,Args[9].ForceDouble,Args[10].ForceDouble,Args[11].ForceDouble,Args[12].ForceDouble,Args[13].ForceDouble,Args[14].ForceDouble,Args[15].ForceDouble,Args[16].ForceDouble); end;
        cdecl_r_ssss: begin @Func1:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func1(PChar(Args[1].ForceString),PChar(Args[2].ForceString),PChar(Args[3].ForceString),PChar(Args[4].ForceString)); end;
        cdecl_r_rsss: begin @Func2:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func2(Args[1].ForceDouble,PChar(Args[2].ForceString),PChar(Args[3].ForceString),PChar(Args[4].ForceString)); end;
        cdecl_r_srss: begin @Func3:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func3(PChar(Args[1].ForceString),Args[2].ForceDouble,PChar(Args[3].ForceString),PChar(Args[4].ForceString)); end;
        cdecl_r_ssrs: begin @Func4:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func4(PChar(Args[1].ForceString),PChar(Args[2].ForceString),Args[3].ForceDouble,PChar(Args[4].ForceString)); end;
        cdecl_r_sssr: begin @Func5:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func5(PChar(Args[1].ForceString),PChar(Args[2].ForceString),PChar(Args[3].ForceString),Args[4].ForceDouble); end;
        cdecl_r_srrr: begin @Func6:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func6(PChar(Args[1].ForceString),Args[2].ForceDouble,Args[3].ForceDouble,Args[4].ForceDouble); end;
        cdecl_r_rsrr: begin @Func7:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func7(Args[1].ForceDouble,PChar(Args[2].ForceString),Args[3].ForceDouble,Args[4].ForceDouble); end;
        cdecl_r_rrsr: begin @Func8:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func8(Args[1].ForceDouble,Args[2].ForceDouble,PChar(Args[3].ForceString),Args[4].ForceDouble); end;
        cdecl_r_rrrs: begin @Func9:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func9(Args[1].ForceDouble,Args[2].ForceDouble,Args[3].ForceDouble,PChar(Args[4].ForceString)); end;
        cdecl_r_rrss: begin @Func10:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func10(Args[1].ForceDouble,Args[2].ForceDouble,PChar(Args[3].ForceString),PChar(Args[4].ForceString)); end;
        cdecl_r_ssrr: begin @Func11:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func11(PChar(Args[1].ForceString),PChar(Args[2].ForceString),Args[3].ForceDouble,Args[4].ForceDouble); end;
        cdecl_r_rsrs: begin @Func12:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func12(Args[1].ForceDouble,PChar(Args[2].ForceString),Args[3].ForceDouble,PChar(Args[4].ForceString)); end;
        cdecl_r_srsr: begin @Func13:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func13(PChar(Args[1].ForceString),Args[2].ForceDouble,PChar(Args[3].ForceString),Args[4].ForceDouble); end;
        cdecl_r_srrs: begin @Func14:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func14(PChar(Args[1].ForceString),Args[2].ForceDouble,Args[3].ForceDouble,PChar(Args[4].ForceString)); end;
        cdecl_r_rssr: begin @Func15:=FuncId[Args[0].ForceInteger]; Result.AsDouble:=Func15(Args[1].ForceDouble,PChar(Args[2].ForceString),PChar(Args[3].ForceString),Args[4].ForceDouble); end;
end;
Ответить с цитированием
  #2  
Старый 23.03.2017, 15:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А вся эта байда фунциклит? :-) Если работает, то тогда наверное лучше по анекдоту - ничего не трогай, сынок!
Ответить с цитированием
  #3  
Старый 23.03.2017, 16:17
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
По умолчанию

В том и вопрос, вся это "байда" работает. Но проблема в том что я сам её написал. Учитывая мой опыт программирования, вполне возможно это не самый лучший вариант. По моим планам для языка LUA я создаю две функции одну для инициализации функции из DLL, другую для её выполнения. Но перед выполнением функции приходится делать проверки на предмет что должна возвращать функция и сколько у неё переменных. А это замедляет выполнение кода. Т.е. примерно перед выполнением функции из импортируемой DLL придется сделать 80 проверок типа if или Case.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter