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

> Прочтите прежде чем задавать вопрос!

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

 
 Ответить  Открыть новую тему 
> Как передать в функцию переменную любого типа?, как сделать что-то типа readln или writeln, передавая в параметре любу
kramolnic
сообщение 15.03.2007 22:20
Сообщение #1


Новичок
*

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

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


Возникла необходимость написать процедурку, которая будет выводить текст с форматированием относительно окна (по центру, справа, слева и т.п...)... Стандартная процедура ReadLn или WriteLn да и куча им подобных может принимать в качестве параметра переменную любого типа и работать с ней.. можно распечатать и String и Integer... а как объявить свою процедуру, чтобы она могла делать так же?? то есть как не привязывать параметр к определенному типу??
P.S. параметр должен передаваться по ссылке (со словом var).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2007 22:30
Сообщение #2


Гость






Цитата
Стандартная процедура ReadLn или WriteLn
Ошибка... ReadLn/WriteLn - это макросы, ничего общего с процедурами не имеющие... А чтобы передать любой параметр, передавай его вообще без типа:

Procedure p(Var X);
begin
end;

(только тогда ты должен будешь привести внутри процедуры переменную X к нужному типу)...

Вообще, разговор получается беспредметный. Приведи пример, ЧТО именно ты хочешь делать в процедуре, и КАК вызывать ее, посмотрим, что для этого можно сделать... Общий случай здесь не пойдет...
 К началу страницы 
+ Ответить 
kramolnic
сообщение 15.03.2007 22:38
Сообщение #3


Новичок
*

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

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


Цитата(volvo @ 15.03.2007 22:30) *

Ошибка... ReadLn/WriteLn - это макросы, ничего общего с процедурами не имеющие... А чтобы передать любой параметр, передавай его вообще без типа:


О как! а я то думал, что процедура, объявленная где нить в дебрях паскаля... sad.gif
ну скажем, хочу я вывести число по центру, а ниже строку, юзая свою процедуру или что там... Вызываем это дело, например, так...:

Код
var
  k: integer;
  s: string;
begin
  k:= 2345;
  s:= 'This is my text';
  WriteCenter(k);
  writeln('');
  WriteCenter(s);
end;
вот как эту WriteCenter описать, чтобы она обе переменные нормально приняла (тип-то разный), вычислила координаты X, Y, куда выводить строку (видимо, все равно придется к Stringу привести, чтобы число символов посчитать), сделала GoToXY и потом Write(param), где param - параметр, передаваемый процедуре...

Сообщение отредактировано: kramolnic - 15.03.2007 22:40
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2007 23:27
Сообщение #4


Гость






Извращение конечно еще то, но все-таки... (если уверен, что хочешь это видеть - нажми мышкой на спойлер, не открываю сразу, может у кого-то будут еще варианты)

Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.03.2007 0:17
Сообщение #5


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

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

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


Цитата
Возникла необходимость написать процедурку

Возникла для сугубо практических целей? Или должно быть написано именно на паскале?


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


Новичок
*

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

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


Цитата(мисс_граффити @ 16.03.2007 0:17) *

Возникла для сугубо практических целей? Или должно быть написано именно на паскале?


Именно для практических целей... и именно на Паскале. Но на самом деле было больше интересно, как это в паскале реализуется такая вещь. Я-то думал, что read и write процедурами являются. dry.gif
Думаю, проще просто текстовое значение в качестве параметра принимать и его выводить. Придется только преобразовывать типы в String... эх... прям как в старые добрые времена в Delphi nea.gif там достали эти преобразования, так теперь еще и здесь...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.03.2007 0:56
Сообщение #7


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

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

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


Ясно. Я просто хотела предложить посмотреть в сторону java... Там это несложно реализовать.
*задумалась, считать ли это свое сообщение нарушением правил.


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


Гость






Цитата
на самом деле было больше интересно, как это в паскале реализуется такая вещь.
На самом то деле в Паскале такое реализуется ГОРАЗДО проще, чем ты можешь себе предстаить, только вот почему-то у многих выработался рефлекс: как только видят в программе слово Object - дальше программа не читается... А зря... Смотри:

type
pT = ^T;
T = object
constructor create;
procedure Print; virtual;
end;

pTstring = ^Tstring;
Tstring = object(T)
data: string;
constructor create(s: string);
procedure Print; virtual;
end;

pTinteger = ^Tinteger;
Tinteger = object(T)
data: integer;
constructor create(i: integer);
procedure Print; virtual;
end;

constructor T.create;
begin end;
procedure T.print;
begin end;

constructor Tstring.create(s: string);
begin
inherited Create;
data := s;
end;
procedure Tstring.Print;
begin
writeln('<' + data + '>')
end;

constructor Tinteger.create(i: integer);
begin
inherited Create;
data := i;
end;
procedure Tinteger.Print;
begin
writeln(data:10);
end;

procedure WriteCenter(Obj: pT);
begin
Obj^.Print;
end;

begin
WriteCenter(new(pTinteger, create(2345)));
writeln('');
WriteCenter(new(pTstring, create('This is my text')));
end.

Что, ЭТО не Паскаль? Почему же вы выбрасываете из языка ее самую мощную часть?

 К началу страницы 
+ Ответить 
Bokul
сообщение 16.03.2007 1:22
Сообщение #9


Гуру
*****

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

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


Вопрос: для чего при наследовании ты используешь inherited, вместо простого перекрытия?

Сообщение отредактировано: Bokul - 16.03.2007 1:31


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 1:35
Сообщение #10


Гость






Привычка... Я всегда инициализирую всю цепочку (третий инициализируется вторым, который в свою очередь инициализируется первым)... Возможно, мне понадобится добавить еще один тип МЕЖДУ уже описанными (скажем, перед Tstring), тогда Inherited спасает меня от лазания по коду, как если бы я написал:
constructor Tstring.create(s: string);
begin
T.Create;
data := s;
end;
а представляешь, если у тебя иерархия из десятка уровней, и нескольких десятков классов? Где-то надо менять, где-то не надо... Веселуха...
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 28.04.2024 18:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"