2012-06-20 2 views
4

내 프로그램은 프로그램이 시작될 때 여러 개의 부동 소수점을 기본 숫자로 설정해야합니다. 프로그램이 실행되면 이러한 정수가 실제 값으로 설정됩니다. 그러나 이러한 실제 값은 실제 숫자이 될 수 있습니다. 내 프로그램은이 값을 기본값에서 변경되었는지 지속적으로 확인합니다.정수의 기본값은 무엇입니까?

예를 들어 정수 A, B, C가 있다고 가정합니다. 이 모든 정수는 시작시 기본값으로 설정됩니다 (-1이라고 말하면 됨). 그런 다음 프로그램이 진행되면 A와 B가 정중하게 3과 2로 설정됩니다. C가 여전히 기본값에 있기 때문에 프로그램은 C가 기본값이 아닌 값으로 지정되지 않았다고 결론을 내릴 수 있습니다.

고유 한 기본값을 찾으려고 할 때 문제가 발생합니다. 숫자의 값은 무엇이든 설정할 수 있기 때문에 설정 한 값이 기본값과 동일하면 내 프로그램은 부동 소수점이 여전히 기본값을 가지고 있는지 또는 참값이 기본값과 똑같은지 알 수 없습니다 .

NULL을 기본값으로 간주하지만 NULL은 C++에서 0과 같으므로 같은 문제가 발생합니다!

bool과 float로 구성된 전체 객체를 멤버로 만들 수 있습니다. 여기서 bool은 float에 자체 값이 할당되었는지 여부를 나타냅니다. 그러나 이것은 잔인한 것처럼 보입니다. 기본값이 있습니까? 값이 다른 값과 동일하지 않도록 플로트를 설정할 수 있습니까? (예 : 무한대 또는 i 포함)

C/C++ 솔루션을 요청하고 있습니다.

+0

C는 값이 할당되었는지 여부를 결정하는 기능을 본질적으로 지원하지 않습니다. 하나의 전략은 해시 맵 (변수 이름에서 할당 된 값으로)을 만드는 것이고, 변수 이름이 해시 맵에 존재하지 않으면 할당되지 않은 것입니다. –

+0

* 무한대 또는 i *는 정수가 아닙니다. 부동 소수점 숫자를 다루는 경우 Not-a-Number (nan)를 사용할 수 있지만 정수에는 그러한 값이 없습니다. boost :: optional을 사용할 수 있습니다 (구현은 부울과 정수의 조합과 비슷해야합니다 ... 또는 자신 만의 롤을 만들지 만 도메인에 하나가 없으면 * 잘못된 정수는 없습니다. 도메인 -12345 불가능합니다 ...) –

+0

마지막에 float 언급합니다 .C++에서 표준, 난 :: numeric_limits :: NaN(), 표식으로 사용할 수 있습니다. 그러나 정수에 대한 표식 값이 없습니다 –

답변

7

나는 부울이 숫자는 아직 여부를 자신의 값이 할당되었는지 여부를 나타내는 부울 및 회원으로 정수로 구성된 전체 개체를 만들 수 있습니다. 그러나 이것은 잔인한 것처럼 보입니다.

설명하신 내용을 .NET에서 "nullable type"이라고합니다. C++ 구현 boost::optional입니다 :

boost::optional<int> A; 

if (A) 
    do_something(*A); 
+1

나는이 질문에 대답한다고 생각하지 않는다 ... – NominSim

+0

@NominSim 나는 나의 대답을 편집했다. 나는 그것이 질문에 대답하는 것 같아 . – kol

+0

넵, +1 좋아 보인다. – NominSim

2

int에 할당 할 수있는 비트 패턴이 실제 int가 아닙니다. 경계를 벗어나는 정수 값이 실제로 없다면 별도의 플래그를 유지해야합니다.

1

유효한 int 값의 도메인이 무제한 인 경우 할당 여부를 나타내는 관리 비트 만 선택할 수 있습니다.

하지만 MAX_INT을 선택 하시겠습니까?

1

int를 할당하는 값이 다른 임의의 int와 같지 않음을 보장 할 방법이 없습니다. 자신이 원하는 일이 발생했는지 확인하는 유일한 방법은 변경 사항을 설명하기 위해 별도의 bool을 만드는 것입니다.

1

아니요, 할당 여부에 대한 정보가 포함 된 고유 한 데이터 유형을 만들어야합니다.

0

당신이 말한대로 경우, 정수 값이 값을 "초기화되지 않은", 당신은 기본값을 할당 할 수 없습니다 오프 한도 없습니다. 귀하의 질문에 제안 int 및 bool 구조체를 사용하십시오.

0

나는 부울이 숫자는 아직 여부를 자신의 값이 할당되었는지 여부를 나타내는 부울 및 회원으로 정수로 구성된 전체 개체를 만들 수 있습니다. 그러나 이것은 잔인한 것처럼 보입니다.

첫 번째 추측은 효과적으로 플래그를 사용하고 각 변수를 표시하는 것입니다. 그러나 이것이 당신의 유일한 선택은 아닙니다.

  1. 포인터 (NULL 일 수 있음)를 사용하여 메모리를 동적으로 할당 할 수 있습니다. 별로 편리하지 않습니다.
  2. 거의 사용되지 않는 사용자 지정 값을 선택할 수 있습니다. 그런 다음이 값을 기본값으로 정의 할 수 있습니다. Ofc, 언젠가이 값을 플로트에 할당해야하지만이 경우는 자주 발생하지 않고이 변수를 추적하면됩니다. 이러한 경우가 발생하면 간단한 연결 목록을 수행해야합니다.
5

2의 보수 시스템에는 정수 값이 다른 것보다 덜 유용합니다 (INT_MIN). 이를 부정하면 유효 양수 값을 만들 수 없습니다. 정수 범위에서 가장 유용하지 않은 값이므로 마커 값을 선택하는 것이 좋습니다. 또한 쉽게 인식 할 수있는 16 진수 값 0x80000000을가집니다.

관련 문제