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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические структуры, не БОЛЬШАЯ проблемка 
V
    Опции темы
ressac
Дата 6.5.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

 typedef struct {  
                            struct users usr; //  <------- вот чтобы тут впихнуть чтоб служила для всех структур? :)
                            ELEMENT *next;
                } ELEMENT; 

PM MAIL   Вверх
Daevaorn
Дата 6.5.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Не мешало бы уточнить язык.
PM MAIL WWW   Вверх
Fedor
Дата 6.5.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


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

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



Цитата(ressac @  6.5.2007,  13:50 Найти цитируемый пост)
struct users usr; //  <------- вот чтобы тут впихнуть чтоб служила для всех структур? smile

мож, я не догнал, но нельзя сделать например так:
Код

 typedef struct {  
                            char* pStruct;
                            ELEMENT *next;
                } ELEMENT; 


И присваивать уже не саму структуру, а указатель на нее:
Код

struct users* pUsersStruct;
ELEMENT myStruct;
myStruct.pStruct = (char*)pUsersStruct;


Это сообщение отредактировал(а) Fedor - 6.5.2007, 14:00


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
ressac
Дата 6.5.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Daevaorn, язык С


Fedor, 

а почему указатель типа char?
PM MAIL   Вверх
Fedor
Дата 6.5.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


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

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



ressac, ну, на самом деле не так важно. Можно к указателю на void или int приводить smile


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
nickless
Дата 6.5.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



ИМХО void* лучше, не возникнет идеи вывести его на экран как строку итд. smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
ressac
Дата 6.5.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

ИМХО void* лучше, не возникнет идеи вывести его на экран как строку итд


не совсем понял.... что ты хочешь сказать этим?


Fedor, а потом когда я хочу что-то вытащить/прочитать из этой цепочки то мне надо указать привести как структуру? тойсть ...

Код

pUsersStruct= (struct users*) myStruct.pStruct;


так?
PM MAIL   Вверх
srd
Дата 6.5.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Перед тем, как преобразовывать pStruct в указатель на какую-либо структуру, надо убедиться, что pStruct действительно ссылается на структуру нужного типа. Для этого следует придерживаться какого-либо соглашения, например, что все структуры, предназначенные для хранения в списке, должны всегда иметь идентификатор типа в первом члене. Либо хранить этот идентификатор в структуре ELEMENT


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
nickless
Дата 6.5.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



Цитата(ressac @  6.5.2007,  13:39 Найти цитируемый пост)
что ты хочешь сказать этим?

Ну если нужно указатель на структуру, то логичнее использовать void* чем скажем char*, потому что тебе или тому, кто будет использовать этот код не прийдёт в голову мысль использовать этот указатель как строку, даже если у переменной будет не совсем однозначное имя.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
ressac
Дата 6.5.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Fedor, спасибо за хорошую идею насчет указателей... smile

nickless,  понял, спасибо

Цитата

Для этого следует придерживаться какого-либо соглашения, например, что все структуры, предназначенные для хранения в списке, должны всегда иметь идентификатор типа в первом члене. Либо хранить этот идентификатор в структуре ELEMENT


что то не совсем я тебя понимаю, можно пример?





2ALL а не знаете где есть хороший хороший мануалчик по указателям для С, тот что в главной ветке я прочитал, но хочется ещё что-то узнать...


PM MAIL   Вверх
Жуть
Дата 6.5.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ressac @  6.5.2007,  15:40 Найти цитируемый пост)
что то не совсем я тебя понимаю

Как ты будеш восстанавливать тип своей структуры без знания, какой именно это тип?
Код

struct node
{
                int type;
                void *ptr;
};
 typedef struct {  
                            node thisNode;
                            ELEMENT *next;
                } ELEMENT; 

void DoSomething(ELEMENT *el)
{
                ELEMENT *el;
                switch(el->node.type)
                {
                                case (SOME_TYPE)
                                                ((someType*)el->node.ptr).data = SOME_DATA;
                                                break;
                                /*...*/
                }
}

А на С++ было бы хорошо ввести абстрактый класс с чисто виртуальными функциями-членами и дергать методы элемента не заморачиваясь над его действительным типом благодаря полиморфизъму.

P.S. В коде могут быть синтаксические ошибки - я давно не писал на чистом С

Это сообщение отредактировал(а) Жуть - 6.5.2007, 16:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1282 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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