【问题标题】:Pass array in c++ function在 C++ 函数中传递数组
【发布时间】:2016-03-04 17:05:45
【问题描述】:

我想问一个问题:我想写一个可以传递数组的函数,然后该函数可以从用户那里读取值并填充数组。

但实际上在每个新问题中我都有不同类型的数组。有时它是 int,有时它也可能是 long unsigned。

所以我写了这样的代码:

#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];
}

但是当我想运行它时,在输入五个值后,我得到一个运行时错误。它不会在屏幕上打印任何内容。我该如何解决?或者还有其他方法吗?任何帮助将不胜感激..谢谢

【问题讨论】:

  • 也许你应该了解 C++ 模板。但不太确定你在问什么。
  • 强行将 int x[5]; 转换为 long long* 会使您的行为未定义。
  • 非常感谢大家...感谢大家的帮助

标签: c++ arrays function pointers


【解决方案1】:

由于您使用的是 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];
    }
}

如果您想将此用于 any 类型,则必须使用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())
}

【讨论】:

  • 你忘记了f中数组的大小。
  • 另外,由于 std::array 存储了它的大小,您不需要传递大小信息。
  • @Jarod42 不确定你的意思。只是不检查大小(试图使其与 OP 的代码相似)。
  • @NathanOliver 如果只想在数组的子集上运行f 怎么办?我们这里不是读心者,这是他以前的,我只是想让它尽可能地与 OP 的代码相似。
  • 非常感谢...现在我可以理解发生了什么...谢谢
【解决方案2】:

x 定义为 5 个ints 的数组。当您调用f 时,您将x 转换为MY_TYPE*,即long long。如果是sizeof(int) != sizeof(long long),那么当您在f 中遍历数组时,您要么对元素的内容进行切片,要么离开数组的末尾。如果您将x 更改为MY_TYPE x [5],那么它应该可以正常工作。

【讨论】:

  • 非常感谢您的帮助
【解决方案3】:

您定义了一个 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];
}

【讨论】:

  • 感谢您的帮助和感谢...现在完成了
猜你喜欢
  • 2014-07-01
  • 2018-11-14
  • 2015-01-12
  • 2013-06-26
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多