如何在 FreePascal 中正确传递动态数组

0 freepascal parameter-passing dynamic-arrays

在我编写的这个 FreePascal 代码中,我发现在一个长度为“n”的动态数组中,它总是在元素“n”中包含一个随机值。

我理解为什么会这样,但是,我想知道我编写代码的方式是否存在缺陷。我把它粘贴在下面。我欢迎任何更正。

program LinearSearch;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils
  { you can add units after this };

{$R *.res}

type
  ArrayOfByte = array of Byte;

Function findMaximum(studentMarks : ArrayOfByte; numberOfStudents : integer)
: integer;
var
  maximumMark : Integer;
  studentWithMaximumMark : Integer;
  index : integer;
begin
  setLength(studentMarks, numberOfStudents);
  maximumMark := studentMarks[0];

  for index:=0 to numberOfStudents do
  begin
    write(IntToStr(studentMarks[index]));
    if index = numberOfStudents then writeln('.')
    else write(',');
  end;

  for index:= 0 to (numberOfStudents - 1) do
  begin
      if studentMarks[index] > maximumMark then
      begin
           maximumMark := studentMarks[index];
           studentWithMaximumMark := index;
        end;
  end;
  write('Maximum score of ',IntToStr(maximumMark),' was achieved by ');
  Result := studentWithMaximumMark+1;
end;

var
  studentMarks : ArrayOfByte;
  numberOfStudents : Integer;
  studentWithMaximumMarks : Integer;
  counter : integer;
begin
  write('Enter the number of students: ' );
  readln(numberOfStudents);
  setLength(studentMarks,numberOfStudents);

  writeln('Input the grades for the following students:');
  for counter := 0 to (numberOfStudents - 1) do
  begin
    write('Student ',counter+1,': ');
    readln(studentMarks[counter]);
  end;
  writeln('Data has been input. Finding student with maximum marks.');

  studentWithMaximumMarks := findMaximum(studentMarks,numberOfStudents);
  write('student no. ',IntToStr(studentWithMaximumMarks));
  writeln;
  writeln('Press ANY key to continue');
  readln;
end.
Run Code Online (Sandbox Code Playgroud)

cyc*_*130 5

在 Free Pascal 中,动态数组是基于零的。所以第一个元素是MyArray[0],最后一个元素MyArray[High(MyArray)]是等于MyArray[Length(MyArray) - 1]。你永远不应该访问MyArray[Length(MyArray)].