IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Вводные данные в процедуры и функции, Как организовать "выборочные" вводные
сообщение
Сообщение #1


Гость






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


Гость






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

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

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


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Может как вариант сдесь имеется в виду "разные по типу" формальные параметры ПП?!
Procedure ...(Mas : array of ...);
for i := 0 to High(Mas) do...

Если не ошибаюсь это называется открытый массив.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

В чем выигрыш?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


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


Гость






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

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


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

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

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


Гость






volvo
Пожалуйста можешь написать подробнее о методе для С, а то я его забыл упамануть.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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


Или вот так

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


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


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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

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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

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

Прочитай все, потом говори.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


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

Сообщение отредактировано: Артемий -


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.12.2021 16:57
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name