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 中的指针“不可访问”的主要内容,如果未能解决你的问题,请参考以下文章

使用指针替换cpp中字符串中的字符

空指针不指向 cpp 中的 0x0 位置

使用指针访问 cpp 中的私有值

c_cpp C ++中的char指针示例

c_cpp c中的void指针练习

c_cpp c中的基本函数指针示例