为 qsort 的结构编写比较函数?

2023-12-23

我在编写比较函数时遇到问题qsortC 中的函数。这是我目前拥有的:

int cmpfunc(const void *a, const void *b) {
    return (*(Individual*)a->fitness - *(Individual*)b->fitness);
}

我知道比较函数是如何工作的,但我不明白如何在我的结构中引用一个整数值Individual。这是个体的结构。

typedef struct {
    PPM_IMAGE image;
    double fitness;
} Individual;

我想比较结构内的适合度值。


这部分

*(Individual*)a->fitness

是错的。您尝试访问fitness using ->但同时您使用取消引用指针*。你不能两者兼得!

这里有两个解决方案。

解决方案 A:使用取消引用*和访问fitness using .

(*(Individual*)a).fitness

解决方案B:访问fitness using ->

((Individual*)a)->fitness

这两种解决方案还需要来自void* to Individual*.

同样适用于变量b

如果您是 C 语言的初学者,我建议您避免使用发生多种情况的紧凑语句。相反,将紧凑语句拆分为许多单独的语句。这将使代码更容易理解和调试。喜欢:

int cmpfunc (const void * a, const void * b){
    Individual* pA = a;
    Individual* pB = b;
    double fitnessA = pA->fitness;
    double fitnessB = pB->fitness;
    return fitnessA - fitnessB;
}

您无需担心性能。编译器将优化代码,使其与单语句代码一样高效。

这就是说 - 正如@chqrlie 所发现的 -请注意,比较代码是错误的!

该函数返回一个整数,但是fitnessA - fitnessB是一个将被转换为整数的双精度值。所以0.1 - 0.0最终会回来0- 这不是你想要的。

你可以看看这个答案https://stackoverflow.com/a/53466034/4386427 https://stackoverflow.com/a/53466034/4386427来自 @chqrlie 了解更多详细信息。

代码也可以更改为:

