Comment implémenter les opérations Matrix en Pascal?
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!
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.