Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Фции с переменным количеством аргументов в Delphi?


Автор: jonie 25.10.2006, 21:31
Сам я не сильно в делфи чета кодирую... всеж предпочитаю С(++\#)... и стало инетересно как же реализована в делфи (равно как и в паскале) таже ф-ция writeln ?
В паскале я как понимаю это макрос(?), ибо переменное кол-во аргументов  в языке не заложено.
Если это ф-ция то как написать свою такую же? (чтобы синтаксически они отличны НЕ были (тот же Format(...) - имеет отличия!)).
Если макрос, то как он реализован и где его пардон "искать" ?
Если в паскале сий способ не был заложен, то изменилось ли это в Delphi ?
--------------
в общем ваши соображения)

ЗЫ в поиске похожего не нашел( может руки кривыЕ?

Автор: Snowy 25.10.2006, 21:52
Вариантов несколько.
1. Использовать перегруженные функции (справка по overload)
2. Использовать функции с параметром по умолчанию (Типа function MyFunc(a: integer; b: string = 'строка'): boolean;)
3. Использовать функуии с параметрами open array (опять же справка)

Автор: jonie 25.10.2006, 22:02
Цитата

Вариантов несколько.
1. Использовать перегруженные функции (справка по overload)
2. Использовать функции с параметром по умолчанию (Типа function MyFunc(a: integer; b: string = 'строка'): boolean;)
3. Использовать функуии с параметрами open array (опять же справка)

1 - не примелемо (сколько перегрузок для writeln тогоже надо сделать (я так подозреаю почти бесконечное множество)?))
2 - аналогично.
3 - хм... если сделать `array of pointer` ...... возникнет проблема при передачи констант?(
Constants cannot be used as open array arguments

Автор: Romikgy 25.10.2006, 22:11
Воть пример
Код

function StrFmt(Buffer, Format: PChar;
  const Args: array of const): PChar; overload;
function StrFmt(Buffer, Format: PChar; const Args: array of const;
  const FormatSettings: TFormatSettings): PChar; overload;

function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar;
begin
  if (Buffer <> nil) and (Format <> nil) then
  begin
    Buffer[FormatBuf(Buffer^, MaxInt, Format^, StrLen(Format), Args)] := #0;
    Result := Buffer;
  end
  else
    Result := nil;
end;

function StrFmt(Buffer, Format: PChar; const Args: array of const;
  const FormatSettings: TFormatSettings): PChar;
begin
  if (Buffer <> nil) and (Format <> nil) then
  begin
    Buffer[FormatBuf(Buffer^, MaxInt, Format^, StrLen(Format), Args,
      FormatSettings)] := #0;
    Result := Buffer;
  end
  else
    Result := nil;
end;


Код

StrFmt(Buff, 'CS = %04X  DS = %04X  ES = %04X  FS = %04X  GS = %04X  SS = %04X',
          [context^.cs, context^.ds, context^.es, context^.fs, context^.gs, context^.ss]);

Автор: jonie 25.10.2006, 22:16
Цитата

Воть пример.......


Цитата

Если это ф-ция то как написать свою такую же? (чтобы синтаксически они отличны НЕ были (тот же Format(...) - имеет отличия!)).

равно как и тут) writeln - то без `[]` !

/*
 подобное я видел ранее) 
 почему это мои ф-ции должны синтаксически отличаться?) я хочу писать также легко, да и без строки форматирования))
*/

Автор: bems 25.10.2006, 23:35
Встроено в компилятор. Идеологически это функция, на практике - часть языка

Автор: Romikgy 26.10.2006, 16:49
Цитата(bems @  25.10.2006,  22:35 Найти цитируемый пост)
Встроено в компилятор. Идеологически это функция, на практике - часть языка 

первое
Код

             { Predefined constants, types, procedures, }
             { and functions (such as True, Integer, or }
             { Writeln) do not have actual declarations.}
             { Instead they are built into the compiler }
             { and are treated as if they were declared }
             { at the beginning of the System unit.     }

второе 
все юзает ф-ции 
Код

