|
Вызов функции с параметрами по ссылке!, подскажите, господа |
|
|
|
Aug 21 2006, 11:45
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31

|
Код // Объявить тип указатель на нашу функцию typedef void (*MY_FUN_PTR)(unsigned int);
void main(void) { // Определить переменную - указатель на функцию и инициализировать адресом. MY_FUN_PTR fun = (MY_FUN_PTR) 0x1000; // Вызвать функцию с передачей параметров fun(100); }
|
|
|
|
|
Aug 21 2006, 12:05
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
 Похоже вычислил)) Оставлю, вдруг кому пригодиться)) //Flash_clr((const int*)0x1000); - функция которую нужно вызвать. Она находиться по адресу который лежит в ячейке 0xFFD2 // объявляем указатель void (*Flash_clr_ptr) (const int*) =(void (*)(const int*)) *((int*)0xFFD2); //и дальше уже используем просто как ... Flash_clr_ptr((const int*)0x1000); ... Всем удачи!
|
|
|
|
|
Aug 21 2006, 12:46
|

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

|
Цитата(DAndy_boy @ Aug 21 2006, 15:05)  Оставлю, вдруг кому пригодиться)) Накручено и указатель промежуточный зачем? #define F_LOCATION 0xFFD2 ((void(*)( const int *))F_LOCATION)( 0x1000 );
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 22 2006, 04:57
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922

|
Цитата(zltigo @ Aug 21 2006, 16:46)  Накручено и указатель промежуточный зачем?
#define F_LOCATION 0xFFD2 ((void(*)( const int *))F_LOCATION)( 0x1000 ); Может я чего недопонимаю, но в IAR эти строки не компиляться... Я конечно не претендую на последнюю истину, но в моем варианте даже использовать проще.... Просто вызывать, как обычную функцию...Получается нагляднее
Сообщение отредактировал DAndy_boy - Aug 22 2006, 04:59
|
|
|
|
|
Aug 22 2006, 08:16
|

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

|
Цитата(DAndy_boy @ Aug 22 2006, 07:57)  Может я чего недопонимаю, но в IAR эти строки не компиляться... Невероятно, ибо 0. все совершенно нетральный "C"; 1. синтаксически это не отличается от Вашего варианта ничем; 2. именно под IAR (ARM) я такое использую. Цитата Я конечно не претендую на последнюю истину, но в моем варианте даже использовать проще.... Просто вызывать, как обычную функцию... Только занимаете память под ненужный указатель. Цитата Получается нагляднее Можете совершенно спокойно сделать и #define скрыв в нем все ненужные подробности и изобразив просто вызов функции. #define funcx(x) ((void(*)( const int *))0xFFD2)( x )
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 22 2006, 13:00
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31

|
Я не понимаю, чем не устраивает вариант который я предложил? Использование #define и хитросплетение из скобочек из звездочек, конечно интересно, но очень здорово ухудшает читаемость программы. Использование в этом случае typedef, имхо, наиболее оптимально. Кстати определение переменной не расходует память, а оптимизируется компилятором в прямой вызов.
Сообщение отредактировал Kurt - Aug 22 2006, 13:12
|
|
|
|
|
Aug 22 2006, 17:30
|

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

|
Цитата(DAndy_boy @ Aug 22 2006, 13:05)  но программа все равно не работает верно если объявлять так как вы предложили.... Единственная РАЗНИЦА в Вашем варианте это присутствует явное преобразование (const int*)0x1000 ну добавьте... Цитата(Kurt @ Aug 22 2006, 16:00)  Я не понимаю, чем не устраивает вариант который я предложил? Вариантов может быть много и это естественно. Цитата хитросплетение из скобочек из звездочек Ну не сказал-бы - ясное, четкое выражение хитросплетением не является :-) Цитата Кстати определение переменной не расходует память, а оптимизируется компилятором в прямой вызов. Надеяться на оптимизатор, когда можно четко выразить свою мысль не хорошо :-(
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 23 2006, 06:41
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 30-05-06
Из: Минск,Белорусия
Пользователь №: 17 572

|
Вариант предложеный Kurt читается лучше и прост в понимании, я бы сделал также , без всяких лишних наворотов скобок и звёздочек.
|
|
|
|
|
Aug 25 2006, 06:27
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31

|
Цитата(DAndy_boy @ Aug 24 2006, 23:54)  Господа, хочу напомнить что в данном случае нам известен только адрес ячейки в которой храниться адрес самой функции... Возможно из-за этого то у нас и недопонимания?! Действительно, вы правы, не заметили. Я же говорил, что хитросплетение из звездочек и скобочек, ухудшает читаемость программы.  В таком случае, как вам такой вариант? Код __no_init void (*fun)(unsigned int addr) @ 0xFFD2;
void main(void) { fun(0x1000); }
|
|
|
|
|
Aug 25 2006, 06:38
|

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

|
Цитата(Kurt @ Aug 25 2006, 09:27)  В таком случае, как вам такой вариант? Код __no_init void (*fun)(unsigned int addr) @ 0xFFD2;
void main(void) { fun(0x1000); } Вместо нормального портируемого "C" для "улучшения читабельности" :-) без всякой на то надобности употреблены __no_init и @ из IARовского "диалекта".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 25 2006, 06:50
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31

|
Но согласитесь, с расширениями IAR это получилось красиво  . Тем более практически все компиляторы имеют аналогичные расширения. А условно портируемый вариант, можно представить в таком виде: Код typedef void (*MY_FUN_PTR)(unsigned int);
MY_FUN_PTR* fun = (MY_FUN_PTR*) 0xFFD2; (*fun)(0x1000);
// или c проверкой if(*fun) (*fun)(0x1000); Я настаиваю на том, что код должен быть читаемым с первого взгляда.
|
|
|
|
|
Aug 25 2006, 08:10
|

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

|
Цитата(Kurt @ Aug 25 2006, 09:50)  Я настаиваю на том, что код должен быть читаемым с первого взгляда.  Вы будете смеяться, но я тоже считаю, что код должен код должен быть читаем с первого взгляда. Cтепень скрытия сути в макросе для конечного применения может быть сделана любой "по вкусу" и не о ней сейчас речь, а сама суть должна быть читабельной. У нас разные предстваления о "читабельности", бывает :-(. Надеюсь Ваши будут прогрессировать :-))))))
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|