Question

Je dois implémenter des opérations avec des matrices et la taille de la matrice doit être variable. La seule solution que j'ai trouvée est d'utiliser une liste chaînée:

[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] ...
     ...

Mais cela me semble un peu complexe. Existe-t-il une solution meilleure (et plus facile)?

Merci les gars!

Était-ce utile?

La solution

Une approche consisterait à utiliser GetMem pour allouer exactement suffisamment de mémoire. GetMem semble être largement pris en charge.

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;

Autres conseils

Toute variante pascal moderne (Delphi) vous permettra de créer des tableaux dynamiques (de la taille de l'exécution).

Si le langage ne prend pas en charge les tableaux dynamiques multidimensionnels, vous pouvez vous en occuper vous-même:

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;

Ce type d'adressage sera beaucoup plus rapide que les listes chaînées suivantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top