Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > функция особого опасного типа


Автор: Kaskad 21.5.2005, 17:55
Нужно сделать функцию такого типа:
Код



type

MegaType=record
                   man:integer;
                   girl:integer;
                   end;

function GdeDeti(var x:bibip):MegaType;






Выдаёт ошибку: "инвалид тип". Как выличить инвалида? smile Вариант передачи параметра по ссылке не принимается.

Автор: SPrograMMer 21.5.2005, 21:13
Цитата(Kaskad @ 21.5.2005, 17:55)
функцию такого типа:

Цитата(Kaskad @ 21.5.2005, 17:55)
Код

function GdeDeti(var x:bibip):MegaType;


ну так в чем проблема?

Цитата(Kaskad @ 21.5.2005, 17:55)
инвалид тип

угу. тип MegaType ты объявляешь, чуть выше, а про bibip ничего неизвестно. Что это?

Автор: Mager2005 21.5.2005, 21:32
Что обязательно нужна функция? А процедура не подойдет?
Код

procedure GdeDeti (x:bibip; var y:MegaType);

Никаких инвалидов.

Автор: Kaskad 22.5.2005, 09:50
Цитата(Mager2005 @ 21.5.2005, 21:32)
Что обязательно нужна функция? А процедура не подойдет?


Цитата(Kaskad @ 21.5.2005, 17:55)
Вариант передачи параметра по ссылке не принимается.



Цитата(SPrograMMer @ 21.5.2005, 21:13)
тип MegaType ты объявляешь, чуть выше, а про bibip ничего неизвестно. Что это?

Упс, ошибся. Вот как:

Код


type

MegaType=record
                   man:integer;
                   girl:integer;
                   end;

function GdeDeti(var bibip:integer):MegaType;



Вот, выдаёт инвалида. smile

Автор: Romtek 22.5.2005, 11:38
Турбо Паскаль не умеет возвращать в функции тип запись. Нужна именно ссылка (указатель).

Автор: remax 22.5.2005, 18:14
Да, именно так и написано во встроенном хелпе:
Цитата
Valid result types are ordinal, real, string, and pointer.
smile

То есть, передать в качестве результата функции другой тип (record, например) - нельзя! smile

Но, если очень хочется - то можно ! smile

Код


type
  MyType=record
     man:integer;
     girl:integer;
  end;

function MyFunction(x:integer):longint;
  var
    t:MyType;
    r:longint absolute t;
  begin
    t.man:=x;
    t.girl:=random(10);
    MyFunction:=r;
  end;

var
  y:MyType;
  z:longint absolute y;
begin
  z:=MyFunction(5);
  writeln('y.man=',y.man);
  writeln('y.girl=',y.girl);
end.


Просто мы здесь используем несложный прием - две переменные в одной области памяти, плюс нам повезло с исходной структурой - она занимает 4 байта.
integer(2) + integer(2) = longint(4) И все ок! smile Фактически, мы передаем нужную структуру, а формально - ничего не нарушили! smile smile smile smile

Автор: Kaskad 23.5.2005, 09:11
Цитата(Romtek @ 22.5.2005, 11:38)
Турбо Паскаль не умеет

А гну или компак умеет? smile
Добавлено @ 09:15
Цитата(remax @ 22.5.2005, 18:14)
И все ок!  Фактически, мы передаем нужную структуру, а формально - ничего не нарушили!   

Ага, я как-то 6+8 считал ~70 строк на Паскале мудрёным хитрым способом. В итоге преподаватель никак не мог понять
как получилось из 2+5=14 (это мои 6+8) smile

Автор: Romtek 23.5.2005, 17:49
Цитата(Kaskad @ 23.5.2005, 09:11)
А гну или компак умеет?
Не знаю как эти, а Free Pascal - умеет.

Автор: remax 26.5.2005, 23:27
Цитата(Romtek @ 23.5.2005, 14:49)
Цитата(Kaskad @ 23.5.2005, 09:11)
А гну или компак умеет?
Не знаю как эти, а Free Pascal - умеет.

И Delphi может...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)