2016-11-06 14 views
2

У меня есть очень простой фрагмент кода, который вы можете проверить здесь:Как бросить и передать аргумент правильно в Дельфах

type 
    TMatrix = array of array of Byte; 
    PMatrix = ^TMatrix; 

const 
testarray:array [0..2,0..2] of Byte=(
(1,2,3), (4,5,6), (7,8,9)); 

function PickValue(input:PMatrix):Byte; 
begin 
    Result:=input^[1,3]; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Showmessage(inttostr(PickValue(@testarray))); 
end; 

end. 

Как я могу бросить testarray правильно передать его функции PickValue? Выше код сбой в его текущей форме. Я использую delphi 2007.

Заранее спасибо!

+0

Помогает ли вам индексировать testarray как 1..3,1..3? Я не понимаю, зачем вам это нужно, но, может быть, это поможет некоторым читателям понять? –

+0

См. Также [Передача статических массивов в качестве параметров для динамических массивов в Delphi] (http://stackoverflow.com/q/1593535/576719). –

ответ

7

Вы не можете использовать этот статический массив как динамический массив. Эти типы просто несовместимы. Статический массив выложен в одном непрерывном блоке памяти. Динамический массив имеет косвенное отношение к массивам с переменным размером в каждом измерении. По сути дела, это ^^Byte с дополнительным управлением компилятором и метаданными. Никакое количество кастингов вам не поможет.

У вас есть, по крайней мере, следующие параметры:

  1. Скопируйте содержимое статического массива в динамический массив. Затем передайте этот динамический массив вашей функции.
  2. Переключите ваш статический массив в динамический массив, чтобы преобразование не требовалось.
  3. Упорядочить, что ваша функция принимает статические массивы, а не динамические массивы, чтобы избежать необходимости преобразования.
  4. Имейте функцию принять указатель на первый элемент и внутреннее измерение. Затем выполните индексирование вручную. Элемент i,j имеет линейное смещение i*innerDim + j.

Ваш тип указателя PMatrix, вероятно, не требуется. Динамические массивы уже реализованы как указатели. Это, похоже, слишком далеко.

Конечно, просить элемент 3, когда индексы массива идут только до 2, неверны, но это в настоящее время меньше ваших проблем. Помните, что динамические массивы основаны на нулевом значении, и вы указали нулевое значение для своего статического массива.

Я изо всех сил стараюсь рекомендовать, какое решение лучше, поскольку я не понимаю ваши реальные цели и использование на основе упрощенного примера, представленного здесь.

+0

В принципе, я бы хотел передать 2 массива 2dimension в функцию, но размер размеров отличается. Первая матрица равна 0,15,0,15 размерности, а вторая - 0..4,0..4. – unknown1

+0

Варианты 2 и 4 кажутся наиболее подходящими –

 Смежные вопросы

  • Нет связанных вопросов^_^