Come implementare le operazioni Matrix in Pascal?
Domanda
Devo implementare operazioni con matrici e la dimensione della matrice deve essere variabile. L'unica soluzione che mi è venuta in mente è usare l'elenco dei link:
[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] ...
...
Ma mi sembra un po 'complesso .. Esiste una soluzione migliore (e più semplice)?
Grazie ragazzi!
Soluzione
Un approccio sarebbe quello di utilizzare GetMem per allocare memoria esattamente sufficiente. GetMem sembra ampiamente supportato.
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;
Altri suggerimenti
Qualsiasi moderna variante pascal (Delphi) ti permetterà di creare array dinamici (di runtime).
Se la lingua non supporta le matrici dinamiche multidimensionali, puoi occuparti dell'indirizzo tu stesso:
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;
Questo tipo di indirizzamento sarà molto più veloce rispetto ai seguenti elenchi collegati.