2013-03-21 2 views
-2

segfault 때문에 컴파일 할 수 없습니다. 최대 용량을 표시하기 위해 트리 사분면을 사용하면 오류가 발생합니다. 이상하게도 기능 사분원 내부에서 작동하지만 삽입 점에서는 작동하지 않습니다. 트리 생성 기능은 훌륭하고 사분면입니다. 그러나 트리 쿼드런트 내부에있는 항목에 액세스하려고하면 (사분면이 NULL이 아니며 이전에 체크) segfault 문제 알림을 계속 실행합니다. 나는 그것이 매우 단순한 오류라고 두려워하지만 그것이 무엇인지 알 수 없다. 나는 인터넷에서 검색을 시도했지만 아무 것도 발견하지 못했지만이 전체 프로그램을 수행하는 데 시간이 부족합니다. 아무도 도와 줄 수 있습니까? 다만, 예를 들어, C - 이상한 Seg 오류 오류

#include <stdlib.h> 
    #include <stdio.h> 
    #include <float.h> 
    #include <limits.h> 



     typedef struct dot{ 
      double x; 
      double y; 
     }Dot; 


     typedef struct quadrant{ 
      int max_capacity, used_capacity; 
      Dot max,min; 
      Dot * dots_; 
     }Quadrant; 


     typedef struct quad_node * Quad_node_Pointer; 

     typedef struct quad_node{ 
      Quadrant * key; 
      Quad_node_Pointer child[4]; 
      Quad_node_Pointer father; 
     }Quad_node; 


     typedef struct tree{ 
      Quad_node * end_; 
      Quad_node * start_; 
     }Tree; 





     void insert_dot(Tree * A, Dot b){ 
      printf("lalala\n"); 
      Quad_node * Aux, *Aux2, * New_leafs[4]; 
      Dot min_aux,max_aux; 
      int i; 
      Aux=(Quad_node_Pointer) malloc (sizeof(Quad_node)); 
      Aux2=(Quad_node_Pointer) malloc (sizeof(Quad_node)); 
      printf("lalala\n"); 
      //Here's the segfault line: 
      printf("this doesnt works %i",A->start_->key->max_capacity); 

     void Create_quadrant (Quadrant * A, int capacity, Dot max, Dot min){ 
      A=(Quadrant*)malloc(sizeof(Quadrant)); 
      A->dots_ = (Dot*) malloc (capacity * sizeof(Dot)); 
      int i; 
      for (i=0;i<capacity;i++){ 
       A->dots_[i].x=-1; 
       A->dots_[i].y=-1; 
      } 
      A->max_capacity=capacity; 
      //But here it works perfectly. What's the diference from the other that do 
      //a segfault? 
      printf("\n this works \n %i \n",A->max_capacity); 
      A->used_capacity=0; 
      A->max.x=max.x; 
      A->max.y=max.y; 
      A->min.y=min.y; 
      A->min.x=min.x; 
      } 

    void Create_tree (Tree * A, int capacity){ 
     int i; 
     Dot max,min; 
     max.x=DBL_MAX; 
     max.y=DBL_MAX; 
     min.x=0; 
     min.y=0; 
     A->end_ = (Quad_node_Pointer) malloc (sizeof(Quad_node)); 
     A->start_=(Quad_node_Pointer) malloc (sizeof(Quad_node)); 
      for (i=0;i<4;i++){ 
       A->start_->child[i]=A->end_; 
      } 
      A->start_->father=A->end_; 

     Create_quadrant(A->start_->key,capacity,max,min); 
    } 

여기 메인있어 : 다음은 코드의

int main(int argc, char *argv[]) 
{ 
    Tree * A; 
    int i; 
    A = (Tree*) malloc (sizeof(Tree)); 
    Dot b,teste[10]; 
    b.x=5.0; 
    b.y=6.0; 
    Create_tree(A,8); 
    for (i=0;i<10;i++){ 
     teste[i].x=(double)2.0*i; 
     teste[i].y=(double)2.0*i; 
     insert_dot(A,teste[i]); 
    } 
    insert_dot(A,b); 
    free(A); 
    return EXIT_SUCCESS; 
} 

감사를 읽거나/나를 도와.

편집 : 기억하기 만하면 나는 잊었다. 삽입 점 기능이 가득 차 있지 않습니다. 초점은 segfault 문제입니다. 그리고 주된 기능은 전체 기능을 기반으로 실행되는 예제입니다. 죄송합니다. 하지만 내 문제는 지금이 이상한 segfault입니다. 나는 함수의 나머지 부분이 괜찮다고 생각하고, 더 간단한 (그리고 나머지 함수와는 관련이 없다) 질문을 생략하기 위해 생략했다.

+1

Segfaults는 컴파일 타임이 아닌 런타임에 발생합니다. GDB를 사용하여 디버깅을 시도하거나 Valgrind를 실행하십시오. –

+0

10 개가 넘는 요소를 반복하고 있기 때문에'Create_tree (A, 8)'이 빨리 보이지 않습니다. 'Create_tree (A, 10)'시도 – dchhetri

+0

디버깅했습니다. 오류가 켜져 있습니다 : // 여기에 segfault 줄이 있습니다 : printf ("this doesnt works % i", A-> start _-> key-> max_capacity); 하지만 왜 액세스 할 수 없거나 tree quadrant의 max_capacity를 인식하지 못하는지 알 수 없습니다. –

답변

2

가자 ... 나는 관련 코드를 보여주고 그 사이의 관련없는 라인은 무시한다.

A->end_ = (Quad_node_Pointer) malloc (sizeof(Quad_node)); 
    A->start_=(Quad_node_Pointer) malloc (sizeof(Quad_node)); 
    for (i=0;i<4;i++){ 
     A->start_->child[i]=A->end_; 
    } 
    A->start_->father=A->end_; 

좋아, 지금 A->start_A->end_가 초기화되지 않은 한 스토리지를 제외 :

첫째, 당신은

A = (Tree*) malloc (sizeof(Tree)); 
Create_tree(A,8); 

Create_tree 기능 A에 물건을 초기화한다 ... 스토리지를 할당하고 트리를 초기화 네 개의 자식 포인터를 A->start_->child[]에 설정했는지 확인하십시오.

이 시점에서 Create_quadrant을 호출하여 A->start_->key을 초기화하고 초기화되지 않은 포인터를 전달합니다. A->start_->key로 다시 밖으로 새로 초기화 사분면을 얻을 수있는 방법은 없습니다

void Create_quadrant (Quadrant * A, int capacity, Dot max, Dot min); 

: 여기

Create_quadrant(A->start_->key,capacity,max,min); 

은 함수 선언이다. 당신은 분명 그 함수의 첫 번째 라인은이 작업을 수행하기 때문에이 작업을 수행 할 : 데이터를 할당하는 책임을 져야하고이를 초기화하는 함수를 호출 할 경우

 A=(Quadrant*)malloc(sizeof(Quadrant)); 

이것은 지금까지 코드의 패러다임 나누기. init 함수가 함수 내부에 할당 된 포인터를 돌려주기를 원한다면, 함수를 반환하거나 이중 포인터를 전달해야합니다.

Quadrant * Create_quadrant (int capacity, Dot max, Dot min) 
{ 
    A=(Quadrant*)malloc(sizeof(Quadrant)); 
    //... 
    return A; 
} 

// Called like this: 
A->start_->key = Create_quadrant(capacity, max, min); 

그리고 옵션 2는 다음과 같습니다 :

그래서 옵션 1은

:

void Create_quadrant (Quadrant ** pA, int capacity, Dot max, Dot min) 
{ 
    A=(Quadrant*)malloc(sizeof(Quadrant)); 
    // ... 
    *pA = A;   
} 

// Called like this: 
Create_quadrant(&A->start_->key, capacity, max, min); 

내가 0 당신이 지금까지 사용했던 규칙을 계속하는 것입니다 옵션을 언급하는 것을 잊었다

// Called like this: 
A->start_->key = (Quadrant*)malloc(sizeof(Quadrant)); 
Create_quadrant(A->start_->key, capacity, max, min); 

// And obviously you DON'T malloc a new A inside Create_quadrant(). 
+0

감사합니다. 완벽하게 작동합니다. 죄송합니다. 평판이 필요하기 때문에 투표를 할 수 없지만 투표 할 때 반드시 기억해야합니다. 다시 말씀 드리지만 대단히 감사합니다. –

0

내 생각 엔 당신이 단지 Quad_node으로 메모리에 그들에게 많은 공간을 제공하고 있기 때문에 것은 차지할하지 malloc 당신의 Quadrant의 충분한 공간을 보내고있어, 그리고 아마도 Quad_nodeQuadrant보다 적은 공간을 차지한다는 것입니다 에스.