我正在使用与Fortran接口的一些C代码(不是我自己的代码),并坚持认为所有数组都是基于1的。我有一个方法返回(指向)一个数组,我必须正确排队。以下作品:
double* a;
...
a = returnedArray(arraySize);
现在我需要的是让返回对齐[1],[2],......而不是。 (当然我可以手动转移,但必须有更好的方法。)我试图让编译器接受
a[1] = returnedArray(arraySize);
*(a+1) = ...
和其他几种排列,没有成功。网络搜索也没有给我任何有用的东西。
答案 0 :(得分:1)
尝试:
`a=returnedArray(arraySize)-1;`
答案 1 :(得分:1)
您无法更改returnedArray()
返回指向数组第一个元素的指针的事实。在C数组中,第一个元素不可避免地是索引0。
但是,如果在使用它之前将指针偏移一个元素,那么你可能会实现目标吗?
double * a;
...
a = returnedArray(arraySize) - 1;
...
double firstValue = a[1];
但是,我强烈建议你坚持使用索引0作为第一个元素,并以其他方式修复与Fortran的接口。当然,如果你在代码中继续混合使用基于0的数组和基于1的数组,那么在某些时候你会引入一个难以发现的错误。
答案 2 :(得分:0)
你想做那样的事吗? 数组从tab [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;
}
答案 3 :(得分:0)
如果正在共享Fortran和C之间的内存(例如,未复制),则无法自行更改内置C类型的索引。但是,您可以为从Fortran返回的数组创建一个包装器,这样可以更方便地访问它们,并且可以清楚地了解1-indexing和0-indexing之间的区别。例如:
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.