【问题标题】:Using Doubles in Unix?在 Unix 中使用双精度数?
【发布时间】:2012-02-13 23:17:16
【问题描述】:

我正在调用 sysctl() 来检索内存统计信息,对于 void* oldVal 参数,我正在传递一个指向双精度的指针。但是,它没有将双精度设置为正确的值,而是将其设置为 0.00000

但是,当我尝试使用 long 执行完全相同的操作时,它会将其设置为正确的统计信息。为什么将 double 设置为 0.00000 而 long 设置为正确的统计数据?

    int systemInfoNeeded[2] = {CTL_HW, HW_PHYSMEM};
    size_t sizeOfBuffer = sizeof(totalAmount);

    if (sysctl(systemInfoNeeded, 2, &totalAmount, &sizeOfBuffer, NULL, 0)) 
    {
        NSLog(@"Total memory stat retrieval failed.\n");
        exit (EXIT_FAILURE);
    }

totalAmount 是双倍的。第二个我将 totalAmount 的类型更改为 long,它工作得很好。无论如何我可以让双打工作吗?我想直接发送totalAmount而不是发送一个long然后将值分配给totalAmount

我在带有 Xcode 3.2.6 的 Mac OS X Snowleopard 上使用 Objective-C/C

【问题讨论】:

标签: objective-c c macos unix


【解决方案1】:

您不能只选择自己喜欢的数据类型并传递一个指向它的指针; sysctl 调用需要一个指向整数的指针,这就是您必须提供的。如果你传递一个指向双精度的指针,那么你会得到一个双精度数字,其中的位将一个值表示为一个整数——结果是乱码。

【讨论】:

  • sysctl 不期望指向 long 的指针。它需要一个指向数值变量的指针,这就是为什么它是 void* 而不是 long*。如果我传入一个整数,它仍然有效,所以我不明白为什么双精度数不会。
  • 但不是任何你想要的类型的指针,没有办法检查你传递了什么样的指针,所以你必须提供一种想要的类型。
  • sysctl(3) 的 BSD 手册页令人愤怒。为什么不说所谓的“整数”值使用 which 整数类型?你只是应该知道它是long(与int相反,它的大小和表示不一定与long相同,因为64位OSX使用LP64),还是你应该检查写的大小每次调用,如果是sizeof(long),您可以将数据重新解释为long,如果是其他大小,则重新解释为其他整数类型?
  • 手册页上写着“整数”,意思是“整数”。如果它的意思是“长整数”,它会这么说。
【解决方案2】:

sysctl() 接受指向在联机帮助页中为您正在查询的属性指定的类型的指针。该参数被声明为 void*,以便相同的通用接口可以使用各种属性所期望的不同类型。这并不意味着您可以使用任何您想要的类型。在 HW_PHYSMEM 的情况下,它是一个整数,即一个 int,而不是一个 long 或其他任何东西。

如果你传递一个long它起作用的唯一原因是因为macs是小端的,因此作为long的值的前四个字节与作为int的值相同,但你当然不应该依赖这个.

如果要读取双精度,请转换整数。

你应该好好看看sysctl(3)。请特别查看带有 KERN_MAXPROC 的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多