2011-09-12 19 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