2010-01-18 3 views
7

저는 상당히 새로운 프로그래머입니다.이 정보를 쉽게 이용할 수 있다면 사과드립니다. 아직 찾을 수 없었습니다. 당신은 배열의 특정 요소에 액세스 할 문자 수를 사용할 때배열의 매직 번호? - C++

간주되어 매직 넘버 :

여기 내 질문? 예를 들어

: 내 교수 중 하나가 프로그램의 모든 문자 번호는 매직 넘버 것을 확고하기 때문에

arrayOfNumbers[6] // Is six a magic number in this case? 

나는이 질문을 부탁드립니다. 각 요소에 대해 명명 된 상수를 사용하는 대신 실제 숫자를 사용하여 배열의 요소에 액세스하는 것이 좋을 것입니다.

감사합니다.

+1

'#define ONE 1' ... 'i + = ONE;' –

+2

피하려면 하나님 께서 우리에게 주셨다. ++ : P – Leo

+1

예. 6은 매직 넘버입니다. 코드에서 마술 숫자를 피하는 것이 더 좋습니다 (예 :'#define PI 3.1416'). pi의 값이 변경되면 코드 전체에서'3.1416'을 사용하는 것보다 낫습니다. –

답변

22

정말 상황에 따라 다릅니다. 다음과 같은 코드를 사용하는 경우 :

arr[0] = "Long"; 
arr[1] = "sentence"; 
arr[2] = "as"; 
arr[3] = "array."; 

... 그런 다음 0..3은 마법 번호로 간주되지 않습니다. 그러나 가지고있는 경우 :

int doStuff() 
{ 
    return my_global_array[6]; 
} 

... 6은 확실히 마법의 숫자입니다.

+0

Ahh, O.K. 그건 의미가 있습니다. – Alex

5

왜 특정 위치에 액세스하고 있는지 물어보십시오. 이 경우, 나는 당신이 arrayOfNumbers[6] 일을한다면 여섯 번째 위치는 특별한 의미가 있다고 가정합니다. 그 의미가 무엇인지 생각한다면, 아마 그것을 숨기고있는 마법의 숫자라는 것을 알 것입니다.

0

배열의 특정 요소에 액세스해야하는 경우 잘못했을 가능성이 있습니다.

거의 항상 전체 배열을 반복해야합니다.

6

꽤 마법입니다.

내 말은 입니다. 이유는 무엇입니까? 6 번째 요소에 액세스하고 있습니까? 그 숫자에 적용되어야하는 의미는 무엇입니까? 우리가 아는 모든 것은 "제로 (제로 기준) 숫자"입니다. arrayOfNumbers이라는 선언을 알았다면 유형 (예 : int 또는 double)을 알 수 있습니다.

하지만 당신은 말했다 경우 :

arrayOfNumbers[kDistanceToSaturn]; 

가 ... 지금은 코드를 읽는 사람에게 더 많은 의미를 가지고있다.

일반적으로 어레이가 얼마나 오래인지 알지 못하고 하드 코딩 된 방식으로 액세스 할 수 없으므로 각 요소에 대해 일부 작업을 수행하면서 배열을 반복합니다.

그러나 배열 요소에는 그래픽 프로그래밍과 같은 특정 의미가있을 수도 있습니다. 때로는 데이터가 요구하기 때문에 배열이 항상 같은 크기입니다 (예 : 특정 변환 행렬). 이 경우 숫자로 특정 요소에 액세스하는 것이 좋을 수도 있고 그렇지 않을 수도 있습니다. 도메인 전문가는 자신이하는 일을 알게되지만 일반적으로는 그렇지 않습니다. 마술 색인 번호에 이름을 부여하면 코드를 유지해야하는 사람들에게 더 명확 해지고 실수로 잘못 입력하는 것을 방지 할 수 있습니다.

위의 예에서 배열은 태양에서 행성까지의 거리를 유지한다고 가정했습니다. 태양은 0 번째 원소가 될 것이므로 arrayOfNumbers [kDistanceToSun] = 0이됩니다. 그리고 나서 원소가 증가함에 따라 각 원소는 다음 가장 먼 행성 인 수은, 금성 등과의 거리를 포함합니다. 당신이 원하는 행성. 이 경우 배열은 고정 된 수의 행성이 있기 때문에 고정 된 크기입니다 (음, 전체 명왕성 충돌 제외).

