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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 07:58   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
Сообщение Как создать функцию с переменным кол-во параметров?

Как же создать функцию с переменным кол-во параметров?
дапустим эту функцию можно писать так:
MyFunc(1);
и так
MyFunc(1,2);
Подскажите пожалуйста?
VintProg вне форума Ответить с цитированием
Старый 10.08.2009, 08:10   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

На днях была эта тема. Необязательный параметр указывается в конце и ему присваивается начальное значение
Код:
 function MyFunc(i:integer;j:integer=1):integer;
SERG1980 вне форума Ответить с цитированием
Старый 10.08.2009, 08:11   #3
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

SERG1980
Благодарю тебя.
VintProg вне форума Ответить с цитированием
Старый 10.08.2009, 08:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
function MyFunc(i:integer;j:integer=1):integ er;
Это не совсем правильно. Вообще в делфи так нельзя, но можно в качестве параметра указать массив типа Variant.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2009, 08:18   #5
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Stilet
Массив динамический?
Цитата:
Вообще в делфи так нельзя
А C++ можно.
VintProg вне форума Ответить с цитированием
Старый 10.08.2009, 08:23   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Это не совсем правильно. Вообще в делфи так нельзя, но можно в качестве параметра указать массив типа Variant.
как нельзя ? значения по умолчанию в объявлении метода нормальная практика и существует уже очень давно )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.08.2009, 08:40   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Квэнди
Ну значение по умолчанию это не совсем то )
А вдруг мне нужно передать 5 параметров, а описано всего четыре? Пусть они и будут по умолчанию, но их просто не хватит )

P.S. Я уже такие функции делал - Variant мороку снимает
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2009, 08:44   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Не, если проблема в обе стороны, то согласен ) А если проблема только передать меньше чем объявлено, то не проблема )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 10.08.2009, 09:03   #9
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Так на всякий случай
Цитата:
Опущенные параметры процедур и функций

В языке Delphi существует возможность задать параметрам процедур и функций стандартные значения. Они указываются через знак равенства после типа параметра. Например, опишем процедуру, которая заполняет некоторую область памяти заданным значением:
procedure Initialize(var X; MemSize: Integer; InitValue: Byte = 0);

Для параметра InitValue задано стандартное значение, поэтому его можно опустить при вызове процедуры Initialize:
Initialize(MyVar, 10); // Эквивалентно Initialize(MyVar, 10, 0);

Подпрограмма может содержать любое количество параметров со стандартными значениями, однако такие параметры должны быть последними в списке. Другими словами, после параметра со стандартным значением не может следовать обычный параметр, поэтому следующее описание будет воспринято компилятором как ошибочное:
procedure Initialize(var X; InitValue: Byte = 0; MemSize: Integer); // Ошибка!
SERG1980 вне форума Ответить с цитированием
Старый 11.08.2009, 01:52   #10
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Что-то все забыли про открытые массивы, которые позволяют передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел.

Код:
function AddEmUp( A: array of integer ): integer;
В открытом массиве можно передавать переменные, константы или выражения из констант. Ниже приведен пример, который демонстрирует вызов функции AddEmUp с передачей ей нескольких различных элементов.

Код:
const
  j = 23;
var
  i, Rez: integer;
begin
   i := 8;
   Rez := AddEmUp( [i, 20, j, 43] );
end;
Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf. Для иллюстрации их использования ниже приведен текст функции AddEmUp, которая возвращает сумму всех переданных ей элементов массива A.

Код:
function AddEmUp( A: array of integer ): integer;
var
  i: integer;
begin
   Result := 0;
   for i := Low(A) to High(A) do
      Inc( Result, A[i] );
end;
Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

Код:
procedure WhatHaveIGot( A: array of const );
Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

Код:
procedure WhatHaveIGot( ['Text', 10, 5.5, @WhatHaveIGot, 3.14, true, 'c'] );
При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

Код:
PVarRec = ^TVarRec;
TVarRec = record
  case Byte of
    vtInteger:    (VInteger: Integer; VType: Byte);
    vtBoolean:    (VBoolean: Boolean);
    vtChar:       (VChar: Char);
    vtExtended:   (VExtended: PExtended);
    vtString:     (VString: PShortString);
    vtPointer:    (VPointer: Pointer);
    vtPChar:      (VPChar: PChar);
    vtObject:     (VObject: TObject);
    vtClass:      (VClass: TClass);
    vtWideChar:   (VWideChar: WideChar);
    vtPWideChar:  (VPWideChar: PWideChar);
    vtAnsiString: (VAnsiString: Pointer);
    vtCurrency:   (VCurrency: PCurrency);
    vtVariant:    (VVariant: PVariant);
    vtInterface:  (VInterface: Pointer);
    vtWideString: (VWideString: Pointer);
    vtInt64:      (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно из ниже приведенных значений.

Код:
const
  vtInteger    = 0;
  vtBoolean    = 1;
  vtChar       = 2;
  vtExtended   = 3;
  vtString     = 4;
  vtPointer    = 5;
  vtPChar      = 6;
  vtObject     = 7;
  vtClass      = 8;
  vtWideChar   = 9;
  vtPWideChar  = 10;
  vtAnsiString = 11;
  vtCurrency   = 12;
  vtVariant    = 13;
  vtInterface  = 14;
  vtWideString = 15;
  vtInt64      = 16;
Поскольку массив констант способен передавать данные разных типов, это может вызвать определенные затруднения при создании обрабатывающей полученные параметры функции или процедуры. В качестве примера работы с таким массивом рассмотрим реализацию процедуры WhatHaveIGot, которая просматривает элементы полученного массива параметров и выводит их тип.

Код:
procedure WhatHaveIGot( A: array of const );
var
  i: integer;
  TypeStr: string;
begin
   for i := Low(A) to High(A) do
   begin
      case A[i].VType of
         vtInteger    : TypeStr := 'Integer';
         vtBoolean    : TypeStr := 'Boolean';
         vtChar       : TypeStr := 'Char';
         vtExtended   : TypeStr := 'Extended';
         vtString     : TypeStr := 'String';
         vtPointer    : TypeStr := 'Pointer';
         vtPChar      : TypeStr := 'PChar';
         vtObject     : TypeStr := 'Object';
         vtClass      : TypeStr := 'Class';
         vtWideChar   : TypeStr := 'WideChar';
         vtPWideChar  : TypeStr := 'PWideChar';
         vtAnsiString : TypeStr := 'AnsiString';
         vtCurrency   : TypeStr := 'Currency';
         vtVariant    : TypeStr := 'Variant';
         vtInterface  : TypeStr := 'Interface';
         vtWideString : TypeStr := 'WideString';
         vtInt64      : TypeStr := 'Int64';
      end;
      ShowMessage( Format( 'Array item %d is a %s', [i, TypeStr] ) );
   end;
end;
Sergey2 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в функцию через ссылку Vistar Общие вопросы C/C++ 1 07.05.2009 02:27
Процедуры с переменным числом параметров Pascal Сергей089 Помощь студентам 2 04.04.2009 19:47
Как создать через редактор Visual Basic функцию в Excel Dima007 Microsoft Office Excel 2 04.11.2008 20:04
Как создать процедуру и функцию? Absent Общие вопросы Delphi 1 18.11.2007 17:36