2017-09-25 63 views
2

我有一个结构,并希望使用合并排序来对结构的数组进行排序。 我需要将排序参数传递给合并函数并访问结构成员。 这可以在C中完成吗?访问具有C中的变量或指针的结构成员

例如:

struct movie_imdb_data { 
    char color[15]; 
    char director_name[100]; 
    int num_critic_for_reviews; 
    int duration; /// in min not date and time 
    int director_facebook_likes; 
    int actor_3_facebook_likes; 
    char actor_2_name[100]; 
    int actor_1_facebook_likes; 
    int gross; 
}; 
main功能

,我有:

if (argc > 2) { 
     column_sort = argv[2]; 
    } 

现在我想打电话给merge_sort(<array of struct>, <column_sort *>)

我可以访问该成员在阵列中作为array[0]->column_sort比较?

现在我想打电话给归并排序,并通过

我想通过阵列和排序参数(即我需要排序的数组),我可以用一个变量来代替一个成员的名字,即。 。

arr[1].column_sort 

,而不是

arr[1].color 
+1

'现在我想调用合并排序并通过'通过,什么? – Michi

+0

通过'* argv []'传递的“排序参数”是什么意思? –

+0

也许你需要结构中给定成员的偏移? C的'offsetof()'宏是'stddef.h'中的ANSI C库特征。它计算结构或联合类型中给定成员的偏移量(以字节为单位),作为size_t类型的表达式。 –

回答

3

听起来像是你想利用命令行参数该字段指定字段的名称进行排序,然后排序。

对于这一点,尝试像代码:

#include <stdlib.h> 
#include <string.h> 

/* compare function for field 3: "num_critic_for_reviews" */  
int compField3(const void *a, const void *b) 
{ 
    struct movie_imdb_data* aStruct = (struct movie_imdb_data*)a; 
    struct movie_imdb_data* bStruct = (struct movie_imdb_data*)b; 
    return (aStruct->num_critic_for_reviews < bStruct->num_critic_for_reviews)? 
     -1: (aStruct->num_critic_for_reviews > bStruct->num_critic_for_reviews)? 
      +1: 0; 
} 

/* also define other compare functions for each field */ 

int main() 
{ 
    const char* columnName = argv[2]; 
    struct movie_imdb_data* parray; 
    parray = your-array; 
    int (*comp)(const void *, const void *, void *) = 0; 

    /* map the column name to compare function for that column */ 
    if (strcmp(columnName, "num_critic_for_reviews") == 0) 
    { 
     comp = compField3; 
    } 
    /* map other names to compare function for column */ 
    else if (...) {...} 
    else { exit(1); /* if not recognized column name */ } 

    qsort(parray, numElementsOfArray, sizeof(struct movie_imdb_data), comp); 
    ... 
} 

希望这有助于!

+0

@chqrlie是的,同意!我已更新我的示例代码。 –

0

有不同的方法,您的问题:

  • 你可以写不同的功能来比较特定字段结构。在main中,您将通过测试字段的名称(或可能不是字段名称的通用名称)来选择适当的比较函数。然后,您会将此比较函数传递给mergesort(或qsort ...)。

  • 如果所有成员都具有相同的类型,则可以使用宏offsetof(type, member)确定结构起始处字段的偏移量。没有通用的方法来计算这些偏移量,您需要编写一系列测试或使用表格。比较函数将使用强制类型转换来访问成员:

    size_t member_offset = offsetof(struct movie_imdb_data, duration); 
    
    int comp_int_member(const void *a1, const void *a2) { 
        const int *p1 = (const int *)((const unsigned char*)a1 + member_offset); 
        const int *p2 = (const int *)((const unsigned char*)a2 + member_offset); 
    
        return (*p1 > *p2) - (*p1 < *p2); 
    } 
    

    后一种方法的缺点是它只能处理与给定类型的字段。