2016-03-04 92 views
-1

我想問一個問題... 我想創建一個函數...我可以將數組傳遞給它...然後函數可以讀取用戶的值並填充數組... 但實際上在每一個新的問題,我有deffirent型array..sometimes它爲int ...有時它可能是也早就無符號......所以我做了這樣的代碼:在C++函數中傳遞數組

#include <iostream> 
#define MY_TYPE long long 
using namespace std; 
void f(MY_TYPE a[ ],MY_TYPE min,MY_TYPE max) 
{ 
    MY_TYPE i; 
    for(i=min;i<max;i++) 
     cin>>a[i]; 
} 

int main() 
{ 
int x [5], i; 
f ((MY_TYPE*) x,(MY_TYPE) 0,(MY_TYPE) 5); 
for(i=0;i<5;i++) cout<< x[i]; 
} 

但是當我想運行這個......鍵入五個值後......運行時錯誤發生......並且它在屏幕上什麼都不打印......我該如何解決它...?或者是否存在任何其他方式??任何幫助將不勝感激...感謝

+0

也許你應該學習C++模板。但不太清楚你在做什麼。 –

+3

強制將'int x [5];'強制轉換爲'long long *'會導致未定義的行爲。 –

+0

我非常感謝你......謝謝你的幫助 –

回答

3

由於您使用的是C++,而不是C,因此您應該使用C++容器。

#include <array> 

void f(std::array<int, 5>& a, size_t start, size_t end) 
{ 
    for (auto i = min; i < max; ++i) 
    { 
     cin >> a[i]; 
    } 
} 

如果你想用這個任何類型,你必須使用一個template。現在

template<typename T, size_t N> 
void f(std::array<T, N>& a, size_t start, size_t end) 
{ 
    for(auto i = min; i < max; ++i) 
    { 
     cin >> a[i]; 
    } 
} 

,你可以這樣做:

int main() 
{ 
    std::array<int, 5> integers; 
    std::array<float, 10> floats; 

    f(integers, 0, integers.size()) 
    f(floats, 0, floats.size()) 
} 
+0

你在'f'中忘記了數組的大小。 – Jarod42

+1

此外,由於'std :: array'存儲了它的大小,所以不需要傳遞大小信息。 – NathanOliver

+0

@ Jarod42不確定你的意思。大小沒有被檢查(試圖保持它與OP的代碼類似)。 –

0

您定義的int陣列。

int x [5], i; 

,然後繼續使用它,就好像它是MY_TYPE數組:

f ((MY_TYPE*) x,(MY_TYPE) 0,(MY_TYPE) 5); 

由於sizeof(int)小於在代碼sizeof(MY_TYPE),這將導致訪問存儲器超出有效範圍,這導致未定義的行爲。在你的情況下,UB表現爲運行時錯誤。使用數組MY_TYPE而不是int的數組。

MY_TYPE x[5], i; 
f (x, (MY_TYPE) 0, (MY_TYPE) 5); 

如果您知道如何使用函數模板,則可以使用函數模板。

template <typename T> 
void f(T a[], size_t min, size_t max) // Type of min and max should not 
{          // depend on T 
    size_t i; 
    for(i=min;i<max;i++) 
     cin>>a[i]; 
} 

int main() 
{ 
    int x [5], i; 
    f (x, 0, 5); 
    for(i=0;i<5;i++) cout<< x[i]; 
} 
+0

@ Jarod42,確實如此。 –

+0

我感謝你的幫助,感謝那......現在是做 –

1

x被定義爲5 int秒的陣列。當您致電f時,您將x轉換爲MY_TYPE*這是一個long long。如果sizeof(int) != sizeof(long long)那麼當您遍歷f中的數組時,您要麼分割元素的內容,要麼走出數組的末尾。如果您將x更改爲MY_TYPE x [5],那麼它的工作原理應該如此。

+0

謝謝你很多關於你的援助 –