簡體   English   中英

C 將結構傳遞給函數

[英]C Passing Struct To Function

我正在嘗試將具有預定義數據的結構傳遞給函數,因此我不必對多個結構使用多個函數,但我只能對多個結構使用 1 個函數。

結構如下所示:

typedef struct {
    char* vehicleName;
    char* previewDir;
    char* previewName;
} vehicleSpawner;

vehicleSpawner vehicleSport[] = {{"adder","lgm_default","adder"},{"autarch","",""},{"banshee2","lsc_jan2016","banshee2"},{"bullet","lgm_default","bullet"}};
vehicleSpawner vehicleSportTwo[] = {{"adder","lgm_default","adder"},{"autarch","",""},{"banshee2","lsc_jan2016","banshee2"},{"bullet","lgm_default","bullet"}};
vehicleSpawner vehicleSportThree[] = {{"adder","lgm_default","adder"},{"autarch","",""},{"banshee2","lsc_jan2016","banshee2"},{"bullet","lgm_default","bullet"}};

現在要在結構中顯示信息,我必須使用 3 個單獨的函數,如下所示。

void vehicleSport() {
    menu.title("Sport");

    for (int i = 0; i < 3; i++) {
        char* name = UI::_GET_LABEL_TEXT(vehicleSport[i].vehicleName);
        Hash key = GAMEPLAY::GET_HASH_KEY(vehicleSport[i].vehicleName);

        if(!GAMEPLAY::ARE_STRINGS_EQUAL(name, "NULL")) menu.option(name).vehicleSpawn(key).vehiclePreview(vehicleSport[i].previewDir, vehicleSport[i].previewName);
    }
}

void vehicleSport2() {
    menu.title("Sport Two");

    for (int i = 0; i < 3; i++) {
        char* name = UI::_GET_LABEL_TEXT(vehicleSportTwo[i].vehicleName);
        Hash key = GAMEPLAY::GET_HASH_KEY(vehicleSportTwo[i].vehicleName);

        if(!GAMEPLAY::ARE_STRINGS_EQUAL(name, "NULL")) menu.option(name).vehicleSpawn(key).vehiclePreview(vehicleSportTwo[i].previewDir, vehicleSportTwo[i].previewName);
    }
}

void vehicleSport3() {
    menu.title("Sport Three");

    for (int i = 0; i < 3; i++) {
        char* name = UI::_GET_LABEL_TEXT(vehicleSportThree[i].vehicleName);
        Hash key = GAMEPLAY::GET_HASH_KEY(vehicleSportThree[i].vehicleName);

        if(!GAMEPLAY::ARE_STRINGS_EQUAL(name, "NULL")) menu.option(name).vehicleSpawn(key).vehiclePreview(vehicleSportThree[i].previewDir, vehicleSportThree[i].previewName);
    }
}

我想要實現的是能夠只使用一個函數而不是一個函數來處理我擁有的結構數量,並且每次都重復相同的函數。

我嘗試過的是使用不同的函數傳遞它,然后從那里在“動態函數”中訪問它,如下所示:

char* vehicleSpawnerTitle;
struct structurename;

void vehicleSpawnerItemMenu() {
    menu.banner(vehicleSpawnerTitle);

  for (int i = 0; i < sizeof(structurename)/sizeof(structurename[0]); i++) {
        Hash key = GAMEPLAY::GET_HASH_KEY(structurename[i].vehicleName);
        char* name = UI::_GET_LABEL_TEXT(VEHICLE::GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(key));

        if(STREAMING::IS_MODEL_VALID(key) && STREAMING::IS_MODEL_A_VEHICLE(key) && !GAMEPLAY::ARE_STRINGS_EQUAL(name, "NULL"))  menu.option(name).vehicleSpawn(key).vehiclePreview(structurename[i].previewDir, structurename[i].previewName);
  }
}

void setVehicleSpawnerVar(char* title, struct structname) {
    vehicleSpawnerTitle = title;
    structurename = structname;
}

希望有人可以幫助我!

假設您嘗試將 3 個功能vehicleSportvehicleSport2vehicleSport3結合起來,您應該能夠通過以下方式實現:

void vehicleSport(vehicleSpawner *spawner, size_t number_of_spawners_in_array) {
    menu.title("Sport >>>I ommitted the number here, you can add it if you wish easily<<<");

    for (size_t i = 0; i < number_of_spawners_in_array; i++) {
        char* name = UI::_GET_LABEL_TEXT(spawner[i].vehicleName);
        Hash key = GAMEPLAY::GET_HASH_KEY(spanwer[i].vehicleName);

        if(!GAMEPLAY::ARE_STRINGS_EQUAL(name, "NULL")) menu.option(name).vehicleSpawn(key).vehiclePreview(spawner[i].previewDir, spawner[i].previewName);
    }
}

並調用函數

vehicleSport(vehicleSport, 4);
vehicleSport(vehicleSportTwo, 4);
vehicleSport(vehicleSportThree, 4);

或者,如果您害怕數組的硬編碼大小,可以這樣稱呼它:

vehicleSport(vehicleSport, sizeof(vehicleSport) / sizeof(vehicleSport[0]);

此外,如果所有三個數組始終具有相同的大小,您可以完全省略長度並將其硬編碼到函數中。 但我會避免這種情況,並且總是明確地交出長度。

但請注意,由於初始示例無法編譯,因此上面的代碼可能包含輸入錯誤 - 您必須自行添加適當的標頭包含指令。 此外,按照您的要求,這是一個C 解決方案- 但您的代碼顯然是 C++。

希望這能回答您的問題,盡管我擔心即使確實如此,我也可能需要進一步解釋為什么數組在函數中顯示為指針並且您仍然可以對它們進行索引?

暫無
暫無

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

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