delphi возвращает массив целых чисел из функции COM-объекта - PullRequest
1 голос
/ 11 января 2011

Библиотека типов создается из C # и используется в Delphi 5.

в библиотеке типов есть метод, который возвращает массив или строку. В Delphi тот же массив строк я должен получить, но когда я скомпилировал код, появляется следующая ошибка.

Incompatible types: 'tagSAFEARRAY' and 'Array'

Вот код C #

    public int[] sqrRootUpto(int num)
    {
        int[] result={0};
        int tempVal=0;
        for (int i = 2; num < tempVal; i++)
        {
            tempVal = i * i;
            result[i] = tempVal;                
      }
        return result;

    }

Вот код Delphi, где я вызываю эти функции.

    procedure TForm1.BtnSqrtClick(Sender: TObject);
var
  num :Integer;
  result : array of Integer;
begin
      num := StrToInt(EditSqrtInput.text);
      result := newObj.sqrRootUpto(num);   //Here I am calling the above method
end; 
end.

EDIT

var
result : variant;

begin
 result := VarArrayCreate([0, 20], varInteger);

Error!! Incompatible types: 'tagSAFEARRAY' and 'Array'

TBL.pas имеет эту подпись для функции

function  TMathClass.sqrRootUpto(rNum: Integer): PSafeArray;
begin
  Result := DefaultInterface.sqrRootUpto(rNum);
end;

что такое diff ч / б TSafeArray и TSafeArray

Ответы [ 2 ]

0 голосов
/ 11 января 2011

попробуйте объявить

var
  result: TIntegerDynArray;

Редактировать: после редактирования становится ясно, что ваш метод COM возвращает PSafeArray. Самый простой способ использовать массив Integer - сначала преобразовать его в вариантный массив:

function IntSafeArrayToVarArray(const P: PSafeArray): OleVariant;
begin
  if Assigned(P) then
  begin
    VarClear(Result);
    tagVariant(Result).vt := varInteger or varArray;
    tagVariant(Result).PArray := P;
  end
  else
    Result := Null;
end;

Затем вы можете использовать эту функцию, потому что вариантный массив целых чисел совместим с присваиванием с TIntegerDynArray:

result := IntSafeArrayToVarArray(newObj.sqrRootUpto(num));
for I := Low(result) to High(Result) do ...
0 голосов
/ 11 января 2011

Уже существует запись TSafeArray, определенная в ActiveX.pas. Может быть, это может помочь вам.

...