簡體   English   中英

C ++函數返回帶偏移量的數組

[英]c++ function returns array with offset

我正在使用一些與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的數組,那么在某個時候您會引入難以發現的錯誤。

你想做這樣的事情嗎? 數組從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;
   }

如果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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM