Предупреждение: переменная результата функции управляемого типа не инициализируется - PullRequest
0 голосов
/ 07 мая 2018

Задача, которую я имею, требует, чтобы я создал две подпрограммы, одна из которых считывает данные из терминала, а другая выводит данные в терминал, и еще две подпрограммы, которые используют массив для циклического прохождения этих двух подпрограмм, чтобы выполнить их несколько раз ,

Проблема, с которой я столкнулся, заключается в том, что терминал падает после одного прогона функции ReadComputer вместо многократного зацикливания. Компилятор также выдает мне следующее предупреждение:

«Предупреждение: переменная результата функции управляемого типа не инициализирована»

хотя после обширных исследований и из-за того, что никто не использует паскаль, я не могу найти решение. Любая помощь высоко ценится! :)

Я предоставил копию своего кода здесь для справки:

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 голосов
/ 07 мая 2018

Computers - это динамический массив, и вам необходимо установить его длину перед использованием в ReadAllComputers с помощью SetLength().

Все динамические массивы основаны на нуле, поэтому вам нужно считать от нуля до Length(aDynArray)-1 в нескольких местах. Или используйте функцию High (aDynArray) , чтобы выразить максимально возможное значение своего индекса.


Примечание: Использование Result в ReadComputer является излишним. Либо используйте имя функции, либо переменную Result, чтобы вернуть результат функции. Последнее предпочтительнее, так как код будет более понятным.

В freepascal переменная Result определяется только в режиме ObjFPC или Delphi.

...