function _WriteRec(var f: TFileRec; buffer: Pointer): Pointer;
function _WriteChar(var t: TTextRec; c: Char; width: Integer): Pointer;
function _Write0Char(var t: TTextRec; c: Char): Pointer;
function _WriteBool(var t: TTextRec; val: Boolean; width: Longint): Pointer;
function _Write0Bool(var t: TTextRec; val: Boolean): Pointer;
function _WriteLong(var t: TTextRec; val, width: Longint): Pointer;
function _Write0Long(var t: TTextRec; val: Longint): Pointer;
function _WriteString(var t: TTextRec; const s: ShortString; width: Longint): Pointer;
function _Write0String(var t: TTextRec; const s: ShortString): Pointer;
function _WriteCString(var t: TTextRec; s: PChar; width: Longint): Pointer;
function _Write0CString(var t: TTextRec; s: PChar): Pointer;
function _Write0LString(var t: TTextRec; const s: AnsiString): Pointer;
function _WriteLString(var t: TTextRec; const s: AnsiString; width: Longint): Pointer;
function _Write0WString(var t: TTextRec; const s: WideString): Pointer;
function _WriteWString(var t: TTextRec; const s: WideString; width: Longint): Pointer;
function _WriteWCString(var t: TTextRec; s: PWideChar; width: Longint): Pointer;
function _Write0WCString(var t: TTextRec; s: PWideChar): Pointer;
function _WriteWChar(var t: TTextRec; c: WideChar; width: Integer): Pointer;
function _Write0WChar(var t: TTextRec; c: WideChar): Pointer;
function _WriteVariant(var T: TTextRec; const V: TVarData; Width: Integer): Pointer;
function _Write0Variant(var T: TTextRec; const V: TVarData): Pointer;
procedure _Write2Ext;
procedure _Write1Ext;
procedure _Write0Ext;
function _WriteLn(var t: TTextRec): Pointer;

каждый элемент в скобках выполняется как отдельная ф-ция

Автор: Sunvas 26.10.2006, 17:08
Цитата(Romikgy @  26.10.2006,  16:49 Найти цитируемый пост)
(such as True, Integer, or }    
             { Writeln)

и функцию inc я тоже не могу найти.

Автор: Romikgy 26.10.2006, 18:33
Цитата(Sunvas @  26.10.2006,  16:08 Найти цитируемый пост)
функцию inc

имхо также вшито в компилятор

Автор: digs 26.10.2006, 18:36
Проблем то добавить две скобки?
А массив можно вариантный задать, а внутри уже разбирать по типам

Автор: bems 26.10.2006, 18:53
Цитата(Romikgy @  26.10.2006,  18:33 Найти цитируемый пост)
Цитата(Sunvas @  26.10.2006,  16:08 )
функцию inc


имхо также вшито в компилятор 


да, и он заменяет это на соотв. инструкцию процессора. Это эффективнее чем вызывать функцию.
кто-нибудь может мне сказать почему в Паскале до сих пор нет макросов?

Автор: Romikgy 26.10.2006, 18:58
Цитата(bems @  26.10.2006,  17:53 Найти цитируемый пост)
кто-нибудь может мне сказать почему в Паскале до сих пор нет макросов?

имхо вопрос к борланду , а не к форумчанам

Автор: Snowy 26.10.2006, 19:10
Потому что макросы это зло smile
Код должен быть прямо читаемым, а не подразумеваемым.

Автор: jonie 26.10.2006, 19:29
Цитата(digs @ 26.10.2006,  18:36)
Проблем то добавить две скобки?
А массив можно вариантный задать, а внутри уже разбирать по типам

А зачем? Дело не в скобках. Сравнивая с С\С++ тем же...там все что есть возможно написать своими силами с идентичным синтаксисом. Делфи же написан тоже не делфи). Лично мне не нравятся "черные ящики".
Цитата

да, и он заменяет это на соотв. инструкцию процессора. Это эффективнее чем вызывать функцию.
суть макрос имхо)

Автор: bems 27.10.2006, 00:06
Цитата(Snowy @  26.10.2006,  19:10 Найти цитируемый пост)
Потому что макросы это зло 
Код должен быть прямо читаемым, а не подразумеваемым.

С точки зрения кода макрос - это функция. Только вопрос в эффективности. Помоему местами есть смысл заюзать препроцессор.

Цитата(jonie @  26.10.2006,  19:29 Найти цитируемый пост)
суть макрос имхо) 
 да, но реализация - [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме]. Если бы были макросы как часть языка, то 
1) без "тонкостей" компилятора
2) красивый и прозрачный модуль "system"

Автор: bems 27.10.2006, 00:22
Цитата(Romikgy @  26.10.2006,  18:58 Найти цитируемый пост)
имхо вопрос к борланду , а не к форумчанам 
Форумчане (некоторые) рулят. Snowy например. И другие.


Snowy, Где зло?
(ну или хоть ссылку на авторитеты)

goto не предлагать )))

Автор: Romikgy 27.10.2006, 08:58
Цитата(bems @  26.10.2006,  23:22 Найти цитируемый пост)
Форумчане (некоторые) рулят. Snowy например. И другие.

ты хошь сказать что Снежок принимал участие в разработке паскаля/дельфи?

Автор: bems 27.10.2006, 11:27
Я хочу сказать что какой-никакой ответ у него нашелся  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)