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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 17:33   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Массив процедур или идеи получше?

Код:
 Procedure AddBlue(Var T : TTexture; Value : Integer);
 Procedure AddGreen(Var T : TTexture; Value : Integer);
 Procedure AddRed(Var T : TTexture; Value : Integer);
 Procedure Brigthness(Var T : TTexture; Value : Integer);
 Procedure ConvertToBW(Var T : TTexture);
 Procedure DrawCircle(Var T : TTexture; CenterX, CenterY, Radius, Color : Integer);
 Procedure DrawLine(Var T : TTexture; X1, Y1, X2, Y2, Color : Integer);
 Procedure DrawPoint(Var T : TTexture; PointX, PointY, Color : Integer);
 Procedure DrawRectangle(Var T : TTexture; X1, Y1, X2, Y2, Color : Integer);
 Procedure DrawTornCircle(Var T : TTexture; CenterX, CenterY, Radius, Color : Integer);
 Procedure FillAll(Var T : TTexture; Color : Integer);
 Procedure GaussBlur(Var T : TTexture; Level : Integer);
 Procedure LinesHorisontal(Var T : TTexture; Color : Integer; Freq : Integer);
 Procedure LinesVertical(Var T : TTexture; Color : Integer; Freq : Integer);
 Procedure Noise(Var T : TTexture; Value : Integer);
Как не трудно заметить, в параметрах сначала идет TTexture, а затем интеджерные значения. Читаю из файла последовательность действий для рисования текстуры. В бинарном файле должна быть пометка, какую процедуру следует брать. Например

BlockRead(F, I, SizeOF(I));
Case I of
0 : Begin
BlockRead(F, J, SizeOf(Integer));
AddBlue(T, J);
End;
1 : ...

И что, так для каждой процедуры? Так дело не пойдет.
Какие имеются мысли:
[*] Намутить массив указателей. Нацелить их на процедуры. Намутить массив количества параметров для соответствующих процедур. А как вызывать - ХЗ.
[*] Намутить каждой функции лишние параметры, чтобы у каждой было одинаковое количество. Все их обзывать не по именам, а запхнуть в массив. Тогда возникают трудности, если я хочу какую-то отдельную функу вызвать не из файла, а рантайм. Так по имени видно, а индекс мало расскажет.

В общем слушаю мысли, даже самые кровожадные.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.07.2010, 17:41   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
[*] Намутить массив указателей. Нацелить их на процедуры. Намутить массив количества параметров для соответствующих процедур. А как вызывать - ХЗ.
вызывать через массив(по индексу) но если процедуры разные то проблемка
(нужен асм тогда)
Цитата:
*] Намутить каждой функции лишние параметры, чтобы у каждой было одинаковое количество. Все их обзывать не по именам, а запхнуть в массив. Тогда возникают трудности, если я хочу какую-то отдельную функу вызвать не из файла, а рантайм. Так по имени видно, а индекс мало расскажет.
учитывая что имя останется, то в чем проблема?(самый простой способ, правда в файле лишние байты придется занимать(чтоб от case избавится))
но проверку за выход массива не забудь на всяк.
это проще ибо можно без асма тогда.

PS:я сейчас интерпритатор пишу но у меня принцип совсем иной.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2010, 17:52   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
учитывая что имя останется
Не понял... В смылсе тот же массив указателей? Или как? Не уловил...

P.S. А нет функи, чтобы узнать количество или общий размер параметров целевой функи?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.07.2010, 18:03   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

массив функций
Код:
type
 TMyFunc=function(var T:Texture;...);
var
FuncAr:array of TMyFunc;
потом просто FuncAr[i](...)
естественно заполнить его не забудь
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2010, 18:08   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А як его заполнить? так:?
Код:
@FuncAr[0] := @AddBlue;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.07.2010, 18:13   #6
T_I_T_A_N
Пользователь
 
Регистрация: 01.06.2010
Сообщений: 23
По умолчанию

FuncAr[0] := AddBlue; так
T_I_T_A_N вне форума Ответить с цитированием
Старый 14.07.2010, 18:13   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просто FuncAr[0] := AddBlue;
достаточно
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.07.2010 в 18:16.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2010, 20:28   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если сделать процедуры методами класса, то можно вызывать их просто по имени. По моему небольшая плата за универсальность. При добавлении методов к классу не придется заботиться о привязке имени к адресу и о количестве параметров.

Код:
{$APPTYPE CONSOLE}

uses ObjAuto;

type
   {$METHODINFO ON}
   TMyClass = class
   public
      procedure test4(N:integer; S:integer);
      //...

   end;
   {$METHODINFO OFF}

procedure TMyClass.test4(N:integer; S:integer);
begin
   writeln(N, ' ', S)
end;

//----------------------------------------------------
var C:TMyClass;
    M, M1:PMethodInfoHeader;
    V:Variant;
    k : array of integer;
    A : array of Variant;
    InfoEnd : Pointer;
    Count, i : integer;
begin
   C := TMyClass.Create;
   try
      M := GetMethodInfo(C, 'test4');
      if M = nil then {}; // неверное имя функции

      // Определение количества параметров
      M1 := M;
      Inc(Integer(M1), SizeOf(TMethodInfoHeader) -
          SizeOf(ShortString) + 1 +
          Length(M^.Name));
      Inc(Integer(M1), SizeOf(TReturnInfo));
      InfoEnd := Pointer(Integer(M) + M^.Len);
      Count := 0;
      while Integer(M1) < Integer(InfoEnd) do begin
         Inc(Count);
         Inc(Integer(M1), SizeOf(TParamInfo) - SizeOf(ShortString) + 1 +
              Length(PParamInfo(M1)^.Name));
      end;

      // Заполнение параметров (чтение из файла)
      SetLength(k, Count-1);
      SetLength(A, Count-1);
      // Первый параметр - ссылка на объект подставляется автоматически
      // в массиве A - только параметры, указанные в объявлении
      // k - порядковые номера параметров
      for i := 1 to Count - 1 do begin
         k[i-1] := i;
         A[i-1] := i+123;
      end;

      // Вызов метода
      ObjectInvoke(C, M, k, A);

   finally
      SetLength(k, 0);
      SetLength(A, 0);
      C.Free;
   end;
   readln;
alexBlack вне форума Ответить с цитированием
Старый 14.07.2010, 20:35   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Дело в том, что модуль Classes не подключен - дюже много весит. Попробую сотворить колдовство из #4 и #7
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.07.2010, 20:40   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

alexBlack, а вот мне это пригодится, ибо у меня строгий ООП.
надо мне Variant изучить, похоже очень полезен мне будет)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.07.2010 в 20:47.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив процедур ZaRDaK Общие вопросы Delphi 14 11.07.2010 15:47
Массив процедур - как? boris-blade Microsoft Office Word 1 21.02.2010 23:13
Как решать японские кроссворды или судоку? Может у кого-нибудь есть идеи? TwiX Свободное общение 2 16.08.2009 07:56
Массив процедур garik Общие вопросы Delphi 0 18.03.2009 21:08
Компонент получше чем TMediaPlayer Viteef Компоненты Delphi 7 12.05.2007 22:14