А можно сделать процедуру (функцию) с заранее не известным количеством параметров? Например так, как реализована процедура Write/WriteLn. Заранее спасибо!
Здравствуйте, 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, ведь он же написан на "самом себе"? Или я в чём то ошибаюсь? Надеюсь, что проблема описана исчерпывающе. Заранее спасибо!
Добрый день, 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.