簡體   English   中英

使用C中的變量或指針訪問結構成員

[英]access struct member with a variable or pointer in C

我有一個結構,想要使用合並排序對結構數組進行排序。 我需要將sorting參數傳遞給merge函數並訪問struct成員。 可以用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

聽起來好像您想使用命令行參數來指定要排序的字段名稱,然后對該字段進行排序。

為此,請嘗試如下代碼:

#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);
    ...
}

希望這可以幫助!

有多種方法可以解決您的問題:

  • 您可以編寫單獨的函數來比較特定字段上的結構。 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); } 

    后一種方法的缺點是它只能處理具有給定類型的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM