а над этими сложениями и вычитаниями правда ещё кто-то задумывается? кстати ещё хорошо бы по ссылке передавать аргументы Code: void _XCHG(int& a, int& b) { a ^= b; b ^= a; a ^= b; };
2 9 10 13 14 Каждое решенное задание это: +1 mind (intelligence) +1 carma +1 experience +5 reputation work it!
согласен десятое задание по сути не очень хорошее. суть задания - сделать решение через жопу в стиле асма, с арифметикой указателей и разыменовывниями. не очень понимаю смысл
эх.. чтото все заглохли с 10м заданием. Так уж и быть покажу сам ) Я сделал по хитрее. у меня так называемый массив состоит не из 8 битных элементов(байт), а из 32-х битный (ulong) что дает его спокойно юзать даже при значение N = 20 Code: #define N 10 int main(int argc, char* argv[]) { char * mas = (char*)malloc(N*N*4); char * tmp = mas; int x; for (x = 1; x < N*N+1; x++, tmp += 4) { *(unsigned long *)tmp = x; } tmp = mas; for (x = 1; x < N*N+1; x++, tmp += 4) { printf("%i\t",*(unsigned long*) tmp); if (x % N == 0) printf("\n"); } return 0; }
Насчет 10-ой задачи: цель этих заданий, по-моему, состоит в том, чтобы показать решающим нечто, чего они раньше не видели, о чем не задумывались и что, возможно (!=точно), поможет им в дальнейшем. Ай-ай! Я перепутал 10 и 14 задания ) Сорри Code: const int N = 3; int** buf = new int*; int z = 0; for (int i=0; i<N; i++) { *(buf + i) = new int; for (int k=0; k<N; k++) { *(*(buf + i) + k) = z++; std::cout << *(*(buf + i) + k) << std::endl; } }
ну хзхз. тут не вижу ничего интересного. все итак очевидно - юзать сишный способ работы с памятью + арифметика указателей. это как раз то, что должен обходить за километр программист на с++.
а одна строчка "VEH" тебя устроит?) //add: кстати, ты ведь не хотел застаить людей хучить KiUserExceptionDispatcher? просто все чего-нть интересного ждут - вдруг появится? кстати - скопипастю задачку из того, что я зачем-то в задания по пхп кинул: что будет в переменной после выполнения кода (не компилить!) Code: /*very very long not ever overflowable*/ int a = 5+765432l;
2 desTiny вообще это решается без ассемблера и без разного рода ядерных функций. Чисто только API функции (даже одна функция)
т.к. судя по всему мало кто это использует или комуто неинтерестно это придется рассказать самому ) Есть такая апишка - SetUnhandledExceptionFilter. Через неё можно устанавливать собственный обработчик исключений для процесса. Т.е. даже если ошибка произошла в каком либо потоке приложения, то всё равно будет вызван этот обработчик. Дригими словами это типа try except но в глобальном масштабе всего приложения. Вообще эта функция какбы заменяет обработчик ошибок который есть в винде (который показывает сообщение что прога выполнила некорректрую операцию итд). Использовать его очень удобно для создания стабильных приложений. К примеру если в приложенни появится ошибка, то с помошью этой технологии её можно перехватить (даже без показа на экран) и запустить приложение заново или даже для удобства скинуть отладочный дамп на винт. Использование очень просто: Code: // наш фильтр LONG MyExceptHandle(struct _EXCEPTION_POINTERS *pExceptionInfo) { char buf[256]; GetModuleFileNameA(0,buf,256); // получим имя нашей проги printf("ERROR\n"); WinExec(buf,SW_SHOW); // запустим заново её ExitProcess(0); // завершим процесс return 0; } int main(int argc, char* argv[]) { printf("SRART\n"); // ставим свой фильтр исключений SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&MyExceptHandle); __asm { hlt // делаем ошибку } return 0; } Хоть перезапуск лучше делать с следящем процесс. Лично я иногда использую слудующего рода конструкцию Code: LONG MyExceptHandle(struct _EXCEPTION_POINTERS *pExceptionInfo) { _MINIDUMP_EXCEPTION_INFORMATION ExInfo; SYSTEMTIME lt; char NAME[512]; GetModuleFileNameA(0, NAME, 512); // получим имя нашей проги GetLocalTime(<); // получим системное время sprintf(NAME, "%s_%i-%i-%i_%i-%i-%i.dmp", NAME, lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond); ExInfo.ThreadId = GetCurrentThreadId(); // зададим ID потока ExInfo.ExceptionPointers = pExceptionInfo; // зададим исключение ExInfo.ClientPointers = 0; // создадим файл для дампа HANDLE hFile = CreateFileA(NAME, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL ); // скинем дамп в файл MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hFile,MiniDumpNormal,&ExInfo,0,0); // закроем файл CloseHandle(hFile); // завершим процес с кодом появившейся ошибки ExitProcess(pExceptionInfo->ExceptionRecord->ExceptionCode); return 0; } В этоге при ошибке в прогамме, в папке с прогой появится файл имяпроги_дата_время.dmp в котором будет содержаться дамп программы на момент ошибки. Далее этот файл можно свободно подгрузить в отладчик или даже в VC++ 2008 открыть и подробно изучить причину ошибки (при наличии исходников вообще можно видеть строку где произошла ошибка итд итп) Очень удобная вешь для отладки больших проектов.
Обновил задания ) Обновил решение 10 задания ( теперь это решение 10 задания, а не другого ). 2 13 14 16
slesh, SetUnhandledExceptionFilter делает не то, что ты просил. он добавит обработчик в самый низ, а ты, как я понял, просил добавить его наверх. И, к тому же, твой код трёт уже установленный exceptionfilter. а Code: LONG NTAPI VEHproc(PEXCEPTION_POINTERS param){ printf("error!!"); return EXCEPTION_CONTINUE_EXECUTION; } ... AddVectoredExceptionHandler(1, VEHProc); ... должен вполне нормально справляться со всем.