调用Function时未在此作用域中声明的数组

时间:2017-11-09 22:49:07

标签: c++ arrays

当我尝试运行我的C ++程序时,我有一些问题。 它做的是询问用户数组的大小和数组的类型,double或int,然后根据用户选择,它声明数组,然后它调用一个用用户值填充数组的函数< / p>
#include <iostream>
using namespace std;

template<class T>
void fill(T *arr,int size){
        for(int i = 0; i < size; i ++){
                cout<<"Insert value " << i << " :" ;
                cin >> arr[i];
        }
}
int main(){
        int option,size;
        cout << "Size? ";
        cin >> size;
        cout << "1 = double" << endl
        << "2 = int" << endl;
        cin >> option;
        if(option == 1){
                double arr[size];
        }
        else if(option == 2){
                int arr[size];
        }
        fill(arr,size);
return 0;
}

但是当我尝试运行它时,我收到了这个错误

  

test.cpp:在函数'int main()'中:test.cpp:24:7:错误:'arr'是   未在此范围内声明填充(arr,size);          ^

1 个答案:

答案 0 :(得分:2)

main()中,您的arr变量仅在声明它们的if()块的范围内。当if关闭}时,它们会超出范围。所以他们确实不在调用fill()的范围内。

无论如何它并不重要,因为无论如何你都不能声明一个具有多种类型的变量。因此,您无法在arr的范围内声明单个fill()数组变量,并且根据用户的数组类型为intdouble输入(好吧,除非你使用std::variantstd::any,但这是它自己的主题。)

您需要在数组在范围内的fill()块内调用if()

此外,您依赖于非标准特定于供应商的扩展,称为&#34;可变长度数组&#34;,也就是在自动(堆栈)内存中分配可变大小的数组动态(堆)内存。只有一些编译器将该扩展实现为额外功能。不要依赖它。分配可变大小数组的正确方法是使用new[]代替std::vector或更好Array.prototype.reduce

尝试更像这样的事情:

#include <iostream>
#include <vector>

template<class T>
void fill(T *arr, int size){
    for(int i = 0; i < size; i ++){
        std::cout << "Insert value " << i << " :";
        std::cin >> arr[i];
    }
}

int main(){
    int option, size;

    std::cout << "Size? ";
    std::cin >> size;
    std::cout << "1 = double" << std::endl
              << "2 = int" << std::endl;
    std::cin >> option;

    if (option == 1) {
        std::vector<double> arr(size);
        fill(&arr[0], size);
    }
    else if (option == 2) {
        std::vector<int> arr(size);
        fill(&arr[0], size);
    }

    return 0;
}