提问人:Kay Steinhoff 提问时间:12/30/2022 最后编辑:Adrian MoleKay Steinhoff 更新时间:12/30/2022 访问量:52
将指针指向 struct 会导致表达式语法错误
Directing pointer to struct causes expression syntax error
问:
这可能是一个完全明显的错误,但我无法弄清楚为什么下面的代码不起作用。我对 C 相当不熟悉,尽管我已经使用它制作了一些程序。
我正在使用 Turbo C (v.3.2),所以这也可能是问题所在;但是,我不确定。
static struct sector
{
float floor, ceil;
vec2 *verts;
signed char *neighbors;
unsigned npoints;
}*sectors = NULL;
static unsigned NumSectors = 0;
static struct player
{
vec3 position, velocity;
float anlge, anglesin, anglecos, yaw;
unsigned sector;
}player;
void DrawScreen()
{
enum{ MaxQueue = 32 };
unsigned s = 0;
struct item { int sectorno,sx1, sx2; } queue[MaxQueue], *head=queue, *tail=queue;
int ytop[W]={0}, ybottom[W], *renderedsectors = (int*)malloc(NumSectors*sizeof(int));
for(s = 0; s < W; ++s) ybottom[s] = H-1;
for(s = 0; s < NumSectors; ++s) renderedsectors[s] = 0;
//This line causes an Expression syntax error.
//From my understanding the pointer is moved to this structure inside the array.
//Corrections welcome as I want to learn c more in order to
//use it in more projects of mine.
*head = (struct item) { player.sector, 0, W-1 };
if(++head == queue+MaxQueue) head = queue;
do{
const struct item now = *tail;
const struct sector* const sect = §ors[now.sectorno];
if(++tail == queue+MaxQueue) tail = queue;
if(renderedsectors[now.sectorno] & 0x21) continue;
++renderedsectors[now.sectorno];
for(s = 0; s < sect->npoints; ++s)
{
}
}while(head != tail);
}
我知道 Turbo C 的时代,但我必须使用它,因为它在 DOSBox 中运行,我的最终可执行文件必须在那里工作。
我正在从这个网站复制代码,我很确定他使用了另一个编译器,它可能也更新了。
我很少使用 C,我主要在空闲时间使用 C++ 或在工作中使用 C#,但由于我面临的限制,我现在需要使用它。
答:
1赞
Adrian Mole
12/30/2022
#1
导致错误消息的代码行(如下所示)使用的是所谓的复合文字。这允许从初始值设定项列表(大括号内)中提供的数据构造括号中指定类型的匿名对象。
*head = (struct item) { player.sector, 0, W-1 };
你面临的问题是,这个结构只是在标准的“C99”(正式名称为ISO/IEC 9899:1999)版本中被合并到C语言中,顾名思义,该版本是在1999年发布的。
但是,您使用的编译器(Turbo C,v3.2)是在 1993 年左右发布的,因此几乎可以肯定它不支持此功能。(一些 1999 年之前的编译器可能支持复合文字作为扩展,但我怀疑 Turbo C 是否是其中之一。
您可以采取两种措施来规避该错误:
- 使用更现代(即不到 20 年)的编译器。
- 创建一个显式的临时结构,并将其分配给目标:
*head
struct item temp = { player.sector, 0, W - 1 };
*head = temp;
请注意,在第二种情况下,变量的作用域(和生存期)将与复合文本创建的匿名对象相同。temp
评论