C++ 我需要动态地指定数组的大小
我有一个Nx3数组,我需要将它作为函数填充(所以向量不是一个选项)。我已经知道N有多大,因为我把它作为一个参数输入函数。我仍然会犯“必须有一个常量”的愚蠢错误,我的代码是: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 //
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。你说这个注释是什么意思?确切地说当我输入这段代码时,我得到了一条我描述的错误消息。