Arrays 警告:托管类型的函数结果变量似乎未初始化

Arrays 警告:托管类型的函数结果变量似乎未初始化,arrays,record,pascal,freepascal,Arrays,Record,Pascal,Freepascal,我的任务要求我创建两个例程,一个从终端读入数据,另一个向终端输出数据,另外两个例程利用数组循环这两个例程多次执行 我遇到的问题是,终端在一次运行ReadComputer函数后崩溃,而不是多次循环。编译器还向我提供以下警告: “警告:托管类型的函数结果变量似乎未初始化” 虽然经过广泛的研究,由于没有人使用pascal,我无法找到解决方案。非常感谢您的帮助!:) 我在此提供了我的代码副本供参考: program CompupterProgram; uses TerminalUserInput; ty

我的任务要求我创建两个例程,一个从终端读入数据,另一个向终端输出数据,另外两个例程利用数组循环这两个例程多次执行

我遇到的问题是,终端在一次运行
ReadComputer
函数后崩溃,而不是多次循环。编译器还向我提供以下警告:

“警告:托管类型的函数结果变量似乎未初始化”

虽然经过广泛的研究,由于没有人使用pascal,我无法找到解决方案。非常感谢您的帮助!:)

我在此提供了我的代码副本供参考:

program CompupterProgram;
uses TerminalUserInput;
type 
    Computer = Record
        id: integer;
        manafacturer: String;
        year: integer;
        warranty: integer;
    end;

type Computers = Array of Computer;

function ReadComputer(): Computer;
begin
    ReadComputer.id := ReadInteger('PLease Enter Computer Id:');
    ReadComputer.manafacturer := ReadString('PLease Enter Computer Manafacturer:');
    ReadComputer.year := ReadInteger('PLease Enter Computer Year:');
    ReadComputer.warranty := ReadInteger('PLease Enter Computer Warranty:');
    result := ReadComputer;
end;

procedure WriteComputer(c: Computer);
begin
    WriteLn('Computer ID: ', c.id);
    WriteLn('Computer Manafacturer ', c.manafacturer);
    WriteLn('Computer Year ', c.year);
    WriteLn('Computer Warranty ', c.warranty);
    ReadLn();
end;

function ReadAllComputers(count: Integer): Computers;
var i: Integer;
begin
    for i := 0 to count do
    begin
        ReadAllComputers[i] := ReadComputer();
    end;
result := ReadAllComputers;
end;

procedure WriteAllComputers(computerArray: Computers);
var i: Integer;
begin
    for i:= 0 to (length(computerArray)) do
    begin
        WriteComputer(computerArray[i]);
    end;
end;

procedure Main();
var computers: Array of Computer;
    index: Integer;
begin
    computers := ReadAllComputers(3);
    WriteAllComputers(computers);
end;

begin
Main();
end.

Computers
是一个动态数组,在使用
SetLength()
ReadAllComputers
中使用之前,需要设置其长度

所有动态数组都是从零开始的,因此您需要在几个地方从零开始计数到
Length(aDynArray)-1
。或者使用函数来表示其索引的最高可能值


注意:
ReadComputer
中使用
结果是多余的。使用函数名或
Result
变量返回函数结果。后者更可取,因为代码更清晰


在freepascal中,
Result
变量仅在ObjFPC或Delphi模式下定义。

您的代码有一些错误。您可以注销数组的末尾。这些是零基的。因此,有效索引为0到N-1(包括)。您可以在两个循环中访问索引N。其次,不分配数组。您需要在
ReadAllComputers
中调用
SetLength
。最后,结果:=ReadAllComputers什么也不做。它们都引用相同的变量。我的建议是总是使用
Result
。更清晰,更简洁。非常感谢ReadAllComputers中的设置长度解决了这个问题,非常感谢!好的,你需要修复超出边界的数组访问。我之前也将循环设置为停止在(n-1)处,我正在试验代码,然后复制并粘贴到这里,这就是为什么不存在的原因。我已经做了所有更改,再次感谢!为什么是“不幸”?我不知道有哪种语言比Pascal更容易表达问题(及其解决方案),尤其是Object Pascal.FreePascal现在有{$ModeSwitch Result}作为函数结果,而不影响模式中的其他开关。