这可能是一个初学者的问题。比如说,在下面的方法中,我们使用数组alpha和theta,它们作为参数传递给函数 gsl_ran_dirichlet ,函数计算新的theta值并更新相同的数组 theta < / b>。
现在,问题在于我将无法在类中初始化theta,如下面的代码段所示。相反,我将不得不使用指向数组 theta 和 alpha 的指针。我如何将这些数组指针作为参数传递给方法 gsl_ran_dirichlet ?
我知道不可能将指针作为参数传递给需要数组作为参数的方法。但是实现这一目标的最佳方法是什么(假设我们无法修改 gsl_ran_dirichlet )?
void test (){
double alpha[2] = { 1, 1};
double theta[2] = { 1, 1};
const gsl_rng_type * T;
gsl_rng * r;
gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc(T);
gsl_ran_dirichlet(r, 2, alpha, theta);
cout << theta[0] << "," << theta[1] << endl;
gsl_rng_free(r);
}
结果:
0.4,0.6
现在,我还在以下代码中添加了函数和错误,其中数组是动态加载的:
void test() {
double *alpha, *theta;
alpha = new double[3];
theta = new double[3];
for(int i=0; i<3; ++i){
alpha = 1;
theta = 1;
}
const gsl_rng_type * T;
gsl_rng * r;
gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc(T);
gsl_ran_dirichlet(r, 3, alpha, theta);
cout << theta[0] << "," << theta[1] << "," << theta[2] << ":";
gsl_rng_free(r);
}
错误:
../test.cpp:56:11: error: invalid conversion from ‘int’ to ‘double*’ [-fpermissive]
../test.cpp:57:11: error: invalid conversion from ‘int’ to ‘double*’ [-fpermissive]
make: *** [test.o] Error 1
答案 0 :(得分:2)
一般:
&variable
。*pointer
。具体:
可以以相同的方式使用数组的名称和指向数组的指针,即theta[0]
和pointer_to_theta[0]
是等效的。
int foo[2] = { 1, 2 };
int * pointer_to_foo = foo;
assert( foo[1] == pointer_to_foo[1] );
答案 1 :(得分:2)
你的问题与调用函数无关。
只是你的
for(int i=0; i<3; ++i){
alpha = 1;
theta = 1;
}
错了。
alpha
是double*
,您无法为其分配int
(1)。
你要做的是
alpha[i] = 1;
或
*(alpha + i) = 1
和!请学习阅读错误信息。错误消息中有一个行号,它指向您发生问题的位置。如果你查看第56和57行,你应该能够自己找到它
答案 2 :(得分:1)
尝试将for
循环中的分配更改为
alpha[i] = 1;
theta[i] = 1;
答案 3 :(得分:0)
double* alpha;
double* tetha;
void foo()
{
double (&refToAlpha)[2] = reinterpret_cast<double(&)[2]> (alpha);
double (&refToTetha)[2] = reinterpret_cast<double(&)[2]> (tetha);
...
gsl_ran_dirichlet(r, 2, refToAlpha, refToTetha);
}
答案 4 :(得分:0)
编译错误很简单:您将int
分配给指针指向 - double
。
for( int i=0; i < 3; ++i ) {
alpha[i] = i; // dereference before assignment
}
函数的“如何传递数组”有点复杂。遗留和C兼容代码传递指向数组的指针以及它的大小(foo( int* values, size_t size)
)是很常见的。
如果您有选择的自由,您更愿意使用标准集合(即std::vector<double>
)(以及iota
等算法):
std::vector<double> alpha, theta;
std::iota(begin(alpha), end(alpha));
std::iota(begin(theta), end(theta));
并通过const引用传递集合 如果您希望函数读取它们,按值,如果您希望函数拥有副本,通过引用如果你想让函数改变参数(即输出参数)。
void gsl_ran_dirichlet(
std::vector<double> &r, // though I prefer output args to come last
int i,
const std::vector<double> &alpha,
const std::vector<double> &theta);
答案 5 :(得分:0)
代码中的问题与将数组传递给函数无关。
在For循环中,尝试将指针(double *)设置为整数(1),这是编译错误的原因。
您必须使用[]来设置数组的位置以设置值。
for(int i=0; i<3; ++i){
alpha[i] = 1.0;
theta[i] = 1.0;
}
这与普通指针相同。要设置指针的值,您必须取消引用地址。
int* x = new int();
*x = 5;