引用typedef作为其struct对应物

时间:2010-10-12 05:59:30

标签: c struct nested typedef

好的,伙计们,我们都知道那里有很多typedef / struct问题,但我觉得这个问题有点令人费解。

我正在使用严格的C来模拟晶格的相邻相互作用。我有一个名为“ball_struct”的结构,我将其命名为“ball”。该struct包含一个指向ball_structs列表的指针(因为我不能在它自己的声明之前使用typedef名称),球会考虑它的邻居。

所以这里有一个问题:我想在这个ball_struct邻居列表中添加球。当我编译(在Visual Studio 2009中,没有CLR支持)时,我得到:

  

错误C2440:'=':无法从'ball *'转换为'ball_struct'

我并不感到惊讶,但我很难过。有没有办法将typedef强制转换为各自的结构?如果没有,无论如何我可以在“ball_struct”列表中添加“球”,这样我就不必删除typedef并在我的代码中粘贴“struct”关键字了吗?这是有问题的代码:

struct / typedef:

typedef struct ball_struct
{
    double mass;
    vector pos, vel, acc;

    /* keep list of neighbors and its size */
    struct ball_struct *neighbors;
    int numNeighbors;
} ball;

错误的功能:

/* adds ball reference to the neighbor list of the target */
void addNeighbor(ball *target, ball *neighbor)
{
    int n = target->numNeighbors;
    target->neighbors[n] = neighbor;     // error C2440
    target->numNeighbors = n+1;
}

谢谢,任何帮助表示赞赏。 请记住,只有C的解决方案。

1 个答案:

答案 0 :(得分:3)

在您收到错误的行:

 target->neighbors[n] = neighbor; 

您将指针(neighbor)分配给实际结构(而不​​是指向结构的指针)。请注意,如果仔细查看错误消息,您会发现这就是它所说的内容。请注意它所说的'from'类型中的星号:

cannot convert from 'ball *' to 'ball_struct'

假设target->neighbors指向一组ball_struct结构,我想你想要做的是:

 target->neighbors[n] = *neighbor; 

PS:您可能要考虑为结构使用相同的名称和结构的typedef:

typedef struct ball
{
    /* etc... */
} ball;

虽然ANSI之前的编译器可能不支持(Why are structure names different from their typedef names?),但它今天肯定得到了很好的支持。而且我认为它会让事情变得更加混乱。