C++ 我需要动态地指定数组的大小

C++ 我需要动态地指定数组的大小,c++,arrays,function,C++,Arrays,Function,我有一个Nx3数组,我需要将它作为函数填充(所以向量不是一个选项)。我已经知道N有多大,因为我把它作为一个参数输入函数。我仍然会犯“必须有一个常量”的愚蠢错误,我的代码是: double bspline_plot(double CP[], double Knot[], const int N, int d, int ncontrol, double *A){ // CP are the control points //Knot is the knot vector //

我有一个Nx3数组,我需要将它作为函数填充(所以向量不是一个选项)。我已经知道N有多大,因为我把它作为一个参数输入函数。我仍然会犯“必须有一个常量”的愚蠢错误,我的代码是:

double bspline_plot(double CP[], double Knot[], const int N, int d, int ncontrol, double *A){
    // CP are the control points
    //Knot is the knot vector
    //N is the number of internal point you want in each segment
    //d is the degree of the polynomials
    double min_x, max_x, dx;
    double *x_1;
    x_1 = new double[N];
    double A[N][2];
    int i, j, M, L;
    min_x = min(Knot);
    max_x = max(Knot);
    dx = (max_x - min_x) / N;
    for (i = 0; i <= N; i = i + 1)
    {
        x_1[i] = min_x + dx*i;
    }

    M = ncontrol;
    L = (sizeof(Knot) / sizeof(*Knot)); 
    if (L < d + M + 1) // This checks if the number of control points are positive
    {
        printf("Incorrectly defined knot vector\n");
        return;
    }
    else //This is the Cox - deBoor algorithm
    {
        for (i = 0; i <= N; i = i + 1)
        {
            for (j = 0; j <= L - 1; j = j + 1)
            {
                A[i][1] = A[i][1] + CP[j, 1] * CdB(j, d, x_1[i], Knot);
                A[i][2] = A[i][2] + CP[j, 2] * CdB(j, d, x_1[i], Knot);
                A[i][3] = A[i][3] + CP[j, 3] * CdB(j, d, x_1[i], Knot);
            }
            A[N][1] = CP[L, 2];
            A[N][2] = CP[L, 2];
            A[N][3] = CP[L, 1];
        }
    }
    return A;
}
双bspline_图(双CP[],双结[],常数int N,int d,int控制,双*A){
//CP是控制点
//结是结向量
//N是每个线段中所需的内部点的数量
//d是多项式的阶数
双最小值x,最大值x,dx;
双*x_1;
x_1=新的双精度[N];
双A[N][2];
int i,j,M,L;
min_x=min(结);
max_x=max(结);
dx=(max_x-min_x)/N;

对于(i=0;i从快速检查),C++代码中的问题似乎是以下数组声明:

double A[N][2];
您需要按如下方式动态分配此二维阵列:

double** A = new double*[N];
for (int i=0; i<N; ++i)
    A[i] = new double[2];
double**A=新的double*[N];

对于(int i=0;i从快速检查)中,C++代码中的问题似乎是以下数组声明:

double A[N][2];
您需要按如下方式动态分配此二维阵列:

double** A = new double*[N];
for (int i=0; i<N; ++i)
    A[i] = new double[2];
double**A=新的double*[N];

对于(int i=0;i请尝试以以下方式使用std::vector:

std::vector<std::vector<double>> A( N );
for( auto& row : A )
  row.resize( M );
std::向量A(N);
用于(自动和行:A)
行。调整大小(M);

std::vector A(N,std::vector(M));

尝试以以下方式使用std::vector:

std::vector<std::vector<double>> A( N );
for( auto& row : A )
  row.resize( M );
std::向量A(N);
用于(自动和行:A)
行。调整大小(M);

std::vector A(N,std::vector(M));


最后,我不得不将A拆分为三个向量,并将函数的输出从double更改为void,然后读取(现在)三个向量为double*。然后我可以更改向量的内容,现在它没有显示错误。

最后,我不得不将一个向量拆分为三个向量,并将函数的输出从double更改为void,然后读取(现在)三个向量为双*。然后,我可以改变向量的内容,现在它没有显示错误。

@ FrimBru虽然<代码> MalOC 在C++中有有效的使用,但它不应该是“to to”的解决方案,而应该使用<代码> < < /代码>(或者更好的是,<代码> STD::数组< /COD>或<代码> STD::vector < /代码>).Matthew,我不清楚为什么不能使用
std::vector
(“作为函数填充”对我来说没有任何意义)。您可以通过调用
&myvec[0]
myvec.data()传递指向向量数据的指针,将其用作C样式数组参数在C++ 11中,自然地,你可以保证你不会在函数中超出界限。@你是正确的,我用C工作,并且知道一些C++,这就是为什么我在C++中使用大量C语言的原因。<代码> vector不是一个选项< /COD>……<代码>向量< /> >总是C++中的一个选项。大多数时候是正确的。我宁愿选择一个。虚文向量.@ FuffBRU虽然 MalOC4/COD>在C++中有有效的用法,但不应该是“to to”的解决方案,而应该使用<代码> < < /代码>(或者更好的是,<代码> STD::数组< /COD>或<代码> STD::vector < /代码>)。马修,我不清楚为什么不能使用<代码> STD::vector < /代码>(“填充为函数”)您可以通过调用
&myvec[0]
myvec.data()传递指向向量数据的指针,将其用作C样式数组参数在C++ 11中,自然地,你可以保证你不会在函数中超出界限。@你是正确的,我用C工作,并且知道一些C++,这就是为什么我在C++中使用大量C语言的原因。<代码> vector不是一个选项< /COD>……<代码>向量< /> >总是C++中的一个选项。大多数时候是正确的。我宁愿选择一个。void vector。我不认为vector是处理这些事情的正确方法,我会避免像瘟疫一样调整大小。@MatthewHunt:
vector
绝对是管理动态数组的正确方法。另一种方法是处理原始指针,记住分配的大小,并花费许多长夜调试内存泄漏和更糟的情况。如果你说所以,我宁愿避免它。我不认为vector是处理这些事情的正确方法,我也会避免像瘟疫一样调整大小。@MatthewHunt:
vector
绝对是管理动态数组的正确方法。另一种方法是处理原始指针,记住分配的大小,并花很多长夜调试内存泄漏d更糟。如果你这么说,但我宁愿避免。它是说*double类型的值不能分配给type double。你说这个注释是什么意思?确切地说,当我输入这个代码时,我得到了一条我描述的错误消息。它是说*double类型的值不能分配给type double。你说这个注释是什么意思?确切地说当我输入这段代码时,我得到了一条我描述的错误消息。