Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: указатель структур в структуре
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sergey sva
Подскажите как сделать:
Структура в ней разнотипные структуры, их нужно перебрать в цикле и записать в массив.

примерно такое:
Код
typedef struct{
int x;
char v;
}strca;

typedef struct{
long x;
char v;
}strcb;

typedef struct{
long x;
float v;
}strcc;


struct as {
strca a;
strcb b;
strcc c;
};


for(int i = 0; i < MAXCOUNTSTRUC; i++ ){
long adrr[MAXCOUNTSTRUC];

adrr[i] = (void(*))as;

(void(*))as++;


}//for

_Pasha
Нужно добавить информацию о размере подструктуры.
zltigo
Ничего не понял в этом желании в чем-то вывихнуться sad.gif. Нужно записать - записывайте верхнюю структуру целиком. Только причем тут еще и слово массив, для разнородных элементов.

kamil_yaminov
структурки-то разных размеров!
sergey sva
Цитата
Ничего не понял в этом желании в чем-то вывихнуться . Нужно записать - записывайте верхнюю структуру целиком. Только причем тут еще и слово массив, для разнородных элементов.

sm.gif
Структура в ней разнотипные структуры, их нужно перебрать в цикле и адреса подструктур структуры as записать в массив адресов. Желательно все в цикле так как не известно сколько будет подструктур.
MrYuran
Цитата(sergey sva @ Mar 5 2011, 12:00) *
Желательно все в цикле так как не известно сколько будет подструктур.

Это как так?
zltigo
В структуре не хранятся ни размеры элементов структуры ни их количество, посему выкиньте эту дивную "идею" из головы. Можете, конечно, добавлять эти размеры в структуру явно, но полагаю, что задача для которой Вы пытаетесь все это замутить имеет и более естественные решения.
V_G
Вот именно, как?
Ваша структра as имеет вполне определенное число подструктрур:3.
Где тут неизвестное, где тут переменная?
В вашем примере, где все структуры содержат разнотипные данные и никаких указателей и информации о длинах, никакой цикл не сгодится, ручками в массив заносите.
Либо расшифруйте задачу

p.s. Кстати, название темы более осмысленное, чем постановка задачи. Попробуйте рыть в строну структуры с указателями.
Указатели тем приятны, что все имеют одинаковый размер
sergey sva
Цитата
Это как так?

Например в код понадобится добавить подструктуру, добавляем и добавляем в макрос MAXCOUNTSTRUC х +1
больше изменений в коде не нужно делать. Будет что то вроде библиотеки с типами.

Цитата
Вот именно, как?
Ваша структра as имеет вполне определенное число подструктрур:3.
Где тут неизвестное, где тут переменная?
В вашем примере, где все структуры содержат разнотипные данные и никаких указателей и информации о длинах, никакой цикл не сгодится, ручками в массив заносите.
Либо расшифруйте задачу


Указатели длины можно добавить там код просто что бы мысль показать
MrYuran
Цитата(sergey sva @ Mar 5 2011, 12:29) *
Например в код понадобится добавить подструктуру, добавляем и добавляем в макрос MAXCOUNTSTRUC х +1
больше изменений в коде не нужно делать. Будет что то вроде библиотеки с типами.

Мутно как-то...
И что мешает вашему макросу точно так же добавить в нужном месте указатель на нужную структуру?
sergey sva
Цитата(MrYuran @ Mar 5 2011, 12:35) *
Мутно как-то...
И что мешает вашему макросу точно так же добавить в нужном месте указатель на нужную структуру?

Можно и так, но интересно в цикле сделать.
_Pasha
Цитата(sergey sva @ Mar 5 2011, 13:48) *
Можно и так, но интересно в цикле сделать.

Интересно, для чего, если структура статически существует.
Можно этот массив также статически и заполнить
Код
void *asshole[MAX_ASSHOLE_HACKS]={offsetof(as,a),offsetof(as,b) /*etc etc*/};
Палыч
Вот так нужно сделать?
Код
struct as S;
memcpy(adrr, &S, sizeof(as));


Судя по
Цитата(sergey sva @ Mar 5 2011, 12:00) *
Структура в ней разнотипные структуры, их нужно перебрать в цикле и адреса подструктур структуры as записать в массив адресов. Желательно все в цикле так как не известно сколько будет подструктур.
наверное, что-то нужно другое... Что? У Вас не структуры нет, ни массива адресов...

Может, вот так хотите сделать?
Код
struct as S;
void * addr[]= { &S.a, &S.b, &S.c };



Dog Pawlowa
Цитата(MrYuran @ Mar 5 2011, 13:35) *
И что мешает вашему макросу ...?

Да, в макросизации нужно идти до конца!
Я не знаю, что именно хочет автор, но сам делаю что-то подобное присвоением типам структур условных номеров через enum, ну и конечно же есть тяжелое место в коде - по условному номеру структуры выполнить требуемые действия - "жосткий" switch, не красящий код (см ниже). Врагу не пожелаешь sm.gif

Код
char GetRecordParametersError(uchar area, uchar index)
{    switch (area)
    {
#define BACKUP_AREA(type_name,var_name,qty_name, mask,show_name) case type_name:        \
                record_parameters.eeprom_offset=OFFSET(EEPROM_TYPE,var_name[index]);    \
                record_parameters.bytes_qty=sizeof(type_name##_TYPE);                    \
                record_parameters.ram_address=(uchar *) &var_name;                        \
                record_parameters.checksum_address=&var_name.checksum;                    \
                break;
#include "k__areas.h"
#undef BACKUP_AREA
        default:    return WRONG_AREA;
    }
    if (index>area_qty[area]-1) return WRONG_AREA_INDEX;
    else return 0;
}

defunct
Цитата(Dog Pawlowa @ Mar 6 2011, 14:00) *
Врагу не пожелаешь sm.gif

Ох и хороша же травка sm.gif задвинуто-то как! sm.gif
точно подмечено, врагу не пожелаешь такого.

Код
switch(area)
{
  case type_name

Тут наверно не type_name, а все же area_id надо бы.

А зачем всё это, можно полюбопытствовать?
sergey sva
Нашел решение помогли sm.gif.
Dog Pawlowa
Цитата(defunct @ Mar 8 2011, 03:54) *
А зачем всё это, можно полюбопытствовать?

Да банально все - размещение данных в EEPROM

Код
//     EEPROM areas
//               type_name            var_name              qty        mask                     name           
    BACKUP_AREA (SETUP,                 se,                   2,        SETUP_MASK,            "Setup  "    )
    BACKUP_AREA (STATISTIC,             stat,              1,        STATISTIC_MASK,        "Statis "    )      
....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.