Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2015, 13:18   #1
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
Печаль

Как описать параметр функции, чтоб можно была вот так вызывать?
Код:
  AddFuction([
    ['TestFunc', @TestCallBack],
    ['Test2', @TestCallBack]
  ]);
Т.е содержит массив, а в нем массивы значений, первое значения строка, второй - указатель на функцию

Что то вроде
Код:
type
TTest = Array of Array of Pointer;
но он еще должен принимать тип string совместно =_=
Код:
type
TTest = Array of Array of String, Pointer; // Понятно что работать не будет

Последний раз редактировалось Аватар; 02.05.2015 в 16:09.
Должно быть имя? вне форума Ответить с цитированием
Старый 02.05.2015, 13:54   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
type
  tTest = record
     s:string;
     p:Pointer;
  end;

var
  ppp:array of array of tTest;
Сойдет?
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 02.05.2015, 14:28   #3
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Код:
type
  tTest = record
     s:string;
     p:Pointer;
  end;

var
  ppp:array of array of tTest;
Сойдет?
Можно была взять за вариант, НО. это понадобиться заполнять структуру. А я хочу от этого избавиться. Я уже написал такую функцию

Код:
function AddFuction2(Names: array of PAnsiChar; Pointers:array of Pointer; var ModuleEntry:zend_module_entry):TArray<zend_function_entry>;
var
  i, v  : integer;
begin
  if High(module_entry_table) = -1 then
    SetLength(module_entry_table, 1);

  for i := 0 to High(Names) do begin
    SetLength(module_entry_table, Length(module_entry_table) + 1);
    v := High(module_entry_table) - 1;
    module_entry_table[v].fname := Names[v];
    module_entry_table[v].arg_info := nil;
    module_entry_table[v].handler := Pointers[v];
  end;
  ModuleEntry.functions := @module_entry_table[0];
end;
И ей пользоваться так
Код:
  AddFuction2([
    'TestFunc', 'Test2'
  ], [
    @TestCallBack, @TestCallBack
  ], ModuleEntry);
но это не красиво
Должно быть имя? вне форума Ответить с цитированием
Старый 02.05.2015, 14:32   #4
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

То, что в 1 посте - так не получится! Массив должен быть одного типа
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 02.05.2015, 15:42   #5
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
То, что в 1 посте - так не получится! Массив должен быть одного типа
Эхх, жаль что на c++ можно а на паскале нет
Должно быть имя? вне форума Ответить с цитированием
Старый 02.05.2015, 18:11   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Эхх, жаль что на c++ можно а на паскале нет
можно и в паскале, если очень хочется. есть папраметры - открытые массивы (пример - функция Format()).
был бы смысл. он точно есть? мож не стоит так усложнять? какова цель?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.05.2015, 22:17   #7
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
можно и в паскале, если очень хочется. есть папраметры - открытые массивы (пример - функция Format()).
был бы смысл. он точно есть? мож не стоит так усложнять? какова цель?
Сделать похожую штуку НА эту

Код:
const Class_test NameTest[] = {
	TEST_ME(TestCon__, __construct)
	TEST_FE_END
};
Посмотрю как устроена Format.

ахх нет, там "const Args: array of const" про это я знал, и пробовал еще днем

Последний раз редактировалось Должно быть имя?; 02.05.2015 в 22:22.
Должно быть имя? вне форума Ответить с цитированием
Старый 02.05.2015, 23:00   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сделать похожую штуку НА эту
практическая цель-то какая?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.05.2015, 23:14   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Чего плохого в двух массивах? Одним можно извратиться ради хохмы в таком "стиле"

Код:
VarArrayOf([VarArrayOf(['TestFunc',Integer(@TestCallBack)]),VarArrayOf(['Test2',Integer(@TestCallBack)])])
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.05.2015, 20:34   #10
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

У меня появился вопрос, будет ли полезна присвоения nil переданным аргументам в функцию ?

Код:
    FunctionName[i] := nil;
    FunctionPoint[i] := nil;


Полный код
Код:

procedure SetPFuncEntryEND(Name:PAnsiChar; CallBackFunc:Pointer;
                                    var PFuncEntry:TArray<zend_function_entry>);
var
  i:Integer;
begin
  i := High(PFuncEntry);
  if i = -1 then
    SetLength(PFuncEntry, 1);

  PFuncEntry[i].fname := Name;
  PFuncEntry[i].handler := CallBackFunc;
  SetLength(PFuncEntry, i + 2);
end;

function AddFuction2(FunctionName   : array of PAnsiChar;
                     FunctionPoint  : array of Pointer;
                     var PFuncEntry : TArray<zend_function_entry>;
                     var SetEntry   : zend_module_entry):TArray<zend_function_entry>;
var
  i : integer;
begin
  if High(FunctionName) <> High(FunctionPoint) then
  begin
    ShowMessage('[names] is not equal with [Pointers]');
    exit;
  end;

  SetLength(PFuncEntry, 1);

  for i := 0 to High(FunctionName) do begin
    SetPFuncEntryEND(FunctionName[i], FunctionPoint[i], PFuncEntry);
    FunctionName[i] := nil;
    FunctionPoint[i] := nil;
  end;

  SetEntry.functions := @PFuncEntry[0];
end;
Или он их потом сам почистит ?
Должно быть имя? вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многомерный массив Olper Microsoft Office Excel 4 27.11.2013 17:54
Многомерный массив $Optimus$ Помощь студентам 1 06.09.2013 20:39
многомерный массив. C# Serg94 Помощь студентам 8 13.12.2011 01:53
С++/С# многомерный массив DeFace Общие вопросы C/C++ 4 03.05.2009 16:07
Многомерный массив Iogan Gamba Puti Общие вопросы C/C++ 2 08.05.2008 15:20