다른 문제는 "arrayOfNumbers"가 배열의 내용에 대해 아무것도 알려주지 않는다는 것입니다.우리는 이미 숫자 배열을 알고 있습니다. 왜냐하면 여러분이 선언 한 어딘가에서 여러분이 int arrayOfNumers[12345];이라고 말한 곳을 보았 기 때문입니다. 대신 다음과 같은 형식이 사용됩니다.

int distanceToPlanetsFromSol[kNumberOfPlanets]; 

... 데이터가 실제로 무엇이며 그 의미가 무엇인지 훨씬 더 잘 알 수 있습니다. 프로그래머로서의 목표 중 하나는 이런 방식으로 자체 문서화하는 코드를 작성하는 것입니다.

그리고 kNumberOfPlanets이 있어야 할 경우 우리는 다른 주장 할 수 8 또는 9 :

+0

화성을 두 번 계산하면 달려있다. –

0

이 프로그램은 특히 여섯 번째를 포함하는 아주 특별한 일을하는 경우뿐만 아니라 매직 넘버입니다. 컨텍스트를 제공 할 수 있습니까?

1

의미있는 대답을 위해 더 많은 상황을 제공해야합니다. 모든 문자 숫자가 마술이지만, 많은 문자가 있습니다. 위와 같은 경우에 확실히 알 수있는 방법은 없습니다. 명백한 배열 인덱스 >> 1을 가진 대부분의 경우는 아마도 마술로 간주 될 수 있습니다.

0

교수님의 문제입니다. 종종 너무 학문적입니다. 이론상 그는 평소와 마찬가지로 적절하지만 일반적으로 매직 넘버는 데이터 스트림에 삽입 될 때 더 엄격한 컨텍스트에서 사용되므로 스트림의 특정 속성 (예 : 파일 유형의 서명 헤더)을 감지 할 수 있습니다. 예). this Wikipedia entry도 참조하십시오.

+0

그러면 마법 값이 아닌 명명 된 상수를 사용해야합니다. –

+0

젠장, 너는 내가 쓰려고했던 것을 썼다. +1. –

1

아니요 모든 프로그램의 리터럴은 실제로 "마법의 숫자"로 자격이 부여됩니다. 6은 배열의 특정 요소에 액세스하는 이유를 알 수 없습니다.

아니요은 마법의 숫자 여야합니다. 그 값이 사용되는 이유에 대한 첫 번째 시험 (또는 최소한의 검사) 에서조차 의미가 분명해야합니다. 예를 들어 많은 코드는 &x[0]과 같은 작업을 수행합니다. 이 경우 '0'은 실제로 "배열의 시작"을 의미한다는 것이 일반적으로 명확합니다.

0

일반적으로 소프트웨어의 모든 상수 값을 마법 수라고 부르는 것은 아닙니다. Java 클래스 파일은 항상 16 진수 값 0xcafebabe로 시작합니다. Windows .exe MZ 0x4d, 0x5a가있는 파일로 이진 파일의 내용을 으로 신속하게 식별 할 수 있습니다.

2

다른 식으로보고 :

만약에 프로그램이 7 요소 대신 6 액세스해야하는 몇 가지 기회가 이후? 너 또는 유지 관리자가 그걸 알고 있니? 예를 들어 6 번째 항목이 CA에서 나무의 개수 인 경우 경우 이제 테이블이 다시 정렬됩니다 누군가가 9로 변경 할 필요가 있음을 알 수 있다면 좋은 일이 (말) 다음

#define CA_STATE_ENTRY 6 

를 넣어하는 것입니다 .BTW 나는 그것이 상태에 의한 트리 카운트를위한 배열을 유지하는 최선의 방법이라고 말하지는 않는다. 아마 isnt 일 것이다.

나중에 사람들이 오레곤에서 나무를 다루는 프로그램을 변경하려는 경우

은 마찬가지로, 그들은 요점은

trees[CA_STATE_ENTRY] 

trees[OR_STATE_ENTRY] 

입니다 대체 알고

trees[6] 

은 자체 문서화가 아닙니다.

물론 C++의 경우 #define이 아닌 enum이어야합니다.

0

MISRA 호환 시스템에서 0과 1을 제외한 모든 값은 매직 넘버로 간주됩니다. 일정한 가치가 명백하거나 숫자로 남겨두면 변하지 않을 것이라는 의견이 항상있었습니다. 의심스러운 경우 장기간 유지 관리가 쉬워지기 때문에 고유 한 상수를 생성하십시오.