2017-11-07 3 views
0

int 값을 기반으로 struct에서 구조체 배열을 정렬하려고합니다. 나는 구조체의 배열을 성공적으로 정렬했지만 중첩 된 구조체의 어딘가에 잘못된 값을 전달하고 있다고 생각합니다.qsort 구조체의 배열 구조체 배열

배열의 구조체에 a 값만 정렬하면됩니다. 나는 비교 기능이

struct s2{ 
    int a; 
    int b; 
}; 

struct s1{ 
    int c; 
    struct s2 arr[10]; 
} 

:

구조체는 다음과 같이 설정되어

int comp(const void *a, const void *b){ 

    struct s1 *q1 = (struct s1 *)a; 
    struct s1 *q2 = (struct s1 *)b; 

    return(q1->arr->a - q2->arr->a); 
} 

을 그리고 qsort가 호출

: 입력을 위해

struct s1 myStruct; 
size_t theLen = sizeof(myStruct.arr)/sizeof(struct s2); 
qsort(myStruct.arr, 10, theLen, comp); 

10, 5, 7, 20, 17, 9, 3, 11, 15, 1 

내가 얻을 출력 : 내가 추측하고있어

2147451181, 589824, 327680, 65536, 131072, 4, 5, 11, 15, 8 

내가 길이를 선언하는 방법을 함께 할 수있는 뭔가 할 수있다?

감사합니다.

파일 라인은 :

10 5 7 20 17 9 3 11 15 1 

myStruct.arr는 fgets와 sscanf를 사용하여 파일을 입력으로 충전된다 [I] .A :

fgets(t, sizeof(t), fp); 
sscanf(t, "%d,...,%d", &myStruct.arr[0].a,...,&myStruct.arr[9].a); 

myStruct.arr [I]은 .B을 당신은정렬되어

for(int i = 0; i < 10; i++){ 
    myStruct.arr[i].b = i+1; 
} 

답변

1

코드 두 실수는를 사용해야하는 위치 당신은 q1->arr->a을 사용하는

  1. 비교할 수 있습니다(여기서 q1const struct s2입니다). 이것도 @GauravSehgal에 의해 설명되었습니다. answer

  2. qsort의 세 번째 인수를 살펴보면, 각 요소의 크기를 바이트 단위로 비교할 수 있습니다. 그러나 당신은 요소의 수를 통과했습니다.

    qsort(myStruct.arr, 10, sizeof(struct s2), comp);

을 당신이 원하는 결과를 얻어야한다 -에 전화를 변경합니다.당신이 const 규정을 버리고 싶지 않기 때문에

  1. 유형 const struct s2*의 수 q1q2를 선언 -

    당신이 (@Stargateur 지적)을 돌볼 필요가 몇 가지 다른 점이있다 . 그들이 어떤 CONST 타입의 포인터로 자동-촉진 형 const void*의 때문에 q1q2에 할당 ab 명시 적으로 동안

  2. 캐스팅하지 마십시오.

+0

버려진 const 한정자이기 때문에 OP 캐스트가 잘못되었습니다 (쓸모없는'void const *'는 자동 승격입니다) : struct s2 const * q1 = a; struct s1 const * q2 = b; ' – Stargateur

+0

@Stargateur 감사합니다. 메모를 추가하겠습니다. –

1
qsort(myStruct.arr, 10, theLen, comp); 

을 : for 루프 가득 각각의 요소가 비교 .SO 형 struct s2의 여기는

int comp(const void *a, const void *b){ 

struct s2 *q1 = (struct s2 *)a; 
struct s2 *q2 = (struct s2 *)b; 

return(q1->a - q2->a); 
} 

EDIT 같아야 qsort 세 번째 파라미터가 있어야 sorted.So으로 어레이의 각 요소의 크기

qsort(myStruct.arr, theLen, sizeof(struct s2), comp); 
+0

이 확실히 내가 가진 것보다 더 의미가 있습니다,하지만 불행히도, 그것은 여전히 ​​임의 출력주고 : 4, 589,824, 11, 65551, 131072, 65536, 5, 196608, 0, 17 내가 말 안을 무작위 ... 매번 같은 결과물입니다. – Strobe00

+0

'myStruct.arr'을 채우는 곳에 완전한 코드를 표시해야합니다. –

+0

질문에 코드를 추가했습니다. – Strobe00