Можно ли отправить только одну переменную из структуры, если эта структура существует в виде массива? - PullRequest
1 голос
/ 31 марта 2019

Я прошу прощения, если это кажется простым, я все еще учусь, и я новичок в C.

У меня есть это как моя структура:

struct Game{
   char id;
   char name[50];
   char genre[20];
   char platform[15];
   char company[30];
   float price;
   int quantity = 10; 
};

И это объявлено какмассив масс:

struct Game gList[30];

У меня есть функция, в которой я передаю весь 'gList' для поиска по значениям в переменных gList [i] .name.

Так что мой вопрос, возможно ли отправить в функцию только часть gList [i] .name структуры в качестве параметра? (Т. Е. Все значения 30 name ).

Ответы [ 2 ]

1 голос
/ 31 марта 2019

номер

Но вы можете создать массив указателей, которые указывают на поле name и передать его функции:

char* ptr[30];
for(int i = 0; i < 30; i++)
    ptr[i] = gList[i].name;

func(ptr);
0 голосов
/ 31 марта 2019

Нет, ты не можешь.Тем не менее, вы можете передавать итераторы в функции просто отлично.Типичный образец:

struct context { struct Game *gList; int nList; int i; }
char *iter_names(void *baton)
{
    struct context *ptr = baton;
    if (ptr->i == ptr->nList) return NULL;
    return ptr->gList[ptr->i++].name;
}


void wants_name_array(char (*nextname)(void *), void *baton)
{
    while (char *name = nextname(baton))
    {
        printf("%s\n", name);
        /* and whatever else you are doing */
    }
}

/* ... */
    struct context baton = { gList, 30, 0 };
    wants_name_array(iter_names, baton);

Да, это выглядит довольно плохо.К счастью, gcc имеет расширение, которое делает это намного лучше.

void wants_name_array(char (*nextname)())
{
    while (char *name = nextname())
    {
        printf("%s\n", name);
        /* and whatever else you are doing */
    }
}

/* ... */
{
     int i = 0;
     char *nextname()
     {
         if (i == 30) return NULL;
         return gList[i++].name;
     }
     wants_name_array(nextname);
}

При использовании этого конкретного расширения gcc никогда не возвращайте вложенные функции.Неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...