编译时的数组大小分配,期望值恒定

时间:2014-07-02 12:40:52

标签: c++

// testing1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <iostream>
#include<conio.h>

using namespace std;


struct Data_point {
  double  x;
  double  y;
};


    void PlotThis(unsigned int n ) 
{
    Data_point graph[n];  //shows error here 

    //do something else, dont worry about that  
}


int main ()

{

unsigned int nSamples;  
cout << "Please enter nSamples: ";
cin >> nSamples;
PlotThis(nSamples);
return 0; 

}

这在编译时显示错误:

Error   1   error C2057: expected constant expression testing1.cpp  23

Error   2   error C2466: cannot allocate an array of constant size 0 testing1.cpp   23

Error   3   error C2133: 'graph' : unknown size  testing1.cpp   23

第23行是Data_point graph [n]; //在这里显示错误

即使我从main()传递值,它也显示未知大小。它要求编译时的值(图形的大小,即n)。这是否意味着数组大小分配在编译时发生?如何解决这个问题

2 个答案:

答案 0 :(得分:3)

C++不支持在运行时确定大小的数组。您可以切换到使用Vector类。

std::vector<Data_point > graph;

要遵循您正在使用的逻辑:在PlotThis中,您可以使用std::vector::resize调整容器大小以包含n元素。

void PlotThis(unsigned int n){
    graph.resize(n); // Resize Vector container
    ...

还有std::vector

"compared to arrays, vectors consume more memory in exchange for 
 the ability to manage storage and grow dynamically in an efficient way."

这意味着您可以选择不用担心指定vector的大小,只需添加元素即可。因此,您可以通过循环确定方法中添加了多少元素(n) - 可以使用std::vector::push_back。如果您这样做,那么只需确保在某个时候清除vector,这样您就不会重复使用旧数据 - 可以使用std::vector::clear

答案 1 :(得分:0)

你可以使用一些容器,例如vector,deque等......

void PlotThis(unsigned int n) 
{
    std::vector<Data_point> graph(n);

    //do something else, dont worry about that  
}

或动态为数组分配内存:

//C++
void PlotThis(unsigned int n) 
{
    Data_point* graph = new Data_point[n];

    //do something else, dont worry about that  

    //Remember to free memory
    delete graph;
}


//C
void plot_this(unsigned int n) 
{
    Data_point* graph = (Data_point*) malloc(sizeof(Data_point) * n);

    //do something else, dont worry about that  

    //Remember to free memory
    free(graph);
}