Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Вводные данные в процедуры и функции

Автор: Ламер) 18.11.2007 2:52

Извесно что в некоторые паскалевские процедуре ор функции, можно вводить разные по типу вводные данные или большее количество. Подскажите как это организовать. Если нельзя средствами паскаль, то можно и на ассемблере. cool.gif

Автор: volvo 18.11.2007 3:35

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

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

Цитата
Если нельзя средствами паскаль, то можно и на ассемблере.
Для того, чтобы можно было использовать это из Паскаля - все равно надо описать заголовок с использованием синтаксиса Паскаля. Попробуй...

Автор: Boss 18.11.2007 3:50

Может как вариант сдесь имеется в виду "разные по типу" формальные параметры ПП?!

Procedure ...(Mas : array of ...);
for i := 0 to High(Mas) do...

Если не ошибаюсь это называется открытый массив.

Автор: volvo 18.11.2007 4:24

Открытый массив не дает возможности передавать разные по типу параметры. Только одного типа. Кроме всего прочего, для того чтобы передать 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 18.11.2007 6:02

Цитата
Открытый массив не дает возможности передавать разные по типу параметры.
Правилино, но он дает возможность вводить в процедуру массив разной длины, а это большой "+", особенно когда нужно, к примеру, выполнить сортировку с заменой двух массивов разной длины...

Автор: volvo 18.11.2007 6:20

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

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


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

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

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

Автор: Ламер) 18.11.2007 6:54

volvo
Пожалуйста можешь написать подробнее о методе для С, а то я его забыл упамануть.

Автор: Ламер) 18.11.2007 7:20

Да хотелось бы подробнее обьяснить, что я всетаки имел ввиду. Тогда дам пример.


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


Или вот так

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


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

Автор: xds 18.11.2007 11:13

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

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

Автор: Гость 18.11.2007 18:34

Цитата(xds @ 18.11.2007 7:13) *

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

Прочитай все, потом говори.

Автор: мисс_граффити 18.11.2007 19:34

Еще раз: на паскале так не сделаешь!
Если подойдут и другие языки - напиши конкретно, КАКИЕ!

Автор: Артемий 19.11.2007 18:37

На счет 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 тоже макросы!
(писал без компилятора,за мелочь не ругайте)
зы и простите за код в теории!