[C/C++] ЗАДАНИЯ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Fata1ex, 21 Jun 2009.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Правильно.
    Хотя красивее будет
    Code:
    void _XCHG(int a, int b)
    {
     a -= b;
     b += a;
     a = b - a;
    };
    
     
  2. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а над этими сложениями и вычитаниями правда ещё кто-то задумывается? кстати ещё хорошо бы по ссылке передавать аргументы
    Code:
    void _XCHG(int& a, int& b)
    {
     a ^= b;
     b ^= a;
     a ^= b;
    };
     
  3. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    2 9 10 13 14
    Каждое решенное задание это:
    +1 mind (intelligence)
    +1 carma
    +1 experience
    +5 reputation
    work it!
     
  4. Roston

    Roston Elder - Старейшина

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    а в 10 при обьявлении можно использовать [ и ]???
     
  5. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    нет, от тебя зачем-то(зачем?) хотят всяких maloc'ов и указателей
     
    1 person likes this.
  6. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    согласен десятое задание по сути не очень хорошее. суть задания - сделать решение через жопу в стиле асма, с арифметикой указателей и разыменовывниями. не очень понимаю смысл
     
  7. Roston

    Roston Elder - Старейшина

    Joined:
    31 Jul 2008
    Messages:
    337
    Likes Received:
    104
    Reputations:
    8
    совсем не понял твоего поста
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    эх.. чтото все заглохли с 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;
    }
    
     
    1 person likes this.
  9. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    м? а в чём хитрость и хитрее чего?)
     
  10. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    видимо задача была перехитрить себя, чтобы потом ломать голову над кодом =)
     
  11. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Насчет 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;
    			}
            }
     
    #71 Fata1ex, 25 Jun 2009
    Last edited: 25 Jun 2009
  12. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну хзхз. тут не вижу ничего интересного. все итак очевидно - юзать сишный способ работы с памятью + арифметика указателей. это как раз то, что должен обходить за километр программист на с++.
     
  13. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Я не очень верно выразился:
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Кстати, чтото пока никто не решил мою задачку с обработкой исключений
     
  15. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а одна строчка "VEH" тебя устроит?) //add: кстати, ты ведь не хотел застаить людей хучить KiUserExceptionDispatcher?
    просто все чего-нть интересного ждут - вдруг появится?

    кстати - скопипастю задачку из того, что я зачем-то в задания по пхп кинул:
    что будет в переменной после выполнения кода (не компилить!)
    Code:
    /*very very long not ever overflowable*/ int a = 5+765432l;
    
     
    #75 desTiny, 25 Jun 2009
    Last edited: 25 Jun 2009
  16. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 desTiny вообще это решается без ассемблера и без разного рода ядерных функций.
    Чисто только API функции (даже одна функция)
     
  17. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    т.к. судя по всему мало кто это использует или комуто неинтерестно это придется рассказать самому )
    Есть такая апишка - 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(&lt); // получим системное время
      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 открыть и подробно изучить причину ошибки (при наличии исходников вообще можно видеть строку где произошла ошибка итд итп) Очень удобная вешь для отладки больших проектов.
     
    #77 slesh, 25 Jun 2009
    Last edited: 25 Jun 2009
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 desTiny какой пакостник, людей дурить нехорошо. Ониже голову сломают без капса )
     
    1 person likes this.
  19. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Обновил задания ) Обновил решение 10 задания ( теперь это решение 10 задания, а не другого :) ).

    2 13 14 16
     
  20. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    slesh, SetUnhandledExceptionFilter делает не то, что ты просил. он добавит обработчик в самый низ, а ты, как я понял, просил добавить его наверх. И, к тому же, твой код трёт уже установленный exceptionfilter.
    а
    Code:
    LONG NTAPI VEHproc(PEXCEPTION_POINTERS param){
      printf("error!!");
      return EXCEPTION_CONTINUE_EXECUTION;
    }
    ...
    AddVectoredExceptionHandler(1, VEHProc);
    ...
    должен вполне нормально справляться со всем.