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

时间:2018-05-07 10:00:35

标签: arrays record pascal freepascal

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

我遇到的问题是终端在一次运行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.

1 个答案:

答案 0 :(得分:1)

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

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

注意: ResultReadComputer的使用是多余的。使用函数名称或Result变量来返回函数结果。后者更喜欢,因为代码会更清晰。

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