Форум программистов, компьютерный форум CyberForum.ru

Присвоение значений элементам вложенной структуры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 10:25     Присвоение значений элементам вложенной структуры #1
Необходимо присвоить значение элементам массива структур
C++
1
2
3
4
5
6
7
8
struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
        };
    } Message[6];
Как присвоить значения элементам основной структуры понятно
C++
1
2
Message[1].code= 0xC0;
Message[1].length = 1;
А как присвоить значения элементам вложенной структуры?

Присвоение в таком виде
C++
1
Message[1] = {{0xC0, 1}, 0xA1};
выдает следующие ошибки
H:\U1_Server\U1_Server.cpp(143) : error C2059: syntax error : '{'
H:\U1_Server\U1_Server.cpp(143) : error C2143: syntax error : missing ';' before '{'
H:\U1_Server\U1_Server.cpp(143) : error C2143: syntax error : missing ';' before '}'
H:\U1_Server\U1_Server.cpp(143) : error C2143: syntax error : missing ';' before ','


Объясните, пожалуйста, как правильно сделать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 10:54     Присвоение значений элементам вложенной структуры #2
у тебя вложенная структура объявлена, но не объявлено поле, которое будет иметь тип этой структуры
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include  <iostream>
 
struct foo
{
    char c;
    struct bar
    {
    int j;
    } b;
};
 
int main()
{
    foo f = {'a', {4}};
 
    std::cout << f.c << " " << f.b.j << std::endl;
}
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 11:13  [ТС]     Присвоение значений элементам вложенной структуры #3
C++
1
2
3
4
5
6
7
8
9
10
struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
        } Body; 
} Message [6]; 
 
Message [1] = {0xC0, 0x00, {0xA1}};
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 11:32     Присвоение значений элементам вложенной структуры #4
Heidel, индексация массивов в С/С++ начинается с нуля
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 11:37  [ТС]     Присвоение значений элементам вложенной структуры #5
Не получается все равно.
Если вынести кусок кода в отдельную программу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main ()
{
    struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
        } Body; 
    } Message [6]; 
 
    Message [0] = {0xC0, 0x00, {0xA1}};
 
return 0;
}
выдаст ошибки

Compiling...
11.cpp
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2059: syntax error : '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2143: syntax error : missing ';' before '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2059: syntax error : '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : warning C4508: 'main' : function should return a value; 'void' return type assumed
H:\Ëàáû Ñ++\11\11.cpp(14) : error C2143: syntax error : missing ';' before 'return'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
Error executing cl.exe.

11.obj - 7 error(s), 1 warning(s)
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 11:46     Присвоение значений элементам вложенной структуры #6
УМВР:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include  <iostream>
 
int main()
{
    struct foo
    {
    char c;
    struct bar
    {
        int j;
        char* pch;
    } b;
    };
    
    foo f[1];
    f[0] = {'a', {4}};
 
    std::cout << f[0].c << " " << f[0].b.j << std::endl;
}
и да, вместо магических чисел лучше использовать именованные константы
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 12:56  [ТС]     Присвоение значений элементам вложенной структуры #7
Nameless One, твоя программа в строке
C++
1
f[0] = {'a', {4}};
выдает ровно те же ошибки что и моя:

