Frage

Ich brauche Operationen mit Matrizen und Größe der Matrix zu implementieren ist variabel. Die einzige Lösung, die ich herauskommen, ist verkettete Liste zu verwenden:

[pointer to this row, pointer to another row] -> [element 1,1; link to another element] -> [element 1,2,  link to another element] -> .... -> [nil]
     |
     v
[pointer to this row, pointer to another row] ...
     ...

Aber es scheint mir ein wenig komplex .. Gibt es eine bessere (und leichter) Lösung?

Danke Jungs!

War es hilfreich?

Lösung

Ein Ansatz würde GetMem benutzen, 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;

Andere Tipps

Jeder moderner pascal Variante (Delphi) lassen Sie dynamische (Runtime-Größe) Arrays erstellen.

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top