سؤال

ولست بحاجة لتنفيذ عمليات مع المصفوفات وحجم المصفوفة قد يكون متغير. الحل الوحيد خطرت لي هو استخدام قائمة مرتبطة:

[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;

وهذا النوع من معالجة سيكون أسرع بكثير من التالية القوائم المرتبطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top