2016-12-14 80 views
1

我自學自己從書中編程。目前的任務是我必須通過一個不返回任何內容的函數(我假設的一個void函數)來將一個帶有兩個下標的數組放在一起,並遞歸地打印每個元素。將一個數組傳遞給void函數,並遞歸地打印元素

#include <iostream> 
#include <array> 
#include <iomanip> 
#include <string> 
#include <cstddef> 

using namespace std; 

void printArray (int source, int a, int b){ 
    if (a < b){ 
     cout << source[a] << " "; 
     printArray(source, a + 1, b); 
     } 
} 

int main(){ 
    const array<int, 10> theSource = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    int al = 0; 
    int bl = theSource.size(); 

    printArray(theSource, al, bl); 
} 

當我試圖做到這一點,我得到兩個錯誤。

11|error: invalid types 'int[int]' for array subscript| 
22|error: cannot convert 'const std::array<int, 10u>' to 'int' for argument '1' to 'void printArray(int, int, int)'| 

所以我試圖改變空隙...

void printArray (int source[], int a, int b) 

,也...

void printArray (int *source, int a, int b){ 

但仍然得到錯誤...

22|error: cannot convert 'const std::array<int, 10u>' to 'int' for argument '1' to 'void printArray(int, int, int)'| 

是否有不同的方式來通過函數放置數組?

任務是...

(打印數組)編寫遞歸函數printArray接受一個數組,起始標和結束下標作爲參數,返回任何內容並打印陣列。當起始下標等於結尾下標時,該函數應停止處理並返回。

+0

您也可以使用模板來推導出數組邊界。 std :: array和c樣式數組是可能的。也許比你的任務更先進一些,但更安全。 –

回答

3

更改簽名:

void printArray (const array<int, 10> &source, int a, int b) 

這是編譯器想要的東西! :)

+0

哦哇,工作。非常感謝你。對不起,如果它看起來像一個愚蠢的問題。當計時器讓我看到時,我會將其標記爲正確。 – Greg

+0

這有效,但你定義的數組只有9個值,所以它打印出第10個元素 – Steve

+0

這個值爲0,這個值並不重要,我認爲。在數組初始化爲undefined的元素爲0時,我只是匆匆地把一些數字放在那裏,這樣我就不會一次又一次地看到0。 – Greg

4

我認爲你用C風格的「陣列」糾結了std::array。如果你改變theSource的定義

const int theSource[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

那麼無論最後兩種形式就可以了(只要你修復常量性,該編譯器會抱怨),因爲theArray的類型是const int的數組,而可以傳遞給一個正在尋找const int*的函數。

當某人使用數組作爲遞歸練習時,幾乎可以肯定他們在尋找什麼。

當然,對於真實 C++,​​是比較合適的,並且應該被傳遞到期望const std::array<int, 10>&作爲第一個參數的函數。

template<typename T, size_t S> 
std::ostream& operator<<(std::ostream& stream, const std::array<T,S>& ary) { 
    for(const auto e& : ary){ 
    stream << e << " "; 
    } 
    return stream; 
} 

此模板將與任何std::array其元素可以工作:

+0

謝謝。這是寶貴的建議,我會加入。我知道const使它保持不變,這在將數組傳遞給函數時非常有用。我在這上面花了很多時間是一種遺憾,因爲這本書並沒有給我一個很好的答案。 – Greg

0

當你這樣做遞歸的事情數組作爲一項學術活動,還可以方便地通過重載<<運營商通過std::arraycout<<'d至cout

cout << theSource << endl;