Как правильно передавать динамические массивы во FreePascal - PullRequest
0 голосов
/ 12 сентября 2011

В этом коде 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.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

В Free Pascal динамические массивы основаны на нуле . Таким образом, первый элемент - MyArray[0], а последний элемент - MyArray[High(MyArray)], что равно MyArray[Length(MyArray) - 1]. Вы никогда не должны получить доступ к MyArray[Length(MyArray)].

1 голос
/ 12 сентября 2011

...I found that in a dynamic array of length 'n', it always contained a random value in element 'n'. это потому, что вы обращаетесь к значению за пределами массива, отметьте в процедуре findMaximum строку

for index:=0 to numberOfStudents do

должно быть

for index:=0 to numberOfStudents-1 do

Также вы можете удалить первую строку этой же процедуры setLength(studentMarks, numberOfStudents);

...