كيفية تنفيذ عمليات مصفوفة في باسكال؟
سؤال
ولست بحاجة لتنفيذ عمليات مع المصفوفات وحجم المصفوفة قد يكون متغير. الحل الوحيد خطرت لي هو استخدام قائمة مرتبطة:
[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] ...
...
ولكن يبدو لي مجمع قليلا .. هل هناك حل أفضل (وأسهل)؟
شكرا يا رفاق!
المحلول
ونهج واحد سيكون لاستخدام GetMem لتخصيص ذاكرة بالضبط ما يكفي. GetMem يبدو بتأييد واسع.
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;
نصائح أخرى
وأي البديل باسكال الحديث (دلفي) سوف تمكنك من إنشاء الحيوي (وقت التشغيل الحجم) المصفوفات.
إذا لم لغة تدعم المصفوفات الحيوية متعددة الأبعاد يمكنك أن تأخذ الرعاية من التصدي لنفسك:
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;
وهذا النوع من معالجة سيكون أسرع بكثير من التالية القوائم المرتبطة.
لا تنتمي إلى StackOverflow