Нечетное: @myRecordArray [0] возвращает неверный указатель, если размер массива превышает 4136 - PullRequest
1 голос
/ 28 сентября 2010

это действительно странно, у меня есть массив в Delphi и я заполняю его матрицами DirectX.затем я получаю указатель на первый элемент и передаю его через com на c # управляемый код:

function TMPlugTransformInPin.GetMatrixPointer(out SliceCount: Integer; out
    ValueP: Int64): HResult;
var
  matrices: array of TD3DMatrix;
  i: Integer;
begin
  SliceCount := UserSliceCount;

  //make a temp array of all matrices
  SetLength(matrices, SliceCount);
  for i := 0 to SliceCount - 1 do
    matrices[i] := FTransformManager.ModelMatrix[i];

  //return a pointer to the first matrices cell [0,0]
  if SliceCount = 0 then
    ValueP := 0
  else
    ValueP := Int64(@matrices[0]);

  Result := S_OK;
end;

на управляемой стороне код выглядит так:размер массива до 4136 (66176 с плавающей запятой), но при большем количестве указатель на массив становится недействительным ..

есть идеи?

спасибо большое!thalm

1 Ответ

6 голосов
/ 28 сентября 2010

Ваша переменная matrices является локальным динамическим массивом. В конце функции счетчик ссылок массива уменьшается до нуля, а массив уничтожается. Указатель, который вы сохранили в ValueP, недействителен независимо от размера массива. Тот факт, что он работает для меньших значений, просто означает, что вам не повезло. (Если бы вам повезло, код каждый раз падал бы, что является большим признаком того, что ваш код неправильный, чем когда он иногда падает.)

Вам нужно найти другой способ управления временем жизни этого массива. Это должно будет принадлежать чему-то большему, чем просто эта функция. Возможно, вы можете вернуть сам массив из этой функции, или вы можете сделать переменную matrices полем класса вместо локальной переменной. Или вы можете просто вернуть @FTransformManager.ModelMatrix[0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...