H:\Ëàáû Ñ++\11\11.cpp(36) : error C2059: syntax error : '{'
H:\Ëàáû Ñ++\11\11.cpp(36) : error C2143: syntax error : missing ';' before '{'
H:\Ëàáû Ñ++\11\11.cpp(36) : error C2059: syntax error : '{'
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 13:00     Присвоение значений элементам вложенной структуры #8
Heidel, значит, твой компилятор не поддерживает новый стандарт
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 13:15  [ТС]     Присвоение значений элементам вложенной структуры #9
Nameless One, у меня и в Microsoft Visual C++, и в С++ Builder 6 при компляции ошибка в этой строке, больше мне её попробовать откомпилировать не в чем. Подскажи, как должно быть написано в таком случае, чтобы успешно откомпилировалось?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.11.2011, 13:44     Присвоение значений элементам вложенной структуры #10
C++
1
2
3
Message[0].code = 0xC0;
Message[0].length = 0x00;
Message[0].body.id = 0xA1;
и все это завернуть в какую-нибудь функцию. Или лучше воспользоваться классами, и не мучаться (пишешь ведь в С++)
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 15:11  [ТС]     Присвоение значений элементам вложенной структуры #11
Nameless One, понятно, спасибо. я просто думала, есть еще какой-то способ, кроме как присваивать значение каждому полю структуры.
Сыроежка
Заблокирован
29.11.2011, 15:19     Присвоение значений элементам вложенной структуры #12
Цитата Сообщение от Heidel Посмотреть сообщение
Не получается все равно.
Если вынести кусок кода в отдельную программу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main ()
{
    struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
        } Body; 
    } Message [6]; 
 
    Message [0] = {0xC0, 0x00, {0xA1}};
 
return 0;
}
выдаст ошибки

Compiling...
11.cpp
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2059: syntax error : '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2143: syntax error : missing ';' before '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : error C2059: syntax error : '{'
H:\Ëàáû Ñ++\11\11.cpp(12) : warning C4508: 'main' : function should return a value; 'void' return type assumed
H:\Ëàáû Ñ++\11\11.cpp(14) : error C2143: syntax error : missing ';' before 'return'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
H:\Ëàáû Ñ++\11\11.cpp(15) : error C2143: syntax error : missing ';' before '}'
Error executing cl.exe.

11.obj - 7 error(s), 1 warning(s)
Массив можно инициаизировать при его объявление. Поэтому вам следует объединить ваших два предложения в одно

C++
1
2
3
4
5
6
7
8
    struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
        } Body; 
    } Message [6] = { { 0xC0, 0x00, { 0xA1 } } };
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 15:24  [ТС]     Присвоение значений элементам вложенной структуры #13
Сыроежка, Message [6] - это массив из 6 структур типа message, и в приведенном куске кода я присваивала значения полям только одной структуры массива, а нужно всем 6-и.
Bers
Заблокирован
29.11.2011, 15:31     Присвоение значений элементам вложенной структуры #14
Heidel, может что-то типа такого?

(правда, на мой взгляд слишком заудренно)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct message 
{
    unsigned char code;
    unsigned short length;
    
    struct body 
    {
        unsigned char id;
        char* str;
        body(){}
        body(const unsigned char nId, char*nStr): id(nId), str(nStr){}
        body(const body& rhs): id(rhs.id), str(rhs.str){}
                        
    } m_body;
 
    message(){}
    message(const unsigned char nCode, const unsigned short nLength, const body& rhs):
                                                                          code(nCode), length(nLength), m_body(rhs){}
    
} ;
 
 
int main()
{
    message mess[3];
    mess[0]= message(10,10, message::body(10,"556") );
     
    return 0;
}
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char* str;
    } Body; 
} Message [3] = {    { 0xC0, 0x00, { 0xA1 } } ,
                     { 0xC0, 0x00, { 0xA1 } },
                     { 0xC0, 0x00, { 0xA1 } }     }; 
 
//правда, это лишь инициализация
//а не присваивание.
//присваивать так массиву уже не получится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 15:43     Присвоение значений элементам вложенной структуры
Еще ссылки по теме:

Присвоение значений C++
C++ Присвоение значений элементам двумерного динамического массива
Друзья шаблонного класса. Использование вложенной в класс структуры C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
29.11.2011, 15:43  [ТС]     Присвоение значений элементам вложенной структуры #15
Bers, да, можно было как во втором варианте кода объявить массив структур, и сразу присвоить значения полям каждого элемента массива.
Yandex
Объявления
29.11.2011, 15:43     Присвоение значений элементам вложенной структуры
Ответ Создать тему
Опции темы

Текущее время: 11:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru