【问题标题】:Casting void pointer (while working in struct)转换 void 指针(在结构中工作时)
【发布时间】:2014-02-25 01:41:13
【问题描述】:

我对整个 C 编程非常陌生(几周),所以请放轻松 ;-)

项目详情: 我目前正在制作一个火车旅行计划系统,使用给定的火车计划来找到到特定目的地的最短路线。这是通过制作一个图、一个用于排序的二进制堆,然后是 dijkstra 算法。因此有些混乱的结构(对不起!认为熟悉它们是最好的)。

我的问题:我构建了一个链表,将数据作为 void 在结构中(使其更通用以便重用),但是当我想在使用结构时转换数据时,我得到语法错误。

结构:

typedef struct  linked_list{
    void *data;
    struct linked_list *next;
    struct linked_list *previous;
} linked_list;

还有我的,可能是明显的错误:

if(current->((edge*)data)->to->distance > ...

如果我将数据类型更改为结构中的边缘(而不是尝试这个特技),这非常有效,但在这种情况下强制转换显然不起作用。

如果需要更多详细信息,请告诉我。

【问题讨论】:

  • 建议:如此多的间接级别令人困惑,并且通常表明您的代码需要以不同的方式模块化。
  • 我想了很多,我的问题是我使用了很多结构(对于图中的顶点和边),它们使用结构保存在链表中。所以获取数据变得混乱。会尽量记住这是不好的做法。

标签: c casting


【解决方案1】:
((edge*)current->data)->to->distance

【讨论】:

  • 啊,我没有正确使用额外的括号......谢谢。
【解决方案2】:

-> 运算符的右操作数必须是结构(或联合)成员的名称;它不能是强制转换表达式。

currentlinked_list 类型的表达式(推测)。

current->datavoid* 类型的表达式。

要将 void* 表达式转换为 edge* 表达式,您需要对表达式应用强制转换,而不是对成员名称,所以:

(edge*)current->dataedge* 类型的表达式

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2014-01-13
    • 2012-02-03
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2012-05-05
    • 2022-01-17
    • 2023-02-26
    相关资源
    最近更新 更多