2012-02-13 2 views
-1

sysctl()을 호출하여 mem 통계를 검색하고 void* oldVal 인수에 대해 double에 대한 포인터를 전달하고 있습니다. 그러나 double을 올바른 값으로 설정하는 대신 0.00000Unix에서 Doubles를 사용 하시겠습니까?

으로 설정합니다. 그러나 정확히 동일한 것을 long으로 시도하면 정확한 값으로 설정됩니다. 왜 double이 정확한 stat로 설정되어있는 동안 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에 값을 할당하는 대신 직접 totalAmount을 보내려고합니다. 나는 3.2.6

+0

어떻게해야하는지 보려면 코드를 읽으십시오. http://www.opensource.apple.com/source/gcc/gcc-5484/libiberty/physmem.c –

답변

1

sysctl()은 조회중인 등록 정보의 맨페이지에 지정된 유형에 대한 포인터를 허용합니다. 매개 변수는 void *로 선언되므로 동일한 제네릭 인터페이스가 다양한 속성에 필요한 다른 유형으로 작동 할 수 있습니다. 그렇다고 원하는 유형을 사용할 수있는 것은 아닙니다. HW_PHYSMEM의 경우, 길이 또는 다른 것이 아니라 이름에서 알 수 있듯이 정수형, 즉 int입니다.

mac가 리틀 엔디안이기 때문에 long을 전달하는 유일한 이유는 long의 값의 처음 4 바이트가 int 값과 같지만 물론 의존하지 않아야합니다. 이.

double을 읽으려면 정수를 변환하십시오.

sysctl(3)을 잘 살펴 봐야합니다. 특히 KERN_MAXPROC 예제를 살펴보십시오. int의 사용에주의하십시오.

+0

감사합니다. – fdh

3

당신은 당신의 마음에 드는 데이터 유형을 선택하고 그것에 대한 포인터를 전달할 수 없습니다 엑스 코드와 맥 OS X Snowleopard에 목표 - C/C를 사용하고

; sysctl 호출은 정수에 대한 포인터를 기대하므로 사용자가 제공해야합니다. double에 대한 포인터를 전달하면 정수로 값을 나타내는 비트가있는 double을 얻습니다. 결과는 횡설수설합니다.

+0

sysctl에 대한 포인터가 필요하지 않습니다. 긴. 숫자 변수에 대한 포인터를 기대하기 때문에 long *이 아닌 void *가됩니다. 정수로 전달하면 여전히 작동하므로 두 배로 된 이유는 알 수 없습니다. – fdh

+0

그러나 원하는 유형의 포인터가 아니어도 통과 한 포인터의 유형을 확인하여 원하는 유형 중 하나를 제공해야합니다. – JustSid

+1

'sysctl (3)'에 대한 BSD 맨 페이지가 화를냅니다. 왜 그것은 소위 "정수"값이 사용하는 정수형이 아닙니까? 64 비트 OSX가 LP64를 사용하기 때문에'long' ('int'와는 반대로'long '과 같은 크기와 표현 일 필요는 없습니다), 또는 쓰여진 크기를 확인하기로되어 있는지 'sizeof (long)'이라면 데이터를'long'으로 재 해석 할 수있다. 만약 다른 크기의 정수형으로 재 해석한다면? –