2017-02-12 4 views
0

I 배열 가지고쓰기가 [I] [0] [1]도 덮어 [I] [1] [0]와 반대

typedef short int long_graph[1000][1000][1]; 

을 그것을 선언

long_graph paf_graph; 

나는 기능이 있습니다

,741,286,563 : 나는 여기에 문제를 감지
void construct_paf_graph (sf::Vector2i A,sf::Vector2i B, long_graph &paf_graph, long_list &paf_list, poly_list &poly, int &no_of_poly_on_map, list_of_indexes &XX ) 
{ 

short int n,i,j,k,e, t, off; // t is used to convert indices from individual  polies to the unified list 
bool path_clear; 
short int distance, rev_en_ind; // reverse engineer index 

n=0; //will be total number of points in paf_graph and paf_list 
t=0; 

std::fstream debug; 
debug.open("assets/debug.txt", std::ios::out | std::ios::trunc); 

for (i=1; i<=XX[0]; i+=1) 
{ 
     debug << XX[i] << "\n"; 
     for (j=1; j<= poly[XX[i]].point[0].x; j+=1) 
      { 
       n+=1; 
       paf_graph[n][0][0] = poly[XX[i]].graph[j][0][0]; 
       //paf_graph[n][0][1] = i; 
       debug << "P["<<n<<"] = " << paf_graph[n][0][1] << " \n"; 

       for (k=1; k<= poly[XX[i]].graph[j][0][0]; k+=1) 
        { 
          paf_graph[n][k][0] = poly[XX[i]].graph[j][k][0] + t; 
          paf_graph[n][k][1] = poly[XX[i]].graph[j][k][1]; 
          debug << " P["<<n<<"] = " << paf_graph[n][0][1] << " " << "k="<<k<< " c="<<poly[XX[i]].graph[j][k][0] + t<<" \n"; 
          if (k==1) debug << "\n\n PP = " << paf_graph[n][k][0] << " " << poly[XX[i]].graph[j][k][0] + t <<"\n"; 
        } 

       off = paf_graph[n][1][0]; 
       paf_graph[n][0][1] = i; 
       //paf_graph[n][1][0] = off; 

       paf_list[n].x = poly[XX[i]].point[j].x; 
       paf_list[n].y = poly[XX[i]].point[j].y; 

      } 
      debug << "\n"; 

t+= poly[XX[i]].point[0].x; 
} 

paf_graph[0][0][0] = n; 
paf_list[0].x = n; 
// function continues some more 

큰 코드 블록에서와 같이

210 I 3 개 여분 라인을 넣어 이상한 현상을 분리 : 배열 자체가

off = paf_graph[n][1][0]; 
paf_graph[n][0][1] = i; //this line also writes i to [n][1][0] 
//paf_graph[n][1][0] = off; //if I take the comment off this line it will 
          // write "off" to [n][0][1] as well 
          //so whatever I do they both have the same value 
          //and one is always wrong 

이상한 일이있다 [1000] [1000] [1] 단 INT 및 다른 좌표의 경우 잘 동작합니다. 나는 그것을 더 작게 만들려고 시도했다. 그러나 문제는 동일하다. 전달되는 값은 short int 내에서 100보다 낮다.

배열이 함수에 대한 참조로 전달되고 이후 메인 블록에서 사용되며 모든 값이 [i] [0] [1] [i] [0] [0] .

불행히도 코드가 매우 크기 때문에이 코드를 게시 할 수는 없지만 위에서 설명한 부분과는 별도로 문제가 격리되었다는 것을 두 번 확인했습니다.

이상한 행동이 왜 일어나는지 누군가 알고 있다면 도움을 주시기 바랍니다.

나는 mingw 컴파일러에서 알려진 오류 일 가능성이 있기 때문에 codeblocks에 태그를 추가 했습니까?

어쨌든 사전에 조언 해 주셔서 감사합니다.

답변

3

사용 사례를 단순화 한 후에 버그가 매우 분명 해집니다.

크기가 배열의 마지막 크기 크기와 같은 간단한 1 차원 배열을 사용합시다. 대신에 :

typedef short int long_graph[1000][1000][1]; 

것은 그냥 크기가 마지막 차원의 크기와 동일한 1 차원 배열 사용하자 : 이제

typedef short int tiny_graph[1]; 

을, 당신은 그런 일이 선언 :

tiny_graph x; 

이제 스스로에게 질문하십시오. 올바른 배열 색인은 무엇입니까?

답변은 매우 분명합니다. 하나만 : x[0]. 이 배열에는 하나의 값만 있습니다. 배열 인덱스는 0에서 시작합니다.

typedef short int long_graph[1000][1000][1]; 

를 그리고 이제 문제가있는 문장을 살펴 보자 :

이제, 배열로 돌아 가자

paf_graph[n][0][1] = i 

버그는 지금 매우 명백해야한다. [0]은이 배열의 마지막, 세 번째 차원의 마지막 유효한 인덱스이므로 paf_graph[n][0][1]이 없습니다. 그리고 배열이 포인터와 포인터 연산으로 붕괴되는 방식으로 인해 다음 상위 차원 배열의 [0]을 처리하게됩니다.

+0

감사합니다. 나는 그런 신인 선수 실수에 빠졌다는 것을 믿을 수 없다. – user3515319