Josefina
Участник
Offline
|
|
« : 06-12-2010 06:50 » |
|
Вот такой вопрос Есть 12 структур. В каждой из этих 12 структур есть абсолютно одинаковое поле. Хотелось бы создать цикл, пройтись по всем структурам и инициализировать данное поле. Можно ли такое реализовать?
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 06-12-2010 07:20 » |
|
Все 12 структур разные, совпадает только одно из полей?
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
baldr
|
|
« Ответ #2 : 06-12-2010 07:32 » |
|
Мне кажется без наследования тут мало что можно сделать чтоб было красиво... В .NET еще можно было бы попробовать извратиться через Reflection, но в плюсах... хм..
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 06-12-2010 07:50 » |
|
на первый взгляд (хотя, ТЗ не полное): 1) виртуальный общий предок 2) функция обратного вызова
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #4 : 06-12-2010 07:50 » |
|
Если отбросить плюсы вместе с красотой, можно попробовать хак в стиле чистого C.
Давненько не листал стандарт, но вроде помнится, что указатель на структуру должен совпадать с указателем на первое поле. Если сделать общее поле первым в каждой структуре, то задачу можно решить при помощи обычного для C приподвыверта с преобразованием типа указателя.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
baldr
|
|
« Ответ #5 : 06-12-2010 07:54 » |
|
Dale, ИМХО это опасно и не очень красиво...
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 06-12-2010 07:58 » |
|
указатель на структуру должен совпадать с указателем на первое поле. Если сделать общее поле первым в каждой структуре, то задачу можно решить при помощи обычного для C приподвыверта с преобразованием типа указателя.
да, это обязательно так и в C++, если только нет виртуальных функций (а в C их и нет). Я когда-то виртуальными не пользовался и делал именно так - по общей сигнатуре выбирал нужный тип и преобразовывал ))
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #7 : 06-12-2010 07:58 » |
|
А о какой красоте вообще может идти речь, когда принципиально разные сущности обрабатываются единым образом? В таких случаях применяется только популярный критерий "зато работает".
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
baldr
|
|
« Ответ #8 : 06-12-2010 08:17 » |
|
Dale, а как только придет другой инженер поддерживать эту конструкцию и допишет свое поле в начало одной из структур - все магическим образом перестанет работать. Причем не сразу, скорее всего..
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Dale
|
|
« Ответ #9 : 06-12-2010 08:25 » |
|
Dale, а как только придет другой инженер поддерживать эту конструкцию и допишет свое поле в начало одной из структур - все магическим образом перестанет работать. Причем не сразу, скорее всего.. Совершенно верно. Обработка различных сущностей единым образом - это в большинстве случаев дефект проектирования, который обязательно выйдет боком. Нельзя по единому рецепту выпекать торты, вулканизировать покрышки и выплавлять чугун лишь на том основании, что все три технологии используют термообработку. Точнее, конечно, можно, но вот результат... Впрочем, в тех случаях, когда подобные хаки действительно оправданы, они тщательно документируются. Нужен инженер, не умеющий читать, чтобы развалить проект. Ну и плюс полное пренебрежение тестами, что тоже можно отнести к неграмотности.
|
|
« Последнее редактирование: 06-12-2010 08:28 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
baldr
|
|
« Ответ #10 : 06-12-2010 09:19 » |
|
Промелькнула мысль... Josefina, а эти структуры - случаем, не часть SOAP-запроса?
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #11 : 06-12-2010 10:19 » |
|
Ого, сколько написали Dale, да, все структуры разные, совпадает только одно из полей. Где можно про описанный Вами хак почитать по подробнее? Как оно на практике реализуется.. Алексей1153++, про виртуального предка можно чуть по подробней)) baldr, эти структуры являются регистрами модема, значения которых считываются/устанавливаются)
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #12 : 06-12-2010 10:43 » |
|
эти структуры являются регистрами модема Тогда для начала вопрос: не являются ли эти поля битовыми, как часто бывает в случае аппаратных регистров? Если да, то к ним в принципе не может быть применена операция получения адреса, и предложеный мной хак не имеет смысла.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 06-12-2010 11:56 » |
|
и предложеный мной хак не имеет смысла.
... как и виртуальные функции тоже ) Josefina, код описания структур покажи
|
|
|
Записан
|
|
|
|
Josefina
Участник
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
|
|
« Ответ #15 : 06-12-2010 12:02 » |
|
А общее поле, стало быть, val?
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #16 : 06-12-2010 12:16 » |
|
А общее поле, стало быть, val?
да-да-да)))
|
|
|
Записан
|
|
|
|
rukia
Интересующийся
Offline
|
|
« Ответ #17 : 06-12-2010 12:17 » |
|
а нельзя создать класс-предок с виртуальными методами set_val/get_val , потом кажду структуру обернуть в класс-потомок, реализовать для каждой из 12 те методоты и затем в цикле перебрать объекты, вызывая set_val?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 06-12-2010 12:25 » |
|
Josefina, а по какой сигнатуре различать типы ?
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #19 : 06-12-2010 12:25 » |
|
А общее поле, стало быть, val?
да-да-да))) Ну вот и славненько. Потому что на самом деле это не структура, а объединение, в котором беззнаковое длинное целое val накладывается на остальные поля. Никакие хаки не понадобятся - все эти объединения одного типа и могут быть обработаны единообразно.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #20 : 06-12-2010 15:31 » |
|
Это ж вообще не структура, это просто unsigned long, к которому можно всё это привести.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #21 : 07-12-2010 07:19 » |
|
Спасибо за ответы все оказалось очень просто
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #22 : 07-12-2010 09:16 » |
|
Ну и попутно совет, раз уж вопрос имеет отношение к аппаратным регистрам устройства.
Лучше в таких случаях избегать использования типов с непонятной разрядностью вроде int и т.п. Используйте типы с гарантированной разрядностью. Например, в данном случае гораздо лучше подойдет тип int32_t как в плане переносимости, так и в плане читаемости программы (разумеется, если компилятор его поддерживает, но в противном случае и браться за программирование устройств с его помощью не следует).
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
npak
|
|
« Ответ #23 : 07-12-2010 15:09 » |
|
А всеж-таки лучше сделать общего предка, вынести поле val в него.
|
|
|
Записан
|
|
|
|
|