2009-05-01 9 views

Antwort

1

Ein Ansatz wäre, GetMem zu verwenden, um genau genug Speicher zuzuweisen. GetMem scheint weitgehend unterstützt.

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: Wort = 10000; funktioniert nicht in FreePascal => MAXMATRIXDATA = 10000 funktioniert –

1

Mit jeder modernen Pascal-Variante (Delphi) können Sie dynamische (Laufzeitgrößen) Arrays erstellen.

Wenn die Sprache nicht mehrdimensionale dynamische Arrays nicht unterstützt Sie kümmern sich um die selbst Adressierung nehmen:

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; 

Diese Art der Adressierung wird viel schneller sein als verkettete Listen folgen.