2016-03-04 102 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

谢谢你很多关于你的援助 –