Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проинициализировать константное поле структуры, При динамической инициализации. ANSI C. 
:(
    Опции темы
Dreamer_0x01
Дата 26.10.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Здравствуйте.
Есть структура, внутри нее - константное поле.
Компилятор не поддерживает С++, только ANSI C.

При статическом объявлении проблем с инициализацией такого поля не возникает.
Но как мне проинициализировать его, если структура создается динамически?

Пример:
Код

typedef struct 
{
  const int param1;
  int param2;
}MYSTRUCT;

MYSTRUCT x = {1,2}; //Это, разумеется, проходит

MYSTRUCT * CreateMyStruct(int param1, int param2)
{
  MYSTRUCT * s = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
//  s->param1 = param1;//Это, разумеется, компилятор не съест. Как проинициализировать такое поле?
  s->param2 = param2;
  return s;
}



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
zim22
Дата 26.10.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



можно memcpy скопировать. но это грязный хак...
Код

memcpy(&(s->param1), &param1, sizeof(int));



--------------------
PM MAIL   Вверх
mes
Дата 26.10.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Dreamer_0x01 @  26.10.2009,  18:52 Найти цитируемый пост)
 только ANSI C.

я вот не помню, разве в ANSI C есть const ?


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 26.10.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



может через union?
PM MAIL ICQ   Вверх
Andrey44
Дата 27.10.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Код

typedef struct 
{
  const int param1;
  int param2;
}MYSTRUCT;



MYSTRUCT * CreateMyStruct(int param1, int param2)
{
  MYSTRUCT * s = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
  MYSTRUCT x = {1,2}; //Это, разумеется, проходит
  s = &x;
  return s;
}



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 27.10.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Цитата(zim22 @  26.10.2009,  21:34 Найти цитируемый пост)
можно memcpy скопировать. но это грязный хак...

Получилось, правда, с пренудительным преобразованием указателя к void *, без него компилятор рушаля. Получилось так:
Код

memcpy((void*)&(s->param1), &param1, sizeof(int));


Но решение Andrey44 мне показалось более простым и аккуратным, хотя в нем тоже есть минус - отжирается больше места в стеке. 
Сдедал так, работает:
Код

  MYSTRUCT x = {param1,param2}, *s;
  s = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
  s = &x;
  return s;


Тем не менее, всем спасибо!

 
Цитата(mes @  26.10.2009,  22:11 Найти цитируемый пост)
я вот не помню, разве в ANSI C есть const

Конечно, есть. Я работал с компиляторами, в которых поддержка ++ даже и не предполагалась(например, keil) - константы были.
И в книжках по С тоже константы видел.




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
azesmcar
Дата 27.10.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Dreamer_0x01 @  27.10.2009,  11:03 Найти цитируемый пост)
  MYSTRUCT x = {param1,param2}, *s;
  s = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
  s = &x;
  return s;

А зачем тогда нужен malloc? smile
Да и тут возвращение указателя на локальный объект. 

Это сообщение отредактировал(а) azesmcar - 27.10.2009, 11:15
PM   Вверх
zim22
Дата 27.10.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Dreamer_0x01 @  27.10.2009,  10:03 Найти цитируемый пост)
Но решение Andrey44 мне показалось более простым и аккуратным

мне оно тоже сначало таким показалось, но
Цитата(azesmcar @  27.10.2009,  10:12 Найти цитируемый пост)
тут возвращение указателя на локальный объект. 




--------------------
PM MAIL   Вверх
Dreamer_0x01
Дата 27.10.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Да, сначала сделал, потом сам мообразил, что не годится. Тогда делаем вариант 
zim22. 


Цитата(azesmcar @  27.10.2009,  11:12 Найти цитируемый пост)
Да и тут возвращение указателя на локальный объект. 

Ага, проглядел...



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Andrey44
Дата 27.10.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(Dreamer_0x01 @  27.10.2009,  11:29 Найти цитируемый пост)
возвращение указателя на локальный объект.

А так нет.
Код

typedef struct 
{
  const int param1;
  int param2;
}MYSTRUCT;

void CreateMyStruct(int param1, int param2, MYSTRUCT * s)
{
  s = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
  MYSTRUCT x = {1,2}; //Это, разумеется, проходит
  s = &x;
}





--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 27.10.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Andrey44 @  27.10.2009,  14:28 Найти цитируемый пост)
А так нет.

так тоже.

Цитата(Andrey44 @  27.10.2009,  14:28 Найти цитируемый пост)
s = &x;

тут присваивается указатель а не значение.
PM   Вверх
Andrey44
Дата 27.10.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(azesmcar @  27.10.2009,  14:35 Найти цитируемый пост)
тут присваивается указатель а не значение

Да, верно, что-то я сегодня не выспался


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
UnrealMan
Дата 27.10.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Dreamer_0x01 @  27.10.2009,  11:29 Найти цитируемый пост)
Тогда делаем вариант 
zim22. 

Цитата(C99 6.7.3 paragraph 5)
If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.


Это сообщение отредактировал(а) UnrealMan - 27.10.2009, 15:07
PM MAIL   Вверх
bsa
Дата 27.10.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Dreamer_0x01, убери const из структуры - это самое правильное решение, имхо.
PM   Вверх
Anikmar
Дата 27.10.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(bsa @  27.10.2009,  15:12 Найти цитируемый пост)
Dreamer_0x01, убери const из структуры - это самое правильное решение, имхо.

 smile  smile

Добавлено через 6 минут и 31 секунду
Интересно, а такое сработает?
Код

    MYSTRUCT *b;
    b = (MYSTRUCT *)malloc(sizeof(MYSTRUCT));
    *((int*)(&(b->param1))) = 5;


В Codeblock ссработало.

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1906 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.