C++ 函数返回带有偏移量的数组

c++ function returns array with offset

本文关键字:偏移量 数组 函数 返回 C++      更新时间:2023-10-16

我正在使用一些与Fortran接口的C代码(不是我自己的),并坚持所有数组都是基于1的。我有一个返回(指针指向)一个数组的方法,我必须正确排列该数组。以下作品:

double* a;
...
a = returnedArray(arraySize);

现在我需要的是让返回对齐 a[1]、a[2]、...相反。(当然,我可以手动转移内容,但必须有更好的方法。我试图让编译器接受

a[1] =  returnedArray(arraySize);
*(a+1) = ...

和其他几种排列,但没有成功。网络搜索也没有给我任何有用的东西。

尝试:

 `a=returnedArray(arraySize)-1;`

您无法更改 returnedArray() 返回指向数组第一个元素的指针这一事实。而在 C 数组中,第一个元素不可避免地是索引 0。

但是,如果您在使用指针之前将指针偏移一个元素,也许您会实现您的目标?

double * a;
...
a = returnedArray(arraySize) - 1;
...
double firstValue = a[1];

但是,我强烈建议您坚持使用索引 0 作为第一个元素,并以其他方式修复与 Fortran 的接口。当然,在某些时候,如果您继续在代码中混合从 0 开始和从 1 开始的数组,您将引入一个难以发现的错误。

你想做这样的事情吗?数组 A 从选项卡开始[1]

   double tab[10];
   for(int i = 0 ; i < 10 ; i++){
    tab[i] = i;
   }
   double *a = &tab[1];
   for(int i =0 ; i < 9 ; i++){
    cout << a[i] << endl;
   }

如果 Fortran 和 C 之间的内存是共享的(例如,未复制),则无法自行更改内置 C 类型的索引。但是,您可以为从 Fortran 返回的数组创建一个包装器,这将使访问它们更加方便,并非常清楚地区分 1 索引和 0 索引之间的区别。例如:

class FortranArrayWrapper
{
public:
   FortranArrayWrapper(double* a) : A(a) { }
   operator double* () const 
   {
      return &A[1];
   }
   double* A;
};
FortranArrayWrapper a(returnedArray(arraySize));
a[0] = ...; // Index 1 in the array returnedArray, ie. first element in the Fortran array.
a.A[0] = ...; // Actually index '0', unused by Fortran.