int cmpfunc (const void * a, const void * b){
    Individual* pA = a;
    Individual* pB = b;
    double fitnessA = pA->fitness;
    double fitnessB = pB->fitness;
    if (fitnessA > fitnessB) return 1;
    if (fitnessA < fitnessB) return -1;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 qsort 的结构编写比较函数? 的相关文章

随机推荐

  • mailgun 传入邮件事件获取附件 url

    我有一个节点端点 它接收 json 格式的传入电子邮件 其中包含来自 mailgun 的所有附件 附件位于 json 数组中 xxx com 用于隐私 attachments url https sw api mailgun net v3
  • 导航架构组件 - 将参数数据传递到 startDestination

    我有一个活动 A 启动活动 B 并向其传递一些意图数据 活动 B 托管来自新导航架构组件的导航图 我想将该意图数据作为参数传递给 startDestination 片段 如何做到这一点 好的 感谢 Google 团队的 Ian Lake 我
  • 正确传输和保护 Web 应用程序的用户密码

    我正在为我的硕士项目开发一个网络应用程序 这是一个供教授管理学生项目的系统 它使用Java作为服务器端代码 使用HSQLDB作为数据库 使用JSP作为表示层 并且运行在tomcat上 将存储的数据不包括任何敏感信息 学生 ID 财务信息等
  • FixIO 是做什么的?

    The System IO 文档 https hackage haskell org package base 4 5 0 0 docs System IO html包含一个神秘的 未记录的函数fixIO 它的来源 https hackag
  • 显示 Maven dependency:tree 中省略的版本?

    在 Eclipse 中 当我转到 Maven 依赖关系层次结构页面时 我得到的输出指出了哪些冲突导致版本被忽略 但是 如果我使用依赖 树 http maven apache org plugins maven dependency plug
  • purescript 中列表/数组中的类似记录类型

    有什么办法可以做类似的事情 first x 0 second x 1 y 1 both first second 这样both被推断为 x Int r 或类似的东西 我尝试过一些事情 x 3 Array forall r x Int r n
  • 无锁堆栈实现想法 - 目前已损坏

    我想出了一个想法 尝试实现一个无锁堆栈 该堆栈不依赖引用计数来解决 ABA 问题 并且还可以正确处理内存回收 它在概念上与 RCU 类似 并且依赖于两个功能 将列表条目标记为已删除 以及跟踪遍历列表的读者 前者很简单 它只使用指针的LSB
  • 找不到处理 market:// URI 的活动

    我有一个 bugsense 帐户 用于跟踪我公司 Android 应用程序的崩溃报告 我们的应用程序需要安装一个单独的应用程序 即服务 否则该应用程序将无法运行 我们通过检查是否安装了其他应用程序 服务 来处理此问题 如果没有安装 我们将用
  • 填写 ={ARRAYFORMULA()} 中的空白单元格

    我有一张包含稀疏数据的人性化工作表 PART FRUIT Alpha Apples Pears Beta Lemons Oranges 我想创建第二个自动更新的机器友好工作表 该工作表将填充 PART 列中的所有空单元格 PART FRUI
  • 如何在清单文件中注册应用程序类?

    如何在我的 Android 清单中注册我的应用程序类 网上看了很多教程 还是不太明白 我的应用程序类称为Monitor java 如何在下面的Manifest文件代码中注册它
  • InputMethodManager 在 web 视图中显示小键盘

    我正在使用 InputMethodManager 在需要时以编程方式显示软键盘 InputMethodManager imm InputMethodManager getSystemService Context INPUT METHOD
  • Joda时间的DateTime转换为java.util.Date奇怪问题

    我遇到了一个奇怪的问题 这是描述它的代码片段 DateTimeZone dtz DateTimeZone forOffsetHours 0 DateTime dt new DateTime dtz System out println dt
  • 核心情节自定义主题?

    我在 iPhone 应用程序中使用 Core Plot 绘制趋势图 但尚未找到如何自定义背景 我可以使用内置主题创建主题 例如 kCPPlainWhiteTheme 但如何更改它们 或者创建一个新的 我基本上需要做的就是使背景透明 编辑 更
  • 使用参数调用 JSON Web 服务 - Objective C - iOS

    我正在尝试使用 Objective c 中的参数调用一个简单的 JSON Web 服务 到目前为止还不起作用 这是网络服务方法 WebMethod ScriptMethod ResponseFormat ResponseFormat Jso
  • 这个 Xcode 警告是什么意思? “应用程序可执行文件缺少所需的架构。...”

    当我在 Xcode 4 2 中为我的第 4 代 iPod touch 第一个配备视网膜显示屏的产品 构建并运行 iOS 5 应用程序时 我收到以下警告 警告 iPhone iPod Touch 应用程序可执行文件缺少 所需的架构 至少以下架
  • 通用语法符号 <~> [重复]

    这个问题在这里已经有答案了 使用 NetBeans 或 IDEA 等 IDE 时 我发现它们正在将泛型类型转换为以下符号 private final List
  • 将 Kivy 与 Python 3.4 结合使用

    我已经在我的 Mac 上安装了 Kivy OS X 预装了 Python 2 7 我想使用Python 3的枚举功能 所以我安装了Python 3 4 经过多次搜索和梳理头发后 有人向我指出了这条线 exec python c import
  • 在 Kubernetes 中找不到带有 OAuth2 身份验证的 Nginx Ingress 404 页面

    继上一个关于 Stack Overflow 的问题之后link https stackoverflow com questions 64590283 external oauth authentication with nginx in k
  • 安装过程中从互联网下载数据的包

    有谁知道有一个包在安装过程中从互联网下载数据集 然后准备并保存它 以便在使用加载包时可用library packageName 这种方法是否有任何缺点 除了明显的缺点 如果数据源不可用或数据格式已更改 包安装将失败 EDIT 一些背景 这些
  • 为 qsort 的结构编写比较函数?

    我在编写比较函数时遇到问题qsortC 中的函数 这是我目前拥有的 int cmpfunc const void a const void b return Individual a gt fitness Individual b gt f