Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Unix中使用double?_Objective C_C_Macos_Unix - Fatal编程技术网

Objective c 在Unix中使用double?

Objective c 在Unix中使用double?,objective-c,c,macos,unix,Objective C,C,Macos,Unix,我调用了sysctl()来检索mem stats,对于void*oldVal参数,我传递了一个指向double的指针。但是,它没有将double设置为正确的值,而是将其设置为0.00000 但是,当我尝试使用long做完全相同的事情时,它会将其设置为正确的统计。为什么double设置为0.00000,而long设置为正确的统计 int systemInfoNeeded[2] = {CTL_HW, HW_PHYSMEM}; size_t sizeOfBuffer = sizeof(

我调用了
sysctl()
来检索mem stats,对于
void*oldVal
参数,我传递了一个指向double的指针。但是,它没有将double设置为正确的值,而是将其设置为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的类型改为long,它工作得很好。我能让替身上班吗?我想直接发送
totalAmount
,而不是发送一个long,然后将值赋给
totalAmount


我在Mac OS X Snowleopard上使用Objective-C/C,Xcode为3.2.6

您不能只选择您喜欢的数据类型并传递指向它的指针;sysctl调用需要一个指向整数的指针,因此您必须提供这个指针。如果将指针传递给一个double,则会得到一个double,其中的位表示一个整型值——结果是乱七八糟的。

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

如果传递long,它工作的唯一原因是因为mac是小endian,因此作为long的值的前四个字节与作为int的值相同,但您当然不应该依赖于此

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


你应该好好看一看。请特别关注KERN_MAXPROC的示例。

sysctl不希望指针指向长字符串。它需要一个指向数值变量的指针,这就是为什么它是void*而不是long*。如果我传入一个整数,它仍然可以工作,所以我不明白为什么double不能工作。但不是任何类型的指针,没有办法检查您传入的是什么类型的指针,所以您必须提供一个所需类型的指针。
sysctl(3)
的BSD手册页令人愤怒。为什么不说所谓的“整型”值使用哪种整型?您只是想知道它是
long
(与
int
相反,它的大小和表示形式不一定与
long
相同,因为64位OSX使用LP64),还是想检查每个调用写入的大小,如果它是
sizeof(long)
,您可以将数据重新解释为
long
,如果是其他大小,请重新解释为其他整数类型?手册页上显示的是“整数”,意思是“整数”。如果是“长整数”,则会显示为“长整数”。请阅读此处的代码以了解应如何操作: