Использование структуры в C и C ++ - PullRequest
3 голосов
/ 27 июля 2011

Я новичок в C, и я хочу знать, как получить доступ к элементам внутри структуры, которая находится внутри структуры.

struct profile_t
{
    unsigned char length;
    unsigned char type;
    unsigned char *data;
};

typedef struct profile_datagram_t
{
    unsigned char src[4];
    unsigned char dst[4];
    unsigned char ver;
    unsigned char n;
    struct profile_t profiles[MAXPROFILES];     
} header;

Как получить доступ к элементам внутри profile_t ??

Ответы [ 5 ]

5 голосов
/ 27 июля 2011
struct profile_t;

Приведенный выше оператор не создает объект типа profile_t. Что вам нужно сделать, это -

struct profile_t inObj ;

Затем создайте объект для profile_datagram_t. то есть.,

header outObj ;  // header typedef for profile_datagram_t

Теперь вы можете получить доступ к таким элементам, как -

outObj.inObj.type = 'a' ; // As an example

В C ++ при создании объекта для структуры ключевое слово struct необязательно.


На ваш вопрос отредактируйте и прокомментируйте:

struct profile_t profiles[MAXPROFILES];

profiles - массив объектов типа profile_t. Чтобы получить доступ к отдельному объекту, просто используйте оператор []. то есть.,

header obj ;
obj.profiles[0].type = 'a' ; // Example

obj.profiles[i], где i может принимать значения от 0 до MAXPROFILES - 1 , дает объект с индексом i.

2 голосов
/ 27 июля 2011

Не уверен, что происходит в C, но в C ++, кроме всего остального, следующее объявляет два типа.

struct profile_datagram_t
{
    struct profile_t;
};

Один тип называется profile_datagram_t, а другой - profile_datagram_t::profile_t. Внутреннее объявление типа - это просто предварительное объявление, поэтому вам нужно определить тип после.

struct profile_datagram_t::profile_t
{
    // ...
};

Затем вы можете использовать структуру следующим образом:

int main ( int, char ** )
{
    profile_datagram_t::profile_t profile;
}
2 голосов
/ 27 июля 2011

Некоторые компиляторы поддерживают нестандартное расширение языка C (которое мне действительно нравится, несмотря на то, что оно нестандартное), называемое анонимными структурами (или объединениями). Демонстрация кода:

struct x {
  int i;
};

struct y {
  struct x;
};

int main(void)
{
    struct y;
    y.i = 1; // this accesses member i of the struct x nested in struct y
    return 0;
}

В двух словах, если вы не дадите члену struct (или union) имя, вы можете получить доступ к его членам непосредственно из содержащего struct (или union). Это полезно в ситуациях, когда вы могли бы дать ему имя _, и вам пришлось бы делать y._.i - синтаксис анонимной структуры намного проще. Однако это означает, что вы должны запомнить имена всех членов обоих struct s и убедиться, что они никогда не конфликтуют.

Это все, конечно, нестандартное расширение, и его следует использовать с осторожностью. Я считаю, что он работает на MSVC и может быть включен в GCC с помощью коммутатора. Не знаю ни о каких других компиляторах. Если вы беспокоитесь о переносимости, дайте члену правильное имя.

РЕДАКТИРОВАТЬ: В соответствии со ссылкой GCC (ниже), это поведение добавляется в предстоящий стандарт C1X, поэтому он не будет нестандартным в течение длительного времени. Я сомневаюсь, что MSVC будет поддерживать C1X, поскольку они отказываются поддерживать C99 как есть, но по крайней мере эта функция становится частью стандарта.

Однако приведенное выше поведение относится только к MSVC. Синтаксис C1X (и GCC без ключа -fms-extensions) не позволяет безымянному члену struct иметь имя:

struct y {
  struct {
    int i;
  };
};

int main(void) {
    struct y;
    y.i = 1; // this accesses member i of the struct x nested in struct y
    return 0;
}

Ссылки на различные компиляторы (они имеют разные имена, но имеют одну и ту же концепцию):
GCC (безымянные поля): http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html'
MSVC (анонимные структуры): http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx

0 голосов
/ 27 июля 2011

В основном вы можете использовать следующий формат:

variable = profile_t.element
profile_t.element = ?
0 голосов
/ 27 июля 2011

РЕДАКТИРОВАТЬ: в вашем объявлении profile_datagram_t правильное определение для struct profile_t должно быть:

struct profile_t someProfile;

Допустим, у вас есть:

header profileDiagram1;
struct profile_t profile1;
profileDiagram1.someProfile = profile1;

Чтобы получить доступ к длине, введите или * данные из profile_t:

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