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

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

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

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


Новичок
*

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

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


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


Гость






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

Procedure p(Var X);
begin
end;

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

Вообще, разговор получается беспредметный. Приведи пример, ЧТО именно ты хочешь делать в процедуре, и КАК вызывать ее, посмотрим, что для этого можно сделать... Общий случай здесь не пойдет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


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

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


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


Новичок
*

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

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


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

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


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


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

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

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


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


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

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

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


Гуру
*****

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

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


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

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


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


Гость






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

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

 





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