Передача Статических массивов как параметры для Динамических массивов в Delphi

В LISP часто существует требование использовать самые слабые конструкции. Некоторые руководства по стилю скажут Вам использовать =, а не eql, когда Вы будете знать, что сравненные объекты являются числовыми, например. Идея состоит в том, чтобы часто указывать то, что Вы имеете в виду, а не программируете компьютер эффективно.

Однако могут быть фактические улучшения эффективности высказывания только, что Вы имеете в виду, и не использование более сильных конструкций. Если у Вас есть инициализации с LET, они могут быть выполнены параллельно, в то время как LET* инициализации должны быть выполнены последовательно. Я не знаю, сделают ли какие-либо реализации на самом деле это, но некоторые могут хорошо в будущем.

6
задан Billiardo Aragorn 20 October 2009 в 09:46
поделиться

4 ответа

Хотя это не совсем то, что вы хотите (по причинам, указанным в ответе Gamecat), для вас может быть жизнеспособным обходным путем инициализировать динамический массив данных:


var Data:TDoubleMatrix;
begin
  Data:=TDoubleMatrix.create(TDoubleArray.create(0,0,0,0),
                             TDoubleArray.create(0,0,1,1),
                             TDoubleArray.create(1,0,1,0),
                             TDoubleArray.create(1,1,0,0),
                             TDoubleArray.create(1,1,1,1));
end;
3
ответ дан 17 December 2019 в 18:18
поделиться

Динамические массивы отличаются от обычных массивов.

Динамические массивы - это указатели, а обычные массивы - это блоки памяти. С одномерными массивами вы можете использовать адрес массива. Но с многомерными массивами этот трюк не сработает.

В вашем случае я бы использовал файл для инициализации массива. Таким образом, вы можете использовать динамические массивы в 100% случаев. В противном случае вам придется написать собственное преобразование, которое не позволяет использовать динамические массивы.

1
ответ дан 17 December 2019 в 18:18
поделиться

Может быть, вам лучше использовать открытые массивы вместо?

-1
ответ дан 17 December 2019 в 18:18
поделиться

Вы не можете разыграть, но можете скопировать! Что-то вроде ...

    procedure CopyDMatrix(var Source; LengthX, LengthY: integer; var Dest: TDoubleMatrix);
    const
      SizeOfDouble = SizeOf(Double);
    var
      n  : integer;
      ptr: pointer;
    begin
      SetLength(Dest, LengthX);
      Ptr := @Source;
      for n := 0 to LengthX - 1 do begin
        SetLength(Dest[n], LengthY);
        Move(ptr^, Dest[n][0] , SizeOfDouble * LengthY);
        inc(cardinal(ptr), SizeOfDouble * LengthY);
      end;
    end;

    //...  

    CopyDMatrix(Data, Length(Data), Length(Data[0]), DoubleMatrix);
0
ответ дан 17 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: