2011-11-24 81 views
7

可能重複:
length of array in function argument的sizeof數組作爲函數的參數傳遞

你好我做作業,我完全地難住了。我們想獲得一個列表的每一個訂單的整數數組,所以我寫了這段代碼,根據關我的老師的僞代碼:

void permute(int v[], int curr,char letters[]) 
{ 
    if(curr >= sizeof(v)/sizeof(int)) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < sizeof(v)/sizeof(int); i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 

我不知道的唯一的事情是,如果sizeof(v)/sizeof(int)是正確的要走的路。

+3

如果你的問題是隻有約'的sizeof(V)/的sizeof(int)的',我會建議編輯問題的標題,因爲它沒有任何關係「遞歸排列」 ...... –

回答

9

sizeof(v)/sizeof(int)是不是要走的路。你的功能是正是等同於:

void permute(int *v, int curr, char *letters) 
{ 
    ... 
} 

v是不是一個真正的數組,這是一個指針。你不能在C或C++中傳遞數組。

的解決方案是以下的(並非窮舉)中的一個:

  • 添加明確地描述了該陣列的長度的額外的參數
  • 添加一個指向在所述陣列的最後一個元素的額外的參數
  • 使用合適的容器(例如std::vector),你可以在
  • 是@sehe表明
模板解決方案調用
+0

+1容器,即使是作業,他們有時也不會讓你做到「正確」的方式。 – Anthony

+0

我以爲你可以 - permute(int n [5])很好嗎?該數組並沒有被相當值的傳遞。但它是一個數組 –

+1

@Adrian:當一個數組用作函數參數時,它會衰減到一個指針。 –

5

我的一個眼中釘:你可以得到C++來推斷數組大小爲您

template <size_t N> 
void permute(int (&v)[N], int curr,char letters[]) 
{ 
    if(curr >= N) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < N; i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 
+0

非常感謝您的回答! –

0

除了奧利奇的回答是:在C典型方式++是一個指針傳遞開始和指針您要排列的序列的結尾。按照慣例,開始指針是包含性的,結束指針是獨佔的。

void permute(int *v, int *begin, int *end, char *letters) { 
    if (begin == end) { 
    checkit(v, end, letters); 
    } else { 
    ... 
    permute(v, begin + 1, end, letters); 
    ... 
    } 
}