2009-05-01 70 views

回答

1

一種方法是使用GetMem來分配足夠的內存。 GetMem似乎得到廣泛支持。

const 
    MAXMATRIXDATA: Word = 10000; 
type 
    TMatrixDataType = Word; 
    TMatrixData = array[0..MAXMATRIXDATA] of TMatrixDataType; 
    PMatrixData = ^TMatrixData; 
    TMatrix = record 
     Rows, Cols: Word; 
     MatrixData: PMatrixData; 
     end; 
    PMatrix = ^TMatrix; 

function CreateMatrix(Rows, Cols: Word): PMatrix; 
var 
    Ret: PMatrix; 
begin 
    New(Ret); 
    Ret^.Rows := Rows; 
    Ret^.Cols := Cols; 
    GetMem(Ret^.MatrixData,Rows*Cols*SizeOf(TMatrixDataType)); 
    CreateMatrix := Ret; 
end; 

function GetMatrixData(Matrix: PMatrix; Row, Col: Word): TMatrixDataType; 
begin 
    GetMatrixData := Matrix^.MatrixData^[(Row*Matrix^.Cols)+Col]; 
end; 

procedure SetMatrixData(Matrix: PMatrix; Row, Col: Word; Val: TMatrixDataType); 
begin 
    Matrix^.MatrixData^[(Row*Matrix^.Cols)+Col] := Val; 
end; 
+0

MAXMATRIXDATA:Word = 10000;在FreePascal => MAXMATRIXDATA = 10000時不起作用 – 2009-05-01 12:54:19

1

任何現代的pascal變體(Delphi)都可以讓你創建動態的(運行時大小的)數組。

如果語言不支持,你可以照顧自己解決多維動態數組:

var 
    rows, cols, total, i, j : integer; 
    cell : datatype; 
begin 
    rows := ...; 
    cols := ...; 
    total := rows * cols; 
    matrix := ...(total); 

    cell := matrix[i * cols + j]; // matrix[row=i,col=j] 

end; 

這種處理會比下面的鏈表快了很多。