2011-02-14 2 views
2

전달 된 변수에 주어진 값을 계산하는 아래 함수를 호출하고 있습니다. 그러나 함수 (calculate_distance)가 실행되면 함수에 전달 된 변수 (loc_ptr)에 포함 된 데이터가 변경된 것처럼 보입니다.포인터가 함수 호출에 영향을받는 곳 :

코드를 통해 변수 loc_ptr이 함수 자체가 아니라 함수 호출에 영향을 받는다는 것을 알게되었습니다.

함수가 while 루프에서 호출되고 있습니다. while 루프의 첫 번째 반복은 올바르게 계산됩니다. 문제가 발생하는 것만 후속 반복에서 발생합니다.

_ 주 : location은 char * name, double latitude, double longitude가 포함 된 typedef'ed 구조체입니다. options는 doubles._

double calculate_distance(location from, location to) { 
    return to.latitude - from.latitude; 
} 

main() { 
    location current_location = {"Plymouth", 50.378565, -4.134339}; 
    location locations[3] = {{"Padstow", 50.5384, -4.9378}, 
          {"Newquay", 50.412, -5.0757}, 
          {"Boscastle", 50.684, -4.6929}}; 

    // create a pointer to an array of locations. 
    location* loc_ptr; 
    loc_ptr = &locations[0]; 

    double options[3]; 
    int i = 0; 
    int position = 3; 

    while (i < position) { 
     // calculate the distance between the current and other locations 
     options[position] = calculate_distance(current_location, 
               loc_ptr[position]); 
     position--; 
    } 
    // handle the rest of the algorithm 
} 

주의 배열입니다 : 그것은 꽤 긴 것 같은 코드는이 짧은 잘라있어 더 큰 알고리즘의 일부입니다. while 루프가 끝나면 loc_ptr 배열이 다시 구성되어 요소 중 하나가 제거됩니다.

+1

무엇이'위치'입니까? 어떻게 정의/할당됩니까? – jswolf19

+0

옵션 []이 정의 된 방법 및 위치는 무엇입니까? – pmod

+0

latitude 대 lattiude? –

답변

0

귀하의 위치에 액세스 할 수 없습니다 [3] 그 배열에서 가장 높은 지수가 2이기 때문에 당신은 아마 원 :

for (int i = 2;i >= 0;i--) 
    options[i] = calculate_distance(current_location, locations[i]); 
} 
2

귀하의 예제 코드는 ...

  • 하지 않습니다 다양한 이유, 오타 및 생략을 위해 컴파일;

  • 에는 관찰 된 동작을 설명하는 명백한 오류가 없습니다.

또한 무의미한 되 (locations 예를 들어, 결석). 즉, 유령을 보거나 예제 코드가 실제 코드가 실제로 무엇을하는지 나타내지 않고 (문제를 해결할 때 문제의 버그가 더 이상 포함되지 않음) 의미합니다.

어느 쪽이든, 충분한 정보를 제공하지 않아 아무도 실제로 말할 수 없습니다.

시도 this little debugging technique

편집 : 질문을 업데이트 한 후 적어도 typedef를 추가 한 후 예제 코드가 올바르게 컴파일됩니다. 첫 번째 루프에서 정의되지 않은 메모리에 액세스합니다 (예 : options[3]으로 정의 된 배열에는 options[0] .. options[2]이 있지만 options[3]이 아님). 이 아닌이 발생하면 loc_ptr 값이 변경됩니다 (디버거를 사용하여 확인한 것처럼). 따라서 유령이 여전히 보이거나 예제 코드가 문제를 드러내지 않습니다 (예를 들어 쓸모 없게 만듭니다). 내 추천 (위 링크 참조)이 남아 있습니다.

0

문제가

loc_ptr = &locations[0]; 

locationslocation 요소들의 어레이 보인다에 보인다. 이 배열의 첫 번째 요소의 주소를 가져 오면이 요소에 대한 포인터가 생깁니다.

동일한 정보를 보유하기 위해 여분의 loc_ptr을 생성하는 대신 locations[position]을 작성하는 것이 가장 좋은 이유는 무엇입니까? 나는이 문제가 locations의 내용을 가지고 있다고 확신한다. 이것은 또한 코드 스 니펫의 범위에도 포함되지 않는다.

2

스택 손상? options [] locations [] 배열의 크기를 확인하십시오. 또한 범위를 벗어나는 것을 방지하기 위해 어설 션을 사용하는 것이 좋습니다.

이제 인덱스에 문제가 있습니다. locations [] 배열에는 3 개의 요소가 있지만 첫 번째 루프 (loc_ptr [position] -> loc_ptr [3])에서 앞뒤로 액세스합니다. 옵션은 []과 동일합니다.

1

코드를 작성하면, 기존 요소 위치 [3]에서 처음 호출하는 것처럼 보입니다. 그게 중요한가요?

+0

+1000000 : 그게 답이라고 확신합니다! – JeremyP

+1

나는 이것을 처음 알았다. – pmod

관련 문제