Здравствуйте случайно вот нашел эту статью: http://cbn.narod.ru/elf.html и вот там есть вот такой код: Код (Text): #include "E:\ARM\swilib.h" void ElfKiller(void){ // Используется для выхода из эльфа extern void *ELF_BEGIN; // здесь обычно еще освобождают память по mfree(), freeWS() ((void (*)(void *))(mfree_adr()))(&ELF_BEGIN); // Ничего не понятно :( } int main(char *exename, char *fname){ // Основная функция // в exename передается путь запущенного эльфа вида 4:\Zbin\xyz.elf // в fname передается имя файла, который выбран в CardExplorere, вида 0:\Misc\data.txt // или 0, если elf запущен сам char *mem; int i, err; int handle; if(fname){ // Работа с файлами стандартна: handle=fopen(fname,A_ReadWrite+A_BIN+A_Append+A_Create,P_READ+P_WRITE,&err); // Открыть для чтения и записи в двоичн. режиме с дозаписью (append), создать если нет // или handle=fopen(fname,A_ReadOnly+A_BIN,P_READ,&err); // только для чтения - константы см. swilib.h if(handle!=-1){ //-1 = error mem=malloc(10000); // Выделить память: AllocWS() для строк (по 2б) if(mem!=0){ //0 = error i=fread(handle,mem,10000,&err); // Возвращает число прочитанных байт и ошибку в err // Делаем что-либо makesomebody(mem,i); fwrite(handle,mem,i,&err); mfree(mem); // Освободить память: FreeWS() для строк } fclose(handle); // Закрыть файл } } SUBPROC((void *)ElfKiller); // се загадка великая есть :) Но без нее низя! return(0); } // PS. Т.к. в x65 файловые чтение и запись проводятся блоками до 32767 байт, // вместо fread() и fwrite() используем их аналоги fread32() и fwrite32( аналогично) int fread32(int fh, char *buf, int len, unsigned int *err) // (с) Rst7 { int clen; int rlen; int total=0; while(len) { if (len>16384) clen=16384; else clen=len; total+=(rlen=fread(fh, buf, clen, err)); if (rlen!=clen) break; buf+=rlen; len-=clen; } return(total); } вот... меня интересует этот урывок: Код (Text): ((void (*)(void *))(mfree_adr()))(&ELF_BEGIN); я такого запутанного еще никогда не видел.. может кто-нибудь объяснить, что оно делает и как? (void (*)(void *)) - вот это вроде объявляется указатель на ф-ию, возвращающую тип void и принимающую указатель на void... а дальше ниче не понятно...
Одна пара скобок лишняя. Вызов функции mfree_adr с параметром &ELF_BEGIN и кэстингом к типу (void (*)(void *); // На самом деле, исходя из объявления ELF_BEGIN, передается void**
надо полагать, что mfree_adr() - возвращает адрес некой функции. Он приводится к типу ((void (*)(void *)), и затем функция с этим адресом вызывается с параметром &ELF_BEGIN
все, пасибки! теперь все ясно так и знал, что скобки лишние есть. P.S. Случайно не тем аккаунтом залогинился