Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фции с переменным количеством аргументов в Delphi? как реалтзуются? 
:(
    Опции темы
jonie
Дата 25.10.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Snowy
Дата 25.10.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вариантов несколько.
1. Использовать перегруженные функции (справка по overload)
2. Использовать функции с параметром по умолчанию (Типа function MyFunc(a: integer; b: string = 'строка'): boolean;)
3. Использовать функуии с параметрами open array (опять же справка)
PM MAIL   Вверх
jonie
Дата 25.10.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



Цитата

Вариантов несколько.
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



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Romikgy
Дата 25.10.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Воть пример
Код

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]);



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jonie
Дата 25.10.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



Цитата

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


Цитата

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

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

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

Это сообщение отредактировал(а) jonie - 25.10.2006, 22:20


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bems
Дата 25.10.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Romikgy
Дата 26.10.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(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;

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sunvas
Дата 26.10.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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

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


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Romikgy
Дата 26.10.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
digs
Дата 26.10.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 14.10.2006

Репутация: нет
Всего: 1



Проблем то добавить две скобки?
А массив можно вариантный задать, а внутри уже разбирать по типам
PM MAIL   Вверх
bems
Дата 26.10.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


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


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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Romikgy
Дата 26.10.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 26.10.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Потому что макросы это зло smile
Код должен быть прямо читаемым, а не подразумеваемым.
PM MAIL   Вверх
jonie
Дата 26.10.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



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

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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bems
Дата 27.10.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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

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

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.