реклама на сайте
подробности

 
 
> указатель структур в структуре
sergey sva
сообщение Mar 5 2011, 07:00
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Подскажите как сделать:
Структура в ней разнотипные структуры, их нужно перебрать в цикле и записать в массив.

примерно такое:
Код
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

Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
_Pasha
сообщение Mar 5 2011, 08:42
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Нужно добавить информацию о размере подструктуры.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 5 2011, 08:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kamil_yaminov
сообщение Mar 5 2011, 09:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 395
Регистрация: 15-02-08
Из: Новосибирск
Пользователь №: 35 064



структурки-то разных размеров!
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 5 2011, 09:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



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

sm.gif
Структура в ней разнотипные структуры, их нужно перебрать в цикле и адреса подструктур структуры as записать в массив адресов. Желательно все в цикле так как не известно сколько будет подструктур.

Сообщение отредактировал sergey sva - Mar 5 2011, 09:02
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 5 2011, 09:14
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(sergey sva @ Mar 5 2011, 12:00) *
Желательно все в цикле так как не известно сколько будет подструктур.

Это как так?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 5 2011, 09:16
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



В структуре не хранятся ни размеры элементов структуры ни их количество, посему выкиньте эту дивную "идею" из головы. Можете, конечно, добавлять эти размеры в структуру явно, но полагаю, что задача для которой Вы пытаетесь все это замутить имеет и более естественные решения.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
V_G
сообщение Mar 5 2011, 09:27
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



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

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

Сообщение отредактировал V_G - Mar 5 2011, 09:31
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 5 2011, 09:29
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Это как так?

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

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


Указатели длины можно добавить там код просто что бы мысль показать

Сообщение отредактировал sergey sva - Mar 5 2011, 09:32
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 5 2011, 09:35
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Мутно как-то...
И что мешает вашему макросу точно так же добавить в нужном месте указатель на нужную структуру?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 5 2011, 09:48
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



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

Можно и так, но интересно в цикле сделать.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2011, 10:08
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Интересно, для чего, если структура статически существует.
Можно этот массив также статически и заполнить
Код
void *asshole[MAX_ASSHOLE_HACKS]={offsetof(as,a),offsetof(as,b) /*etc etc*/};
Go to the top of the page
 
+Quote Post
Палыч
сообщение Mar 5 2011, 11:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вот так нужно сделать?
Код
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 };



Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 6 2011, 12:00
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(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;
}



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 8 2011, 00:54
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

Код
switch(area)
{
  case type_name

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

А зачем всё это, можно полюбопытствовать?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 9 2011, 07:16
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Нашел решение помогли sm.gif.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 9 2011, 07:52
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(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 "    )      
....


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 05:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016