2011-09-12 87 views
0

在我写的FreePascal代码中,我发现在长度为'n'的动态数组中,它总是包含元素'n'中的一个随机值。如何正确传递FreePascal中的动态数组

我明白为什么这是,但是,我想知道如果我写我的代码的方式可能存在缺陷。我把它粘贴在下面。我欢迎任何更正。

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. 

回答

4

在自由帕斯卡动态阵列是零基于。所以第一个元素是MyArray[0],最后一个元素是MyArray[High(MyArray)],它等于MyArray[Length(MyArray) - 1]。你永远不应该访问MyArray[Length(MyArray)]

1

...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);

+0

准确地说,动态数组“知道”它们的长度。 – cyco130