|
Добавление смещения к указателю на функцию., Переменная типа указатель на функцию. |
|
|
|
Dec 25 2006, 16:14
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Цитата(jorikdima @ Dec 25 2006, 15:53)  То есть чтоб функция не с начала начала работать??? Такое невозможно помоему, да и не логично Такое возможно, но не знаю как преобразовать тип указатель на функцию и константу, чтоб их суммировать. Нужно вот для чего, например есть в функции задержка на 20мс, чтоб колом все не стояло 20мс, выходим из функции запоминаем адрес возврата, делаем что –то другое полезное и возвращаемся через примерно 20мс в точку выхода.
|
|
|
|
|
Dec 25 2006, 16:26
|

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

|
Цитата(_Алекс @ Dec 25 2006, 15:14)  Нужно вот для чего, например есть в функции задержка на 20мс, чтоб колом все не стояло 20мс, выходим из функции запоминаем адрес возврата, и указатель стека. Кроме того, "запоминаем" это нормально, а написанное Вами ранее "константу прибавляем" - есть верный путь к проблемам. Цитата делаем что –то другое полезное и возвращаемся через примерно 20мс в точку выхода. Все не просто а очень просто - сладкая парочка setjmp() longjmp() официальный путь решения подобных проблем. Ну а вообще и о системе подумать можно - вариации на тему sleep().
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 25 2006, 16:27
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(_Алекс @ Dec 25 2006, 19:14)  Цитата(jorikdima @ Dec 25 2006, 15:53)  То есть чтоб функция не с начала начала работать??? Такое невозможно помоему, да и не логично
Такое возможно, но не знаю как преобразовать тип указатель на функцию и константу, чтоб их суммировать. Функции в С всегда работают сначала. Нельзя средствами языка валидно вызвать функцию, чтоб попасть в ее середину. Цитата(_Алекс @ Dec 25 2006, 19:14)  Нужно вот для чего, например есть в функции задержка на 20мс, чтоб колом все не стояло 20мс, выходим из функции запоминаем адрес возврата, делаем что –то другое полезное и возвращаемся через примерно 20мс в точку выхода. Это вам RTOS нужна. Под ней все это реализуется нативно. Или тогда руками соорудить автомат состояний и ходить по состояниям. Т.е. при входе в функцию анализируется переменная состояния и осуществляется переход за цикл (или куда там еще надо).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 25 2006, 17:32
|

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

|
Цитата(sensor_ua @ Dec 25 2006, 15:58)  Механизм сопрограмм на макросах поможет и без RTOS Конечный автомат уже поминался (во что его оборачивать это дело уже второе), но решает он часть проблемы, ибо про 20ms он ведать не ведает и тем более прервать текущую задачу для более-менее точной выдержки не сможет. Если, конечно вырожденные случаи не рассматривать. Цитата Не обещаю, что получится. Да формально изменить указатель получится - не имеет права не получиться. А вот результат сего действия будет покрыт мраком  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 25 2006, 17:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Конечный автомат уже поминался Согласен, но, ИМХО, странный вопрос товарища как-раз о том, КАК сделать, а не ЧТО. Механизм сопрограмм позволяет именно вернуться в точку предыдущего выхода. Вызов той же функции через сколько-то там мс позволит продолжить выполнение чего-то там по алгоритму. Цитата про 20ms он ведать не ведает и тем более прервать текущую задачу для более-менее точной выдержки не сможет Разве кто-то говорил о точности выдержки времени (и на чём и при каких других условиях?) и о жёстком риалтайме? Тут, похоже, _Алекс сам не знает ещё чего хочет  или захочет...
--------------------
aka Vit
|
|
|
|
|
Dec 26 2006, 16:29
|

учащийся
    
Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249

|
Цитата(Rst7 @ Dec 26 2006, 08:26)  Цитата(_artem_ @ Dec 25 2006, 17:13)  имхо в С все траснформации с пойнтером разрешаются через void* тип. продекларируйте такой пойнтер а затем присвойте ему указатель функции с кастингом на void и прибавьте смешение. затем вызом функции через результируюший пойнтер с кастингом как указатель функции. Правда размерность смешения надо урегулировать.
А с каких пор стали допустимы операции +, += и так далее с указателем типа void* ? Вы правы - в написанном ошибка. Чтоб замалить прошение) написал пример который КОМПИЛИРУЕТСЯ без ошибок на bcc32 : Код void test(void) { int i = 0; i++; }
void main (void) {
void (*fp)(void);
fp = (void(*)(void))((unsigned long int)(&test) + 100);
fp(); } Наверно надо обратить внимание на правильную размерность указателя на функцию когда делается кастинг перед сложением .
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|