将指针指向 struct 会导致表达式语法错误

Directing pointer to struct causes expression syntax error

提问人:Kay Steinhoff 提问时间:12/30/2022 最后编辑:Adrian MoleKay Steinhoff 更新时间:12/30/2022 访问量:52

问:

这可能是一个完全明显的错误,但我无法弄清楚为什么下面的代码不起作用。我对 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 = &sectors[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#,但由于我面临的限制,我现在需要使用它。

语法错误 表达式 turbo-c

评论

0赞 KamilCuk 12/30/2022
那么哪一行导致了错误呢?
0赞 picchiolu 12/30/2022
请提供一个最小的可重复示例
0赞 Kay Steinhoff 12/30/2022
@KamilCuk我写了评论,显示了错误发生的位置以及我理解的代码应该做什么(我自己没有写)
0赞 Kay Steinhoff 12/30/2022
@picchiolu这是一个编译器错误,如果您使用与我相同的编译器(完全或仅适用于 c 版本),您将收到它
1赞 picchiolu 12/30/2022
@KaySteinhoff好吧,vec2 和 vec3 似乎不是标准的 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 是否是其中之一。

您可以采取两种措施来规避该错误:

  1. 使用更现代(即不到 20 年)的编译器。
  2. 创建一个显式的临时结构,并将其分配给目标:*head
    struct item temp = { player.sector, 0, W - 1 };
    *head = temp;

请注意,在第二种情况下,变量的作用域(和生存期)将与复合文本创建的匿名对象相同。temp