Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

динамичные параметры функции   Найти похожие ветки 

 
TeNY ©   (2004-08-05 20:36) [0]

как можно создать функцию с динамичными параметрами
к примеру Find(find1,find2...findN)
ведь если их обьявить заранее то компилятор будет ругатся в случае если их не указать.Примером нужной функции является функция склеивания текстовых кусков String типа в один.


 
Гаврила ©   (2004-08-05 20:37) [1]

посмотри на функцию Format
там вторым параметром идет как раз array of const


 
TeNY ©   (2004-08-06 11:57) [2]

а где её взять?


 
Мастер ©   (2004-08-06 11:59) [3]

Либо массив параметров, либо использовать параметры по-умолчанию, напр:

function MasterFunc(p1: Integer=0;p2: Integer=0;p3: Integer=0;...pn: Integer=0);


 
TeNY ©   (2004-08-06 12:47) [4]

к примеру функция
concat(s[,s1,s2,s3]):string как оркганизовать её пытался найте её в System но там её неТ!


 
Мастер ©   (2004-08-06 13:01) [5]

Например, так:

function conc(s: String; Arr: array of String): String;
var
 i: Integer;
 Len: Integer;
begin
 Result := s;
 Len := Length(Arr);
 if Len=0 then Exit;
 for i := 0 to Len do Result := Result + Arr[i];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(Conc("Ðàç",["Äâà", "Òðè", "×åòûðå"]));
end;


 
begin...end ©   (2004-08-06 13:03) [6]


> [5] Мастер ©   (06.08.04 13:01)


> for i := 0 to Len

for i := 0 to Len - 1


 
Мастер ©   (2004-08-06 13:08) [7]

>begin...end ©   (06.08.04 13:03) [6]
Точно:-)


 
TiNY   (2004-08-06 13:20) [8]

а при одном параметре функции conc("sss") выдается сообщение
[Error] Unit1.pas(41): Not enough actual parameters


 
Ega23 ©   (2004-08-06 13:22) [9]

TiNY   (06.08.04 13:20) [8]

А кто array os string передавать будет? Дядя Вася?


 
Мастер ©   (2004-08-06 13:25) [10]

>TiNY   (06.08.04 13:20) [8]

Второй параметр все равно нужно опередать, даже если он пустой -
Conc(s,[]);


 
begin...end ©   (2004-08-06 13:28) [11]

Или тогда пусть у тебя будет только array of string, и всё.


 
Ega23 ©   (2004-08-06 13:29) [12]

Или по-умолчанию его [] задай.


 
Мастер ©   (2004-08-06 13:31) [13]

>Ega23 ©   (06.08.04 13:29) [12]
Для массива нельзя задать значение по-умолчанию.


 
Ega23 ©   (2004-08-06 13:33) [14]

Для массива нельзя задать значение по-умолчанию.

Точно, это я забыл...


 
TiNY   (2004-08-06 13:46) [15]

ну а как же concat("sss") c одним параметром работает


 
Рамиль ©   (2004-08-06 13:49) [16]


> [15] TiNY   (06.08.04 13:46)

{ 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.     }


 
TeNY ©   (2004-08-06 13:49) [17]

а едь тоже массив


 
Рамиль ©   (2004-08-06 13:50) [18]

Т. е. средствами языка такого не сделать.


 
TeNY ©   (2004-08-06 14:15) [19]

Но ведь сделали


 
Плохиш ©   (2004-08-06 14:26) [20]


> TeNY ©   (06.08.04 14:15) [19]
> Но ведь сделали

Функции Concat/read(ln)/write(ln)/... преобразуются компилятором в нужный набор команд, который можно посмотреть в окне CPU.


 
Рамиль ©   (2004-08-06 14:29) [21]


> Но ведь сделали

Перепишишь компилятор и ты сделаешь.


 
TeNY ©   (2004-08-06 15:11) [22]

А как написать функцию так чтобы к примеру входным параметром была строка типа "AAAA,BBBB,CCCC,DDDD,"  а выходным был этот самый array of string вида ["AAAA","BBBB","CCCC","DDDD",""]

А ЕСЛИ это возможно то как сделать так чтобы знак запятой в строке являлся разделителем элементов для массива без написания циклов... то есть функция распознавала запятую как разделитель


 
Плохиш ©   (2004-08-06 15:13) [23]


> TeNY ©   (06.08.04 15:11) [22]
> без написания циклов

Что религия не позволяет?


 
TeNY ©   (2004-08-06 15:25) [24]

Да нет написать не проблема там к примеру s1:=copy(...рос(",",s)...) просто к тому массиву автоматически добавляется другой массив


 
TeNY ©   (2004-08-07 06:32) [25]

а как сделать чтобы результат функциибыл этот Array of String


 
TeNY ©   (2004-08-07 06:32) [26]

а как сделать чтобы результат функциибыл этот Array of String


 
Тестировщица ©   (2004-08-07 07:33) [27]

a обязательно "чтобы результат функциибыл этот Array of String
"? Может, тебе этот вариант подойдет?
http://delphimaster.net/view/1-1091703204/


 
y-soft ©   (2004-08-07 08:59) [28]

Вообще способов передавать переменное количество параметров в Delphi довольно много:

Использование возможностей языка:

- Использовать значения по умолчанию
- Уже упомянутый array of const
- Использовать тип Variant

Способы, применяемые в WinAPI:

- Передавать одним параметром указатель на буфер, а другим - его размер (или количество элементов)
- Передавать в качестве одного из параметров функцию обратного вызова, с помощью которой и можно поочередно получить все данные
- Передавать указатель на известную структуру (которая может быть переменной длины)

"Ассемблерный путь":

- Предварительно помещать параметры в стек

Аналогично не составляет большого труда и возвращать переменное количество значений...


 
TeNY ©   (2004-08-09 12:35) [29]

Понятно,а вот почему все таки нельзя результат функции Array сделать хотя если создать record а в нем массив то все получается


 
Digitman ©   (2004-08-09 12:39) [30]


> TeNY ©   (09.08.04 12:35) [29]



> почему все таки нельзя результат функции Array сделать


глупости ...

можно !

type
 TMyArray = array of string;

..

function MyFunc(..): TMyArray;
begin
 SetLength(Result, 2);
 Result[0] := "First";
 Result[1] := "Second";
end;


 
TeNY ©   (2004-08-10 11:01) [31]

так можно согласен а если прсто
function MyFunc(..): array of string; то компилятор ошибку дает



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.06 c
1-1092041930
Andy BitOff
2004-08-09 12:58
2004.08.22
Объявления типа. (типа объявление :)))


1-1092128465
Koster
2004-08-10 13:01
2004.08.22
в Hint для TStringGrid надо показывать непомещающийся текст


14-1091639369
dentist
2004-08-04 21:09
2004.08.22
Глюки Delphi 7


3-1090845068
TAN_K
2004-07-26 16:31
2004.08.22
Размер поля - IBExpert


14-1091710708
Ш-К
2004-08-05 16:58
2004.08.22
Пишу макрос