Использование Doubles в Unix? - PullRequest
       10

Использование Doubles в Unix?

0 голосов
/ 14 февраля 2012

Я звоню sysctl() для получения статистики mem, а для аргумента void* oldVal я передаю указатель на double. Однако вместо того, чтобы установить double на правильное значение, он просто устанавливает его на 0,00000

Однако, когда я пытаюсь сделать то же самое с длинным, он устанавливает для него правильный показатель. Почему двойное значение устанавливается на 0,00000, а длинное - на правильный стат?

    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.

Я использую Objective-C / C в Mac OS X Snowleopard с Xcode 3.2.6

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Вы не можете просто выбрать свой любимый тип данных и передать на него указатель; вызов sysctl ожидает указатель на целое число, и это то, что вы должны предоставить. Если вы передадите указатель на двойное число, тогда вы получите двойное число с битами, которые представляют значение в виде целого числа - результат - бред.

1 голос
/ 14 февраля 2012

sysctl () принимает указатель на тип, указанный в man-странице, для свойства, которое вы запрашиваете. Параметр объявлен как void *, так что один и тот же универсальный интерфейс может работать с различными типами, ожидаемыми различными свойствами. Это не означает, что вы можете использовать любой тип, который вы хотите. В случае HW_PHYSMEM это целое число, то есть int, а не long или что-то еще.

Единственная причина, по которой он работает, если вы передаете long, состоит в том, что macs имеет младший порядок байтов, поэтому первые четыре байта значения long соответствуют значению int, но вы, конечно, не должны зависеть от этого. .

Если вы хотите прочитать двойное число, преобразуйте целое число.

Вам следует внимательно посмотреть на sysctl (3) . В частности, посмотрите на пример с KERN_MAXPROC.

...