__ЕВГЕНИЙ (17.08.2015 16:57, просмотров: 251) ответил aoreh на Как одно из решений, можно попытаться хранить не указатели, а целочисленное и приводить в нужном месте к указателю на ф-ию, коряво, уродски, но, может, поможет, я помню у нас были попытки такого использования, но вот результат не помню уже.
Да, почитал, механизм, конечно, описан, но все сводится к тому, что это очень сложно и компилятор сам придумывает, где и какой указатель использовать. :-) Но, все равно, дело не в указателях. Ладно, если б я просто попадал в неожиданное место при переходе, факт в том, что этого перехода просто не создается. На ассемблере это выглядит после компиляции вот так:
! if (SO->Free)
0x1538: MOVLW 0xD
0x153A: ADDWF SO, W, ACCESS
0x153C: MOVWF HParam, ACCESS
0x153E: MOVLW 0x0
0x1540: ADDWFC Result, W, ACCESS
0x1542: MOVWF 0x8, ACCESS
0x1544: MOVFF HParam, TBLPTR
0x1546: NOP
0x1548: MOVFF 0x8, TBLPTRH
0x154A: NOP
0x154C: CLRF TBLPTRU, ACCESS
! SO->Free(Handle);
! }
0x154E: BRA 0x1558
! else
! Result = scNoMemory;
0x1550: MOVLW 0x7
0x1552: BRA 0x1556
! }
! else
! Result = scInvalidHandle;
0x1554: MOVLW 0x2
0x1556: MOVWF Param, ACCESS
! BinarySemaphoreGive(ObjectListSemaphore);
0x1558: MOVLW 0x5
0x155A: MOVWF TBLPTR, ACCESS