CPP 中的指针“不可访问”
Posted
技术标签:
【中文标题】CPP 中的指针“不可访问”【英文标题】:Pointer "not accessible" in CPP 【发布时间】:2018-04-08 07:11:21 【问题描述】:大家早上好。
我想调用我自己的函数,它包含在一个父函数中,它将一个值插入到一个表中。
当我自己调用函数时,插值起作用。但是,当我调用同一个函数时,通过父级的 get 方法传递,程序以错误代码 -1 终止。
这是我的函数头:
class TabulatedFunction : public AbstractUnivariateFunction , public AbstractClass
public:
TabulatedFunction();
TabulatedFunction(float ** table, InterpolatorMode mode);
virtual ~TabulatedFunction();
float calculate(float* x);
void setTabulatedValues(float ** table);
float** getTabulatedValues();
InterpolatorMode getMode();
void setMode(InterpolatorMode mode);
private:
float** tabulatedValues;
InterpolatorMode mode;
;
这里是实现
float TabulatedFunction::calculate(float* xx)
float y=0.;
float x = xx[0];
// Interpolate threw the table
switch (mode)
case InterpolatorMode::LINEAR:
double diffByLow = 10000000.;
double diffByUp = -1000000.;
int iByLow = -1;
int iByUp = -1;
for(int i=0;i<sizeof(tabulatedValues[0][0]) ; i++ )
float diff = tabulatedValues[i][0] - x;
if(fabs(diff) < diffByLow && diff < 0)
diffByLow = fabs(diff);
iByLow = i;
if(fabs(diff) < diffByUp && diff > 0)
iByUp = i;
diffByUp = fabs(diff);
if(iByUp == -1)
iByLow = sizeof(tabulatedValues[0][0])-2;
iByUp = sizeof(tabulatedValues[0][0])-1;
else if(iByLow == -1)
iByLow = 0;
iByUp = 1;
cout << iByLow << endl;
y = tabulatedValues[iByLow][1] +(x - tabulatedValues[iByLow][0]) *(tabulatedValues[iByUp][1] - tabulatedValues[iByLow][1])/((tabulatedValues[iByUp][0] - tabulatedValues[iByLow][0]));
break;
case InterpolatorMode::TRIGONOMETRIC:
y=0.;
break;
default:
y=0.;
break;
return y;
然后,将函数声明到我的父级中:
class TabulatedDynamicsModel : public AbstractDynamicsModel
public:
TabulatedDynamicsModel();
virtual ~TabulatedDynamicsModel();
void setThrustVsSpeedFunction(TabulatedFunction* thrustVsSpeedFunction);
TabulatedFunction* getThrustVsSpeedFunction();
TabulatedFunction* getAttitudeFunction();
void setAttitudeFunction(TabulatedFunction* attitude);
private:
TabulatedFunction thrustVsSpeedFunction;
TabulatedFunction attitude;
;
谢谢。
【问题讨论】:
代码太多了,但我没有看到任何get
方法。将您的问题简化为重现问题并发布的最小示例。
(另请阅读minimal reproducible example)
您说代码在您以一种方式调用时有效,但在您以另一种方式调用时崩溃。但是您根本没有显示任何调用您的函数的代码。如图所示,您的代码中唯一明显的问题是 sizeof
被严重滥用。
【参考方案1】:
我认为你的问题是这一行
for(int i=0;i<sizeof(tabulatedValues[0][0]) ; i++ )
tabulatedValues
被定义为float**
和sizeof
应用于tabulatedValues[0][0]
不会给您数组第二维的元素数。
在我的计算机(gcc 64 位)上返回:
sizeof(tabulatedValues)
= sizeof(float **)
= 8
sizeof(tabulatedValues[0])
= sizeof(float *)
= 8
sizeof(tabulatedValues[0][0])
= sizeof(float)
= 4
如果将tabulatedValues
定义为float tabulatedValues[rows][cols]
,则可以使用以下方法计算第二维(cols
)的元素数:
for(int i=0;i<sizeof(tabulatedValues[0] / tabulatedValues[0][0]) ; i++ )
或者干脆
for(int i=0;i<boost::size(tabulatedValues[0]) ; i++ ) // or std::size() on C++17
但正如您使用指针一样,您应该将大小(每行的列数)作为参数提供给函数。
【讨论】:
以上是关于CPP 中的指针“不可访问”的主要内容,如果未能解决你的问题,请参考以下文章