Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Возвращение пользовательского типа функцией

Страницы: 1
Возвращение пользовательского типа функцией
Почему-то не получается возвратить функцией пользовательский тип. Этого нельзя сделать в принципе или я что-то не правильно делаю?
Код
type
  point=record
    x:integer;
    y:integer;
  end;

function getPoint():point;
var
 p:point;
begin
// Некоторый код
p.x:=1;
p.y:=1;
getPoint:=p;
end;

Компилятор выдает ошибку типа данных "Error 34: Invalid function result type"
Изменено: Иван Седаков - 14.04.2010 22:04:16
Приведите полный код модуля вашего и код ошибки. Попробуем разобраться
Accende lumen sensibus, infude ainorem corbidus!
motorway11,
Код программы приведен в моем посте
текст ошибки добавил в пост только что
Вот кое-что наваял, может быть, поможет. Или я пропустил что-то в свое время...

Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  type
  point=record
    x:integer;
    y:integer;
  end;




implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
function getPoint():point;
//var p:point;

begin
// 
getPoint.x:=1;
getPoint.y:=1;
end;

begin

   Form1.Caption:=IntToStr(getPoint().x);

end;

end.
Accende lumen sensibus, infude ainorem corbidus!
motorway11,
Это Вы привели пример на Delphi. А у меня ошибка возникает на TP7.1
Может, я ошибаюсь, но вроде бы принято после декларации функции ставить точку с запятой. Проблема не в этом? У вас нет точки с запятой там.
Accende lumen sensibus, infude ainorem corbidus!
Я вот попробовал под Free Pascal - такой код компилируется:
Код
program contr;
uses crt;
type
  point=record
    x:integer;
    y:integer;
  end;

  function GetPoint():point;
var p:point;
begin
p.x:=1;
p.y:=1;
end;

begin



end.
Accende lumen sensibus, infude ainorem corbidus!
Иван Седаков, ну как, получилось что-либо у Вас? Мой совет был в тему, или все-таки не совсем из той оперы? smile:)
Accende lumen sensibus, infude ainorem corbidus!
motorway11,
Не помогло, т.к. у меня проблема с компилятором Turbo Pascal, а Вы ссылаетесь на другие!
То есть, даже правильный с точки зрения синтаксиса код не компилируется? Тогда это странно, и в чём дело, я не могу сразу сказать. Может, устаревшее ПО просто.
Изменено: motorway11 - 19.04.2010 23:32:05
Accende lumen sensibus, infude ainorem corbidus!
В TP допустимы следующие типы функций: порядковый, вещественный, строковый, указательный. Думаю что свой тип использовать все-таки нельзя.
Цитата
motorway11 пишет:
Может, я ошибаюсь, но вроде бы принято после декларации функции ставить точку с запятой. Проблема не в этом? У вас нет точки с запятой там.

Я вот только сейчас проверил у себя в TP, проблема не в этом. Но вы правы, точку с запятой действительно нужно ставить
Иван Седаков
Может быть вам лучше использовать для этого процедуру. Вот так
Код
type
  point=record
    x:integer;
    y:integer
  end;

procedure getPoint(p:point);
begin
p.x:=1;
p.y:=1;
end;
Изменено: Иван Прокофьев - 24.04.2010 11:35:14
Может быть, Вам перейти на что-нибудь другое? Иногда из-за маленькой ошибки или не получающейся вещи решаешь изменить средство разработки или всю архитектуру smile:)
sherlock2010,
Turbo Pascal не является инструментом разработки программ для меня и, я так думаю, ни для кого другого и это очевидно.
А вопрос у меня был из академических соображений - можно ли так делать на TP7 или нет!!!

Иван Прокофьев,
Это конечно вариант, если нельзя сделать через функцию
Изменено: Иван Седаков - 24.04.2010 20:03:10
Ну тогда надо пойти в этом вопросе до конца и перерыть всё, что можно. smile;)
Вобще-то собственные типы использовать можно. Например, следующий код у меня прекрасно работает

Код
type
number=0..9;

function GetNumber:number;
var nomer:number;
begin
nomer:=3;
GetNumber:=nomer;
end;
Цитата
Иван Седаков пишет:
Почему-то не получается возвратить функцией пользовательский тип. Этого нельзя сделать в принципе или я что-то не правильно делаю?

Код

type

  point=record
    x:integer;
    y:integer;
  end;



function getPoint():point

var

 p:point;

begin

// Некоторый код

p.x=1;

p.y=1;

getPoint=p;

end;



Компилятор выдает ошибку типа данных "Error 34: Invalid function result type"


1) В данной функции нет ";" после объявления, о чём уже писали
2) в присвоениях нужно использовать ":=" а не "="
3) если не помогло попробуй "Result := p;" вместо "getPoint=p;"
Изменено: Bulat Nasyrov - 28.05.2010 17:27:15
Отпишись о результате. для потомков smile;)
Bulat Nasyrov,
Дело не в этих ошибка. В программе их у меня нет, пример просто не правильно перебил (сейчас уже исправил).
с "Result:=p" тоже не прокатывает.

Кстати, не знал, что результат работы функции можно присваивать переменно Result....
Да) это "бесплатная" переменная в любой функции можно присваивать)

Турбо Паскаль к сожалению я не застал. Работал только на Delphi (Object Pascal)... трудно сказать в чём может быть ошибка.
Я не совсем понял, разрешилась ситуация или нет.

Возвращать результат функции можно 2мя способами
ИМЯ_ФУНКЦИИ:=
либо
Result:=

первый вариант для старых версий паскаля, второй для ныне актуальных.

Иван Седаков, вы можете возвращать результатом функции не саму структуру, а указатель на нее
в вашем примере так
Код
type 
  point=record 
    x:integer; 
    y:integer; 
  end;
PPoint = ^point;

...

function getPoint():Tpoint;
либо
function getPoint():pointer;
Автор так и не написал, получилось, или нет, хотя очень интересно стало)
Мб проблема в том, что используются записи?
mihail filatov, мне кажется, динамические данные тут задействовать не стоит...
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)