Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 272
от 16.04.2004, 18:50

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 460
Отправлено ответов: 1703
Активность: 370.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

sir henry
Статус: Профессиональный
Общий рейтинг: 159.82
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 157.84
URL: Программирование на Паскале
[Подробней >>]
Strory
Статус: Доверительный
Общий рейтинг: 162.02
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 457. А можно сделать процедуру (функцию) с заранее не известным количеством параметров? Например так, как... (ответов: 3)
Вопрос № 458. Добрый вечер, уважаемые эксперты! Постараюсь точнее описать проблему. Решил пользоваться TMT Pascal,... (ответов: 2)

Вопросов: 2, ответов: 5


 Вопрос № 457

А можно сделать процедуру (функцию) с заранее не известным количеством параметров? Например так, как реализована процедура Write/WriteLn. Заранее спасибо!



Вопрос отправлен: 12.04.2004, 22:42
Отправитель: Revolter

[Следующий вопрос >>] [Список вопросов]

Отвечает sir henry

Здравствуйте, Revolter!
Write/WriteLn - это не функция, а макрос. Но в принципе сделать можно. Если у Вас все параметры одного типа, то в качестве параметра функции можно указать массив неопределенной длины:
Function MyFunc(ar: array of integer): type_of_result;
Такой массив начинается с ноля и требует определения верхней границы.
Можно послать указатель на ячейку памяти, с которой начинаются Ваши данные, передаваемые параметром. Естественно разбираться с таким параметром можно создав соответствующую запись или например, читая этот массив памяти побайтно.
Однако самое, на мой взгляд, простое решение это оиспользовать TCollection. По сути коллекция - это динамический массив с готовыми решениями по поиску и извлечению данных:
Function MyFunc(Coll: TCollection): result;
Количество элементов в коллекции уже содержиться в самой коллекции.

Ответ отправлен: 13.04.2004, 09:00
Отправитель: sir henry


Отвечает Boriss

Добрый день, Revolter!
Используя только конструкции языка Паскаль - нет. Процедуре, и написанной на Паскале и на С, параметры передаются через стек. Эти параметры после работы процедуры нужно удалить. На С/С++ параметры удаляет вызвавшая программа. Она знает сколько надо удалить. Процедура в этой информации не нуждается. В результате удается передавать разное число параметров.
На Паскале стек очищает сама процедура с помощью ОЧЕНЬ эффективного варианта команды RET (ассемблер). Из-за этого работает быстрее, но число параметров оказывается фиксированным!
Но и сказать НЕЛЬЗЯ - тоже не совсем точно - смотри инофрмацию по открытым параметрам ( {$P+} ) - строкам и массивам. А там можно исхитриться :))

Ответ отправлен: 13.04.2004, 12:23
Отправитель: Boriss


Отвечает Strory

Приветствую Вас, Revolter!
К сожалению, этого сделать нельзя. В Паскале количество параметров должно быть строго фиксированным и никак иначе. Если Вам нужно воспроизвести действие Write, то попробуйте так:
Вместо
Write('Строка 1', 'Строка 2')
Делайте
Print('Строка 1' + 'Строка 2')


Ответ отправлен: 13.04.2004, 17:47
Отправитель: Strory


 Вопрос № 458

Добрый вечер, уважаемые эксперты!
Постараюсь точнее описать проблему. Решил пользоваться TMT Pascal, но, как Вам известно, существует проблема с кодировкой. Поэтому лучшим решением проблемы мне виделась замена стандартных Write/WriteLn на свои, которые производили бы перекодировку из Windows в DOS. Естественно, использование массивов здесь не является решением, а сипользование "суммации" строк крайне нежелательно.
Но если нельзя сделать подпрограмму с динамическим количеством параметров, то как же тогда Write/WriteLn реализованы на Free Pascal, ведь он же написан на "самом себе"? Или я в чём то ошибаюсь?
Надеюсь, что проблема описана исчерпывающе. Заранее спасибо!



Вопрос отправлен: 13.04.2004, 18:09
Отправитель: Revolter

[Следующий вопрос >>] [Список вопросов]

Отвечает Boriss

Добрый день, Revolter!
Немного запутался в исчерпывающе описанной проблеме :))
TMT Pascal, FreePascal ...
Да, Вы ошибаетесь насчет написания Паскаля "на самом себе" - это верно для С, С++. Паскаль реализован на ассемблере.
Write/Writeln - это, скорее, макросы языка ассемблера
Если Вам интересно, то напишите, где-то были у меня исходники BP 6.0, а для FreePascal - исходники, естественно, доступны всем

Ответ отправлен: 13.04.2004, 20:12
Отправитель: Boriss


Отвечает sir henry

Добрый день, Revolter!
По моему я Вам уже писал, что Write/WriteLn это не функция, а макрос. Наиболее простым решением проблемы мне видится использование вместо TMT Pascal - FreePascal.
Если же Вы хотите непременно использовать TMT, то опять же более простое решение применять либо строковые константы, описаные в файле с ДОС кодировкой, либо строковые ресурсы. Лично я не вижу смысла упираться именно в TMT :).
У FreePascal доступны исходники и Вы вполне свободно можете посмотреть реализацию Write/WriteLn :)).

Ответ отправлен: 14.04.2004, 05:44
Отправитель: sir henry



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (22)
C / C++ (13)
Perl (1)
Builder / Delphi (17)
Pascal (18)
Basic / VBA (3)
Java / JavaScript (3)
PHP (9)
Криптография (6)
WinAPI (11)
Радиоэлектроника (6)
Пользователю
Windows 95/98/Me (34)
Windows NT/2000/XP (48)
"Железо" (24)
Поиск информации (16)
Администратору
Windows NT/2000/XP (24)
Linux / Unix (7)
Юристу
Гражданское право (10)
Семейное право (8)
Трудовое право (8)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное