Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2019, 16:42   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию инициализация массива не константой

Здравствуйте. Столкнулся с проблемкой. Есть структура, в которой хранятся указатели на переменные. Есть другая структура (данные пользователя), в которой хранятся сами переменные. Есть указатель, который указывает на ту самую структуру с данными пользователя, и когда я инициирую массив из самой первой структуры, которая содержит указатели, я эти указатели пытаюсь привязать к переменным из второй структуры (данные пользователя) с помощью указателя на структуру, но компилятор жалуется, что мол при инициализации элемент не константа. Как быть?

Код:

// stats of user

typedef struct
{
int a;
int b;
int c;
char s[32];
}stats_s;

static stats_s users[32];
static stats_s *user_current;

// table of pointers linked to user variables

typedef struct
{
char name[32];
int *x;
char *str;
}info_s;

info_s test[]=
{
"variable 1",user_current->a,0, // digit
"variable 2",user_current->b,0, // digit
"variable 3",0,user_current->s  // text
};

int main()
{
...
}
Я просто хочу для удобства с помощью test[] на основе текста обращаться к нужной мне переменной конкретно выбранного юзера через user_current, чтобы не писать гору if.
Артэс вне форума Ответить с цитированием
Старый 04.02.2019, 16:59   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И чему там равно user_current?
p51x вне форума Ответить с цитированием
Старый 04.02.2019, 16:59   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

У меня так он жалуется, что пытаемся прикрутить int в int*
'initializing': cannot convert from 'int' to 'int *'
waleri вне форума Ответить с цитированием
Старый 04.02.2019, 17:35   #4
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Вот дописал пример с комментариями, и да, забыл пояснить, что компилирую на Си, а не С++

Код:
int main()
{
int x;

// pick specified user
user_current=&users[0];

// get 'variable 1' from selected user
info_s *s=&test[0];

// это по идее должно ссылаться на 'a' в user[0]
*s->x=1;

// проверяем если записалось 1
printf("test %d\n",users[0].a);
}
При компилировании пишет это:

Код:
test2.c:36: error: initializer element is not constant
test2.c:36: error: (near initialization for `test[0].x')
test2.c:37: error: initializer element is not constant
test2.c:37: error: (near initialization for `test[0]')
test2.c:37: error: initializer element is not constant
test2.c:37: error: (near initialization for `test[1].x')
test2.c:38: error: initializer element is not constant
test2.c:38: error: (near initialization for `test[1]')
test2.c:38: error: initializer element is not constant
test2.c:38: error: (near initialization for `test[2].x')
test2.c:39: error: initializer element is not constant
test2.c:39: error: (near initialization for `test[2]')
Получается нельзя инициировать указатель на указатель? Возможно там еще надо & добавить в инициализации - "variable 1",user_current->a,0 - но это сейчас не важно, т.к. сообщение про ошибку не меняется, я пробовал.

Последний раз редактировалось Артэс; 04.02.2019 в 17:37.
Артэс вне форума Ответить с цитированием
Старый 04.02.2019, 17:39   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
// это по идее должно ссылаться на 'a' в user[0]
*s->x=1;
Не должно. Когда компилятор для вас инициализировал test[] user_current никуда не указывал, да и присвоили вы не указатель, а простой инт. Вы посты читаете?
p51x вне форума Ответить с цитированием
Старый 04.02.2019, 17:50   #6
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не должно. Когда компилятор для вас инициализировал test[] user_current никуда не указывал, да и присвоили вы не указатель, а простой инт. Вы посты читаете?
Не так выразился) хотел при инициализации присвоить инт с помощью указателя. Конечно читаю (если речь про этот топик), после Вашего "И чему там равно user_current?" и решил остальной пример здесь дописать, и тогда уже стал понимать что видимо такой вариант не прокатит. По моему представлению, я думал что при инициализации можно указать место куда в будущем ссылаться. Как тогда можно сделать то, что мне нужно? Если описать цель кратко, я хочу по текстовым названиям находить переменные выбранного пользователя. Вот и начал с указателями химичить чтобы не строить список if с ручным указыванием переменных для ключевых слов.
Артэс вне форума Ответить с цитированием
Старый 04.02.2019, 17:59   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
По моему представлению, я думал что при инициализации можно указать место куда в будущем ссылаться.
Можно, но вы же не указали.

Если хотите идти этим путем, то возьмите offsetof для заполнения.
p51x вне форума Ответить с цитированием
Старый 04.02.2019, 18:28   #8
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Можно, но вы же не указали.

Если хотите идти этим путем, то возьмите offsetof для заполнения.
Хм, не знал о такой фишке. Глянул в интернете. Благодарю Вас за подсказку)
Артэс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива, который задан константой. Pascal Sting95 Помощь студентам 2 28.04.2014 15:16
Инициализация массива. dmitryfisko Помощь студентам 4 03.02.2014 21:36
инициализация массива, вывод массива и обработка массива должны быть реализованы с помоshью функций airesjke Помощь студентам 0 02.03.2012 16:14
инициализация массива parazzzitka93 Общие вопросы C/C++ 11 02.04.2011 21:01
инициализация массива Arcueid1691 Паскаль, Turbo Pascal, PascalABC.NET 2 01.06.2009 02:36