реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вызов функции с параметрами по ссылке!, подскажите, господа
DAndy_boy
сообщение Aug 21 2006, 11:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Собственно вот какая проблема. Во флеш есть некая функция fun(unsignet int); И мне надо вызывать ее по ссылке. Т.е. что-то типа ( *( void( ** )()) 0xff00 )(); только как здесь параметры передавать? ohmy.gif
Go to the top of the page
 
+Quote Post
Kurt
сообщение Aug 21 2006, 11:45
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Aug 21 2006, 12:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



smile.gif smile.gif Похоже вычислил))
Оставлю, вдруг кому пригодиться))

//Flash_clr((const int*)0x1000); - функция которую нужно вызвать. Она находиться по адресу который лежит в ячейке 0xFFD2

// объявляем указатель
void (*Flash_clr_ptr) (const int*) =(void (*)(const int*)) *((int*)0xFFD2);

//и дальше уже используем просто как
...
Flash_clr_ptr((const int*)0x1000);
...


Всем удачи! smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 21 2006, 12:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Aug 22 2006, 04:57
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2006, 08:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Aug 22 2006, 10:05
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



zltigo, странно, но у меня проект скомпилился, но программа все равно не работает верно если объявлять так как вы предложили....
Go to the top of the page
 
+Quote Post
Kurt
сообщение Aug 22 2006, 13:00
Сообщение #8


Участник
*

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



Я не понимаю, чем не устраивает вариант который я предложил?
Использование #define и хитросплетение из скобочек из звездочек, конечно интересно,
но очень здорово ухудшает читаемость программы.
Использование в этом случае typedef, имхо, наиболее оптимально.
Кстати определение переменной не расходует память, а оптимизируется компилятором в прямой вызов.

Сообщение отредактировал Kurt - Aug 22 2006, 13:12
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 22 2006, 17:30
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Серёга_1
сообщение Aug 23 2006, 06:41
Сообщение #10


Участник
*

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



Вариант предложеный Kurt читается лучше и прост в понимании, я бы сделал также , без всяких лишних наворотов скобок и звёздочек.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение Aug 24 2006, 17:54
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Господа, хочу напомнить что в данном случае нам известен только адрес ячейки в которой храниться адрес самой функции... Возможно из-за этого то у нас и недопонимания?!
Go to the top of the page
 
+Quote Post
Kurt
сообщение Aug 25 2006, 06:27
Сообщение #12


Участник
*

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



Цитата(DAndy_boy @ Aug 24 2006, 23:54) *
Господа, хочу напомнить что в данном случае нам известен только адрес ячейки в которой храниться адрес самой функции... Возможно из-за этого то у нас и недопонимания?!


Действительно, вы правы, не заметили. Я же говорил, что хитросплетение из звездочек и скобочек, ухудшает читаемость программы. smile.gif

В таком случае, как вам такой вариант?

Код
__no_init void (*fun)(unsigned int addr) @ 0xFFD2;

void main(void)
{
  fun(0x1000);
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 25 2006, 06:38
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Kurt
сообщение Aug 25 2006, 06:50
Сообщение #14


Участник
*

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



Но согласитесь, с расширениями IAR это получилось красиво smile.gif. Тем более практически все компиляторы имеют аналогичные расширения.
А условно портируемый вариант, можно представить в таком виде:
Код
typedef void (*MY_FUN_PTR)(unsigned int);

MY_FUN_PTR* fun = (MY_FUN_PTR*) 0xFFD2;
(*fun)(0x1000);

// или c проверкой
if(*fun) (*fun)(0x1000);


Я настаиваю на том, что код должен быть читаемым с первого взгляда. smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 25 2006, 08:10
Сообщение #15


Гуру
******

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



Цитата(Kurt @ Aug 25 2006, 09:50) *
Я настаиваю на том, что код должен быть читаемым с первого взгляда. smile.gif

Вы будете смеяться, но я тоже считаю, что код должен код должен быть читаем с первого взгляда.
Cтепень скрытия сути в макросе для конечного применения может быть сделана любой "по вкусу" и не о ней сейчас речь, а сама суть должна быть читабельной. У нас разные предстваления о "читабельности", бывает :-(. Надеюсь Ваши будут прогрессировать :-))))))


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016