2016-07-09 3 views
0

이 상황을 알고 싶습니다.C (동적 할당)의 qsort

나는이 문장을 정의 할 때

struct soccer team[100] ; 
내가 qsort가 작업을 수행 할 수 있습니다

; 내가 동적 할당을 수행 할 때

qsort(team, MAX , sizeof(team[0]) , compare) ; 
int compare(const void *a, const void *b) 
{ 
    SOC *A1 = (SOC*)a ; 
    SOC *B1 = (SOC*)b ; 

    if(A1->score > B1->score) 
     return -1 ; 
    else if (A1->score == B1->score) 
     return 0 ; 
    else 
     return 1 ; 
} 

struct soccer*team[MAX] ; 
team[Index] = (SOC*)malloc(sizeof(SOC)) ; 

오류가 존재한다.

내가 (동적 할당 구조체에 대한 qsort가)를 사용합니까 방법을 알고 싶어요 (qsort가와 비교는 동일)

하십시오!

예 (I는 첫 번째 방법을 사용할 때)

Man 3 1 1 16 
Che 2 2 2 8 
Asn 0 6 0 6 
hot 6 0 0 18 
City 0 0 6 0 
Bar 1 5 0 8 

가 변환

hot 6 0 0 18 
Man 3 1 1 16 
Che 2 2 2 8 
Bar 1 5 0 8 
Asn 0 6 0 6 
City 0 0 6 0 
+0

"qosrt 함수와 비교 동일"하다 동일한 기능을 비교 한 다른 요소 유형에 이용되지 않아야하기 때문에 나쁘다. – MikeCAT

+0

['malloc()'의 반환 값과'C'의 패밀리를 형 변환하지 않는 이유에 대한이 토론을보십시오.] (http://stackoverflow.com/q/605845/2173917). –

+0

내 실수! 원본 코드 : typedef struct soccer SOC; –

답변

1

최초 버전

struct soccer team[100] ; 

및 두번째

struct soccer*team[MAX] ; 
team[Index] = (SOC*)malloc(sizeof(SOC)) ; 

은 같지 않습니다. 첫 번째 배열은 struct soccer 배열이고 두 번째 배열은 struct soccer * 배열입니다. 그들은 단지 동일하지 않습니다. 당신이 위와 같은 동작을 (포인터 포함) 이후 버전을 사용하고 얻고 싶은 경우에

, 당신은

struct soccer * team; 
team = malloc(sizeof *team * SIZE) ; // SIZE is the number of elements  
+0

예, 이해합니다. qsort (동적 할당)를 사용할 때 사용 방법을 알고 싶습니다. –

+0

@CherubimAnand 아니요, 'sizeof * team'입니다. 데이터 유형을 확인하십시오. –

+0

@ CherubimAnand right하지만,'a = malloc (sizeof * a * SIZE) '를 쓰는 것을 멈추게하는 것은 아무것도 없다. –

0

동일한을 비교 한 기능이 다른 요소 유형에 사용할 수없는 뭔가를 할 수 있습니다. 이 같은 올바른을 비교 한 기능을 사용 (포인터가 구조체에 도착하도록 역 참조 있도록 포인터 요소에 대한 포인터, 제공됩니다) :

int compare2(const void *a, const void *b) 
{ 
    SOC *A1 = *(SOC**)a ; 
    SOC *B1 = *(SOC**)b ; 

    if(A1->score > B1->score) 
     return -1 ; 
    else if (A1->score == B1->score) 
     return 0 ; 
    else 
     return 1 ; 
} 

참고 : 그들은 you shouldn't cast the result of malloc() in C을 말한다.

+0

코드를 삽입하면 프로그램에 오류가 있습니다. –

+0

@ 박기현 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)을 게시하여 문제를 해결하십시오. – MikeCAT

0

다음은 유사한 배열을 정렬하는 방법을 보여주는 데모 프로그램입니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define MAX 10 

typedef struct soccer 
{ 
    unsigned int score; 
} SOC; 

int cmp(const void *a, const void *b) 
{ 
    const SOC *lhs = *(const SOC **)a; 
    const SOC *rhs = *(const SOC **)b; 

    return (lhs->score > rhs->score) - (rhs->score > lhs->score); 
} 

int main(void) 
{ 
    SOC * team[MAX]; 

    srand((unsigned int)time(NULL)); 

    for (int i = 0; i < MAX; i++) 
    { 
     team[i] = malloc(sizeof(SOC)); 
     team[i]->score = rand() % MAX; 
    }  

    for (int i = 0; i < MAX; i++) 
    { 
     printf("%u ", team[i]->score); 
    } 
    printf("\n"); 

    qsort(team, MAX, sizeof(SOC *), cmp); 

    for (int i = 0; i < MAX; i++) 
    { 
     printf("%u ", team[i]->score); 
    } 
    printf("\n"); 

    for (int i = 0; i < MAX; i++) free(team[i]); 

    return 0; 
} 

프로그램 출력

2 7 2 5 1 6 1 5 0 4 
0 1 1 2 2 4 5 5 6 7 
+0

team [i] = malloc (sizeof (SOC)); ->이 유형 오류입니까? –

+0

@ 박기현 프로그램을 사용해 보셨습니까? 이 성명서에 무슨 문제가 있습니까? –

+0

오류 : "void *"유형의 값을 "SOC *"유형의 엔티티에 할당 할 수 없습니다. –