Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.03 c
1-1091688013
serg128
2004-08-05 10:40
2004.08.22
Как скопировать в буфер всю строку из Grid?


1-1091946029
k-sergey
2004-08-08 10:20
2004.08.22
ListBox1MouseUp как узнать на каком items кликнули ?


9-1084040639
Дикс
2004-05-08 22:23
2004.08.22
OnTop


1-1091515880
alless
2004-08-03 10:51
2004.08.22
TPanel & Canvas


4-1089188971
Анатолий
2004-07-07 12:29
2004.08.22
Програмно отключить LPT





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский