Помощь - Поиск - Пользователи - Календарь
Полная версия: Вводные данные в процедуры и функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Ламер)
Извесно что в некоторые паскалевские процедуре ор функции, можно вводить разные по типу вводные данные или большее количество. Подскажите как это организовать. Если нельзя средствами паскаль, то можно и на ассемблере. cool.gif
volvo
Известно, что некоторые Паскаль-программы используют циклы (for в частности)... Твой вопрос сводится к тому, можно ли написать свой, новый вариант цикла (ну, например, For работающий с управляющей переменной типа Real).

Поймите уже (сколько раз говорилось - не перечесть): Write/WriteLn, Inc и Dec - не процедуры, а нечто вроде макросов.

Цитата
Если нельзя средствами паскаль, то можно и на ассемблере.
Для того, чтобы можно было использовать это из Паскаля - все равно надо описать заголовок с использованием синтаксиса Паскаля. Попробуй...
Boss
Может как вариант сдесь имеется в виду "разные по типу" формальные параметры ПП?!
Procedure ...(Mas : array of ...);
for i := 0 to High(Mas) do...

Если не ошибаюсь это называется открытый массив.
volvo
Открытый массив не дает возможности передавать разные по типу параметры. Только одного типа. Кроме всего прочего, для того чтобы передать open array в подпрограмму, надо описать переменную соответствующего типа, т.е, ты не можешь сделать:

procedure p(arr: array of integer);
begin
...
end;

...
p(1, 2, 3);
p(1, 2);
...


А должен сделать:
var a: array[1 .. 3] of integer;
...
{ заполнить массив A }
p(a);

В чем выигрыш?
Boss
Цитата
Открытый массив не дает возможности передавать разные по типу параметры.
Правилино, но он дает возможность вводить в процедуру массив разной длины, а это большой "+", особенно когда нужно, к примеру, выполнить сортировку с заменой двух массивов разной длины...
volvo
Блин... Ты прочти, что автор темы хочет... Мало ли, что можно делать средствами Паскаля. Можно, например, организовать передачу параметров так, как сделано в функции NewMenu в TurboVision, когда создание меню любой сложности записывается в вызове одной функции. Но это же не значит, что можно реализовать аналог C-шного

void f(int a, ... ) {
/* собственно, что угодно */
}


и передавать в нее параметры можно
// и так:
f(1, 2, 4);
// и вот так:
f(1, "a", 1.1, 10, "hello, world");

(главное - знать, ЧТО передано, чтобы корректно обработать список параметров для чего обычно первым параметром используется форматная строка). А все дело в том, что в Паскале используется соглашение о вызовах StdCall, в отличие от С, где работает Cdecl...

И Дельфийских параметров по умолчанию в Турбо-Паскале тоже нет, чтобы можно было хотя бы не указывать некоторые параметры при вызове... И Array of Const тоже нет...
Ламер)
volvo
Пожалуйста можешь написать подробнее о методе для С, а то я его забыл упамануть.
Ламер)
Да хотелось бы подробнее обьяснить, что я всетаки имел ввиду. Тогда дам пример.

write('Hello!!!');
writeln('i = ', i);
concat(str1, str2);


Или вот так

write(file, i);
writeln(file, i);
concat(str1, str2, str3, ..., strn);


Есть вообще много примеров, из стандартных функций. Мне же интересна реализация.
Поскольку в данный момент я вынужден работать восновном на Паскале, то соответсвенно, мне интересна более всего реализация на данном языке.
xds
Цитата
Есть вообще много примеров, из стандартных функций. Мне же интересна реализация.

Реализация встроена в компилятор. Тебе подобное доступно только путем модификации исходников самого компилятора и его пересборки . Т. е., штатными средствами Паскаля невозможно описать процедуру (функцию) с произвольным числом и типами параметров.
Гость
Цитата(xds @ 18.11.2007 7:13) *

Реализация встроена в компилятор. Тебе подобное доступно только путем модификации исходников самого компилятора и его пересборки . Т. е., штатными средствами Паскаля невозможно описать процедуру (функцию) с произвольным числом и типами параметров.

Прочитай все, потом говори.
мисс_граффити
Еще раз: на паскале так не сделаешь!
Если подойдут и другие языки - напиши конкретно, КАКИЕ!
Артемий
На счет C варианта,например со строкой,имитирует printf( с типом Int):
void small(char *cmessage, ...) {
int numper = 0;
va_list ell;
int dformat = 'd';
char *pchar;

pchar = strchr(cmessage,dformat);

while(*++pchar != '/0') {
pchar++;
pchar = strchr(pchar,dformat);
numper++;
}
cout<< "Выводим чисел " << numper;
va_start(ell,cmessage);
while(numper--)
cout << va_arg(ell,int);

va_end(ell);
}

Напомню,что va_arg, va_start, va_end тоже макросы!
(писал без компилятора,за мелочь не ругайте)
зы и простите за код в теории!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.