C Передача структуры в функцию - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь передать структуру с предопределенными данными в функцию, поэтому мне не нужно использовать несколько функций для нескольких структур, но я просто могу использовать 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;
}

Надеюсь, кто-нибудь поможет мне в этом!

1 Ответ

0 голосов
/ 06 января 2019

Если вы попытаетесь объединить 3 функции vehicleSport, vehicleSport2 и vehicleSport3, вы должны достичь этого путем:

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 ++.

Надеюсь, это ответит на ваш вопрос, хотя я боюсь, что даже если это произойдет, мне, возможно, придется немного подробнее объяснить, почему массивы отображаются в виде указателей в функции, и, тем не менее, вы можете индексировать их?

...