Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Возможно ли реализовать цикл по структурам разных типов?  (Прочитано 21971 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Josefina
Участник

ru
Offline Offline

« : 06-12-2010 06:50 » new

Вот такой вопрос  Не понял

Есть 12 структур. В каждой из этих 12 структур есть абсолютно одинаковое поле.
Хотелось бы создать цикл, пройтись по всем структурам и инициализировать данное поле.

Можно ли такое реализовать?  Здесь была моя ладья...
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 06-12-2010 07:20 » 

Все 12 структур разные, совпадает только одно из полей?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 06-12-2010 07:32 » 

Мне кажется без наследования тут мало что можно сделать чтоб было красиво... В .NET еще можно было бы попробовать извратиться через Reflection, но в плюсах... хм..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-12-2010 07:50 » 

на первый взгляд (хотя, ТЗ не полное):
1) виртуальный общий предок
2) функция обратного вызова
Улыбаюсь
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 06-12-2010 07:50 » 

Если отбросить плюсы вместе с красотой, можно попробовать хак в стиле чистого C.

Давненько не листал стандарт, но вроде помнится, что указатель на структуру должен совпадать с указателем на первое поле. Если сделать общее поле первым в каждой структуре, то задачу можно решить при помощи обычного для C приподвыверта с преобразованием типа указателя.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 06-12-2010 07:54 » 

Dale, ИМХО это опасно и не очень красиво...
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 06-12-2010 07:58 » 

указатель на структуру должен совпадать с указателем на первое поле. Если сделать общее поле первым в каждой структуре, то задачу можно решить при помощи обычного для C приподвыверта с преобразованием типа указателя.
да, это обязательно так и в C++, если только нет виртуальных функций (а в C их и нет). Я когда-то виртуальными не пользовался и делал именно так - по общей сигнатуре выбирал нужный тип и преобразовывал ))
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 06-12-2010 07:58 » 

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

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #8 : 06-12-2010 08:17 » 

Dale, а как только придет другой инженер поддерживать эту конструкцию и допишет свое поле в начало одной из структур - все магическим образом перестанет работать. Причем не сразу, скорее всего..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 06-12-2010 08:25 » 

Dale, а как только придет другой инженер поддерживать эту конструкцию и допишет свое поле в начало одной из структур - все магическим образом перестанет работать. Причем не сразу, скорее всего..

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

Впрочем, в тех случаях, когда подобные хаки действительно оправданы, они тщательно документируются. Нужен инженер, не умеющий читать, чтобы развалить проект. Ну и плюс полное пренебрежение тестами, что тоже можно отнести к неграмотности.
« Последнее редактирование: 06-12-2010 08:28 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #10 : 06-12-2010 09:19 » 

Промелькнула мысль...
Josefina, а эти структуры - случаем, не часть SOAP-запроса?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Josefina
Участник

ru
Offline Offline

« Ответ #11 : 06-12-2010 10:19 » 

Ого, сколько написали  Класс!

Dale, да, все структуры разные, совпадает только одно из полей. Где можно про описанный Вами хак почитать по подробнее? Как оно на практике реализуется..

Алексей1153++, про виртуального предка можно чуть по подробней))

baldr, эти структуры являются регистрами модема, значения которых считываются/устанавливаются)


Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 06-12-2010 10:43 » 

эти структуры являются регистрами модема

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

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 06-12-2010 11:56 » 

и предложеный мной хак не имеет смысла.
... как и виртуальные функции тоже )

Josefina, код описания структур покажи
Записан

Josefina
Участник

ru
Offline Offline

« Ответ #14 : 06-12-2010 11:59 » 

пример:
Код:
typedef union{
unsigned long val;
struct{
unsigned pch_on  :2;
unsigned reserve1  :2;
unsigned ppm_on  :1;
unsigned reserve2  :10;
unsigned synth_pch  :2;
unsigned synth_ppm :3;
unsigned reserve3  :12
}inc;
}reg_18012;

поле, о котором идет речь - val
во всех структурах оно имеет один и тот же тип и размер)
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 06-12-2010 12:02 » 

А общее поле, стало быть, val?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Josefina
Участник

ru
Offline Offline

« Ответ #16 : 06-12-2010 12:16 » 

А общее поле, стало быть, val?
да-да-да)))
Записан
rukia
Интересующийся

ru
Offline Offline

« Ответ #17 : 06-12-2010 12:17 » 

а нельзя создать класс-предок с виртуальными методами set_val/get_val , потом кажду структуру обернуть в класс-потомок, реализовать для каждой из 12 те методоты и затем в цикле перебрать объекты, вызывая set_val?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 06-12-2010 12:25 » 

Josefina, а по какой сигнатуре различать типы ?
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 06-12-2010 12:25 » 

А общее поле, стало быть, val?
да-да-да)))

Ну вот и славненько. Потому что на самом деле это не структура, а объединение, в котором беззнаковое длинное целое val накладывается на остальные поля. Никакие хаки не понадобятся - все эти объединения одного типа и могут быть обработаны единообразно.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 06-12-2010 15:31 » 

Это ж вообще не структура, это просто unsigned long, к которому можно всё это привести.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Josefina
Участник

ru
Offline Offline

« Ответ #21 : 07-12-2010 07:19 » 

Спасибо за ответы  Дарю!  все оказалось очень просто  Внимание! Говорит и показывает...
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 07-12-2010 09:16 » 

Ну и попутно совет, раз уж вопрос имеет отношение к аппаратным регистрам устройства.

Лучше в таких случаях избегать использования типов с непонятной разрядностью вроде int и т.п. Используйте типы с гарантированной разрядностью. Например, в данном случае гораздо лучше подойдет тип int32_t как в плане переносимости, так и в плане читаемости программы (разумеется, если компилятор его поддерживает, но в противном случае и браться за программирование устройств с его помощью не следует).
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 07-12-2010 15:09 » 

А всеж-таки лучше сделать общего предка, вынести поле val в него.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines