我正在使用严格的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的解决方案。
答案 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?),但它今天肯定得到了很好的支持。而且我认为它会让事情变得更加混乱。