为什么将变量的地址赋给指针是错误的?

时间:2015-10-21 14:43:48

标签: c

我试图找出我的代码有什么问题。我有这个代码,所有内容都包含在内,但编译器说Symbol 'b_t' could not be resolved

#ifndef slow_CAL_H
#define slow_CAL_H

/* slow Struct data */
typedef struct slow_struct_tag {
    const int16_T b_t[7]; 
} slow_struct_type;

extern const slow_struct_type slow_struct;
extern const slow_struct_type *slow_struct;
#endif

slow_private.h

#ifndef slow_private_h_
#define slow_private_h_
#include "slow_cal.h"

#endif 

slow.c

#include "slow.h"
#include "slow_private.h"

int main() {
    foo(&b_t[0]);
    return 0;
}

void foo(int16_T *pY) {
    *pY++;
}

这个foo()不是真正的功能,真正的功能如下:

void INTERPOLATE_S16_S16_ZERO(int16_T *pY, int16_T yL, int16_T yR,
int16_T  x, int16_T xL, int16_T xR)
{
    int32_T bigProd;
    int16_T yDiff;
    int16_T xNum;
    int16_T xDen;
    *pY = yL;

    /* If x is not strictly between xR and xL
    * then an interpolation calculation is not necessary x == xL
    * or not valid.  The invalid situation is expected when the input
    * is beyond the left or right end of the table.  The design is
    * that yL holds the correct value for *pY
    * in invalid situations.
    */
    if ((xR > xL) && (x > xL) ) {
        xDen = xR;
        xDen = (int16_T)(xDen - xL);
        xNum = x;
        xNum = (int16_T)(xNum - xL);
        yDiff = yR;
        yDiff = (int16_T)(yDiff - yL);
        bigProd = yDiff * xNum;
        yDiff = div_s16s32(bigProd, (int32_T)xDen);
        *pY = (int16_T)(*pY + yDiff);
     }
}

但是,我不想发布带有五个或六个不同文件的混乱代码。

2 个答案:

答案 0 :(得分:3)

b_tslow_struct_type成员,因此在任何slow_struct_type存在之前,您首先需要b_t类型的对象。< / p>

即便如此,你也会通过持有它的对象引用b_t,即

    如果x.b_t类型为x,或,则为
  • slow_struct_type 如果x->b_t的类型为x,则
  • slow_struct_type*

之后,您将必须使用不同类型修复slow_struct的多个声明:

extern const slow_struct_type slow_struct;
extern const slow_struct_type *slow_struct;

您不能同时拥有两者:slow_structconst slow_struct_type *,或const slow_struct_type,但不是两者。

答案 1 :(得分:1)

您的代码严重破坏,无法编译。或许你真正想问的问题归结为:

#include <stdint.h>

/* slow Struct data */
typedef struct slow_struct_tag {
    const int16_t b_t[7]; 
} slow_struct_type;

extern const slow_struct_type slow_struct;

void foo(int16_t *pY);

int main() {
    foo(&slow_struct.b_t[0]);
    return 0;
}

void foo(int16_t *pY) {
    *pY++;
}

相对于您的代码,它消除了缺少的标头(slow.h),更正了数据类型(int16_uint16_T - &gt; int16_t),包括{{1对于stdint.h的声明,删除全局变量int16_t的重复声明,使slow_struct的原型在foo()中可见,并在调用main()使用foo()代替裸slow_struct.b_t(在您提供的任何代码中都不存在)。

即使在这种情况下,问题仍然存在。虽然可以使用指向b_t成员的指针作为函数参数,但上面的特定用法不是struct - 正确。因此,如果编译器接受它(这在某种程度上取决于编译选项)那么它可能会在运行时中断,如果没有,那么它将产生const变量的惊人效果。价值在变化。

另请注意,在这种特殊情况下,const相当冗长,因为在上下文中它意味着与&slow_struct.b_t[0]完全相同。此外,该代码在初始化之前使用全局变量slow_struct.b_t(间接通过slow_struct中的*pY++),因此表现出未定义的行为。

<强>更新

关于修改为问题的特定错误消息,&#34;符号&#39; b_t&#39;无法解决&#34;,问题就是我已经说过的:在您呈现的代码中没有声明任何变量foo()。类型b_t具有该名称的成员,但您只能在整个slow_struct_type对象的上下文中引用此类成员。