我试图找出我的代码有什么问题。我有这个代码,所有内容都包含在内,但编译器说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);
}
}
但是,我不想发布带有五个或六个不同文件的混乱代码。
答案 0 :(得分:3)
b_t
是slow_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_struct
是const 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_u
,int16_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
对象的上下文中引用此类成员。