| 
			| 
					
						| 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 в него. |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	|  |