在delphi7中我有一个函数,我需要返回一个数组作为结果类型b
“function createsbox(key:tkey):byte [0..255] of byte;”这是不允许的,它期望“识别器预期但发现阵列”是错误抛出。似乎工作正常,如果我声明一个记录类型的数组,但对一个函数这样做似乎没有意义。
答案 0 :(得分:15)
问题是您不允许在函数声明中创建新类型。但是,当您将返回类型指定为array[0..255] of Byte
时,这就是您正在执行的操作。相反,声明一个命名类型,然后将其用于返回类型:
type
TSBox = array[0..255] of Byte;
function CreateSBox(const Key: TKey): TSBox;
答案 1 :(得分:3)
有一个微妙的原因,并且在Pascal中,两个数组类型声明不是相同的“类型”,无论它们的声明有多相同,因此不能分配兼容。如果你写:
var
A: array[1..10] of Integer;
B: array[1..10] of Integer;
A和B是不同的类型。如果你写
A := B;
代码不会编译,A和B是不同的类型。
因此,如果你写
var
A: array[1..10] of Integer;
...
function Foo(...): array[1..10] of Integer;
你实际上是为函数结果声明了一个类型 - 该类型将是无用的,因为无论它的声明如何,你都无法将它分配给A或任何数组,例如:
A := Foo(...);
即使编译器允许你以这种方式声明函数,也行不通。
因此,拥有有用的函数结果类型的唯一方法是使用已声明的类型。只有开放数组才是此规则的一个例外,但它们只能用作函数参数,而不能用作结果。
答案 2 :(得分:1)
好的类型TSBox = Byte数组工作正常,但是在2个或更多单元中使用这个新类型可能会很棘手。 '因为你会收到一条错误消息“不兼容的类型”。 这种情况有部分解决方案。 U可以通过这种表示法通知编译器哪个单元具有该类型:unit.type; 例: 想象一下,我有一个名为Web的单元,我在其中声明了类型TDownload。我可以这样做: var fileUrl:Web.TDownload; 在这种情况下,编译器将理解您使用相同的类型。 然而,这就是我对你们所有人的问题:如果你不想把这个单位放在使用上,那就是什么 - 循环引用,poo良好实践等等。我能做些什么来避免这个问题?