#delphi #delphi-xe6
#delphi #delphi-xe6
Вопрос:
Возврат массива с использованием функции консольного типа может быть выполнен, но я пытаюсь создать функцию, которая принимает целое число n в качестве входных данных и возвращает расширенный массив в форме VCL Delphi. Как мы можем это сделать?
Ответ №1:
В современных версиях Delphi вы должны использовать общий массив, TArray<T>
. Вот так:
function Foo(N: Integer): TArray<Extended>;
var
i: Integer;
begin
SetLength(Result, N);
for i := 0 to N-1 do begin
Result[i] := i;
end;
end;
Я хотел бы подчеркнуть, что это, вероятно, ошибка в использовании Extended
. Это довольно необычный и плохо работающий 10-байтовый тип с плавающей запятой. Этот тип доступен только на ограниченном количестве процессоров. Почти все вычисления с плавающей запятой в реальном мире выполняются с использованием Single
или Double
, 4-байтовых и 8-байтовых типов данных IEEE-754 с плавающей запятой.
Ответ №2:
Если мне не изменяет память, это нужно сделать, повторно введя его, т.Е.:
type
TResultType: array of extended;
function DoSomthing(): TResultType
begin
SetLength(Result, 2);
Result[0] := 1.2;
Result[1] := 3.4;
end;
Комментарии:
1. выдает ошибку ‘TResultType не имеет соответствующего компонента’. Возможно, я недостаточно ясно выразился. Функция используется для генерации массива (X[n]), который может быть вызван во время процедуры для возврата определенного значения при текущем значении n.
2. @Jack Код в вопросе не приводит к ошибке. Пожалуйста, не ожидайте, что мы будем комментировать ваш код, который мы не видим, который вы нам не покажете. Я призываю вас притормозить и изучить основы перед кодированием.
Ответ №3:
Это не проблема VCL / консоли, поскольку объявления функций не зависят от типа приложения, которое вы пишете.
Функции Delphi (или любые функции Pascal) могут возвращать любой именованный тип данных. Пока тип массива объявлен в разделе type, функция может его обрабатывать.
например.
type
ExtArray : array of extended;
function IntToArray(i:integer):ExtArray;
begin
...
end;
Комментарии:
1. Похоже, Слейд просто опередил меня!