我想问一个问题:我想编写一个可以传递数组的函数,然后该函数可以从用户读取值并填充数组。
但实际上在每个新问题中我都有不同类型的数组。有时它是int,有时它也可能是长期未签名的。
所以我写了这样的代码:
#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 :(得分: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())
}
答案 1 :(得分:1)
x
被定义为5 int
s的数组。当您致电f
时,您将x
投放到MY_TYPE*
long long
。如果是sizeof(int) != sizeof(long long)
,那么当您遍历f
中的数组时,您要么切片元素的内容,要么离开数组的末尾。如果您将x
更改为MY_TYPE x [5]
,那么它可以正常工作。
答案 2 :(得分: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];
}