Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› ARCHANGEL's blog
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >>
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 июля 2012 18:28
· Личное сообщение · #1

Добрый день, уважаемые форумчане. Ни для кого не секрет, что решил я с недавних пор пойти учиться программированию. Поэтому стали меня интересовать практические аспекты кодинга, иногда весьма далёкие от вопросов реверсинга. Поэтому чтоб не засорять форум, решил создать этот блог. Стоит сказать, что вопросы, которые планируется тут разбирать, не такие уж и бесполезные. Они часто могут возникать при написании тех же кейгенов или тулз для реверсинга, так что, надеюсь, каждый сможет найти здесь что-нибудь интересное. Как некоторые уже догадались, вопросы Common Controls, простым числам, и сегодняшний вопрос по OpenGL как раз из серии учебных. Теперь о самом вопросе.

На днях выполнял задание про отрисовку простых фигур: треугольника, квадрата и т.д. Решено было выполнять рисование средствами OpenGL. Литературы по этому делу много, поэтому я разобрался, что и как. Т.е. в литературе советовали использовать бибилиотеку glut.dll, которая сама не относится к стандартному OpenGL, но её применение, как я понял, упрощает использование OpenGL в своих проектах. Далее я решил создать базовый класс для отрисовки треугольника, а от него создать производные классы для отрисовки других геометрических фигур. Но на практике получилась вот такая сложность. Дело в том, что glut, по сути, инкапсулирует функции Windows и OpenGL, что упрощает операции с ними. Но от базовых вещей же никуда не деться. Т.е. если процедура обработки оконных сообщений (CALLBACK WindowProc) должна присутствовать, то в классе она должна быть статической. Так и здесь:
Code:
  1. glutDisplayFunc(Draw); //где Draw - колбэк, а значит не может быть простым методом класса


Но вот проблема - мне нужно передать внутрь Draw несколько параметров. Являясь статическим методом, Draw не имеет указателя this, а значит не видит обычных полей. Статические поля он видит, но при попытке в конструкторе присвоить значения этим полям появляется ошибка линковки. Понятное дело, что по-хорошему, можно обойтись совсем без классов, но это превратит код в кашу - большое количество глобальных переменных, почти одинаковые функции со схожим функционалом принесут путаницу раньше, чем будут отрисованы несколько фигур. Кто посоветует, как быть в такой ситуации и как решить проблему со статическими функциями-членами?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 01 сентября 2012 21:49
· Личное сообщение · #2

F_a_u_s_t
Та проект был один - калькулятор. По мере того, как я его делал, я добавлял туда разный код, а когда CryptoPP не заработала, просто потёр там все упоминания об этой самой CryptoPP, и пошёл дальше, так что присылать нечего. Да и щас уже неактуально, калькулятор сдал, двигаемся дальше. А к этому вопросу вернусь позже, т.к. для практики такой класс больших чисел был бы весьма полезен. Для всяких высокоточных инженерных расчётов, например.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 сентября 2012 16:33
· Личное сообщение · #3

Теперь стоит следующая задача. В общем, задача классическая (по кодингу). Есть шахматная доска 8х8, на ней случайно выбирается стартовая клетка, с которой начинает ходить конь, нужно найти такой путь обхода, при котором конь обойдёт всю доску, побывав в каждой клетке лишь единожды. На решение этой задачи накладываются ограничения - нужно решать с применением рекурсии (без алгоритмов на графах), без использования эвристик, помогающих в выборе клеток для следующего хода коня, т.е. всякие правила Вансдорфа и т.д. использовать нельзя. Но, блин, у меня возникает вопрос: а возможно ли это или условие задачи поставлено некорректно? Я наваял кодес, который, вроде бы, работает как задуманно, но он не может за конечное время найти решение, перебирает его миллионами - а его всё нет. Тогда сел я и подсчитал, сколько возможно комбинаций при такой реализации алгоритма. Получается, что коню нужно сделать ещё 63 шага (в одной клетке он уже стоит), чтоб побывать в каждой клетке на доске. Всего на каждом ходу существует максимум 8 вариантов для выбора следующей позиции. Конечно, некоторые ходы вели бы к выходу за пределы шахматной доски, поэтому такие ходы не делаются, другие могут не делаться, если конь уже побывал в локации, в которую ему предлагают перейти. Но это всё отсекается дополнительными проверками, изначально же на первом шаге у коня 8 вариантов, на втором 8х8=64 варианта, и так далее методом индукции получаем, что всего таких вариантов 8^63=7,8463771692333509547947367790096e+56. В связи с этим еть у меня опасения, что что-то я делаю неправильно. Проект прилагаю.

05ee_12.09.2012_EXELAB.rU.tgz - Small_Recursion.rar

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 12 сентября 2012 17:02
· Личное сообщение · #4

Условие поставлено некорректно. Без теории графов не обойтись. А с ней задача сводится к классическому поиску гамильтонова пути используя РЕКУРСИВНЫЙ поиск в глубину.

-----
Следуй за белым кроликом


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 12 сентября 2012 18:50
· Личное сообщение · #5

Задача для перебора 8х8 конечно большая, но и кодеса что-то много. Вот из сети, тоже рекурсия, консолька конечно, но все в 26 строк помещается.
Code:
  1. //------------------------------------------------------73-05.cpp
  2. //------Обход шахматной доски конем
  3.  #define N 5
  4.  int desk[N][N] ; // поля доски
  5.  int step(int x0, int y0,int nstep){                        // nstep - номер шага
  6.  static int xy[8][2] = {{ 1,-2},1, 2},{-1,-2},{-1, 2},2,-1},2, 1},{-2, 1},{-2,-1}};
  7.  if (nstep == N*N) return 1; // все поля отмечены - успех
  8.  if (x0 < 0 || x0 >= N || y0 < 0 || y0 >= N )
  9.            return 0; // выход за пределы доски
  10.  if (desk[x0][y0] !=0)
  11.            return 0; // поле уже пройдено
  12.  desk[x0][y0] = nstep+1; // отметить свободное поле
  13.  for ( int i=0; i<8; i++) // локальный параметр - номер хода
  14.  if (step(x0+xy[i][0], y0+xy[i][1],nstep+1)) // рекурсивный вызов для следующего хода
  15.            return 1; // поиск успешного хода
  16.  desk[x0][y0] = 0; // стереть отметку поля
  17.  return 0; } // последовательность не найдена
  18.  #include <stdio.h>
  19.  void main(){
  20.  int i,j;
  21.  for (i=0; i<N; i++)
  22.  for (j=0; j<N; j++) desk[i][j] =0;
  23.  step(0,0,0); // вызвать функцию для исходной позиции
  24.  for (i=0; i<N; i++,printf("\n"))
  25.            for (int j=0; j<N; j++) printf ("%2d ",desk[i][j]);
  26.  }                  


-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 12 сентября 2012 22:42 · Поправил: ARCHANGEL
· Личное сообщение · #6

OKOB
У меня почти тоже самое. Два основных отличия в том, что:
1. В примере из 26 строк задан статический массив смещений, как в книге Дейтела. Я же, когда писал код, до этого недокумекал, и вычислял все восемь возможных локаций - т.е. определял их координаты и хранил структуры с двумя полями в стеке. Получалось более медленно, но суть та же.
2. Там используется цикл ход для прохода по одному и тому же уровню дерева, я же цикл развернул - у меня восемь конструкций if. Плохо, конечно, но сути алгоритма, снова, не меняет.

Ваш пример прекрасно отработал на доске 5х5, и трудится над доской 8х8. Что-то мне подсказывает, что результатов его труда я не дождусь.

neomant
Да, про такой алгоритм я слышал, но в задании специально уточнили условия - не использовать никаких алгоритмов на графах. Впрочем, вы, я полагаю, это уже поняли. И, что самое интересное, я ещё на паре высказал предположение, что результатов на доске 8х8 мы не дождёмся, на что мне ответили, что я не прав.

Однако у меня в коде всё равно что-то не так, т.к. для доски 5х5 тоже не работает. Ладно, принцип я понял - сейчас перепишу по образу и подобию примера. 26 строк не обещаю, но заработать должно.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 17 сентября 2012 10:17
· Личное сообщение · #7

Если кому интересно. На паре проверяли эту задачу. Конечно, результата на доске 8х8 так и не дождались. Но 5х5 работает. Стартовая локация на доске выбирается рандомно, и, что самое интересное, если стартануть из произвольной локации, то выясняется, что гамильтонов путь есть не для всех стартовых локаций, поэтому прожка в таких случаях выдаёт "Невозможно найти путь", а в следующий раз может выдать маршрут.

1397_17.09.2012_EXELAB.rU.tgz - Recursion.exe

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 23 сентября 2012 14:16
· Личное сообщение · #8

Товарищи, решил немного поизучать DirectX, хотя б самые основы. Скачал несколько книг по версии 9 этой технологии, скачал SDK, начал почитывать и столкнулся с такой проблемой, что авторы литературы очень любят в своих примерах подключать какие-то свои самописные заголовочные файлы, без которых, естественно, их примеры не работают, а рыскать в поисках этих хидеров не очень хочется, да и привязываться к чужому коду нет желания. Хочется кодить, опираясь только на СДК. Посоветуйте литературу - статьи, книги, видеоуроки, с которых следует начинать освоение этой темы.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 28 сентября 2012 18:46
· Личное сообщение · #9

Если кому интересно, то погуглив и понакачав литературы, остановился на книге Фленова М.Е. - DirectX и С++ Искусство программирования. Далее купил ещё одну неплохую А.Попов DirectX 10 - это просто. Программируем графику на С++. Плюс понемногу изучаю сэмплы, идущие вместе с SDK.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 29 сентября 2012 23:34
· Личное сообщение · #10

/me тоже когда то в детстве игрушки даже пытался и писал какие то, но гемдев - ЧСВ овер 9000, и одни гомнокодеры, и ушел в другие сферы программирования

для разнообразия еще свою ОС попробуй написать))




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 30 сентября 2012 16:21
· Личное сообщение · #11

reversecode
Та не - мне не для разнообразия. Для работы возникла идея написать одну программу, которая бы в реальном времени показывала визуализацию одного технологического процесса. Не будем вдаваться в детали этого процесса, думаю, это мало кому будет интересно, но суть в том, что визуализацию в реальном времени миллионов молекул надо как-то прорисовывать.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 30 сентября 2012 17:01
· Личное сообщение · #12

ARCHANGEL
Возьмите какой нибудь готовый движек коих море, если конечно не требуется все сделать самостоятельно.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 09 октября 2012 22:29
· Личное сообщение · #13

Товарищи, задача, видимо, не сложная, но я чего-то не доганяю. Есть у меня класс - двумерный массив. Всё в нём очень примитивненько, и надо мне, значит, перегрузить оператор [] так, чтоб я его мог дважды вызвать, т.е. например:

Code:
  1. Array a(4,5);
  2. UINT x = a[3][2];
  3. printf("a[%d][%d] = %d\n",3,2,x);


Если так делать:

Code:
  1.          T*& __stdcall operator[](UINT i)
  2.          {
  3.                  return Pointer[i];
  4.          };


То, как бы, дотянуться до самих элементов не выходит, т.к надо достать Pointer[i][j], а как это сделать?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2012 11:34 · Поправил: ARCHANGEL
· Личное сообщение · #14

В книге Солтер, Клепер - С++ для профессионалов пишут на стр. 512, что мне нужно перегрузить оператор вызова функции (т.е. operator()) для работы с многомерными массивами, т.к. заставить operator[] принять несколько параметров на входе у меня не выйдет. Что ж, будем пробовать.

T& __stdcall operator()(UINT i,UINT j)
{
return Pointer[i][j];
};

Да, так работает, класс создан шаблонным, а T - это <typename T>. Ну как-то так.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 11 октября 2012 14:57 · Поправил: reversecode
· Личное сообщение · #15

можно и [][] перегружать умеючи, там свои хитрости, нужно возращать ссылку, а потом и ее перегружать []
тогда получается двойной [][]
на rsdn часто обсуждали это. да и вообще в книгах помоему пишут

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 ноября 2012 23:52
· Личное сообщение · #16

Вот появилось время и решил снова терзать буст. Скачал свежую версию 1.52 с сорсфорджа, потом прочитал --> Руководство по установке <--, сделал всё, как там написано, и получилось. Буст был успешно собран, с ним собрал пример из библиотеки Spirit, и всё получилось.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 09 ноября 2012 14:19
· Личное сообщение · #17

ARCHANGEL
Spirit тот еще гуан, идея хорошая, а вот реализация черезжопная, что то более менее сложное собирается до ужаса долго, можно и не дождаться.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 ноября 2012 23:34
· Личное сообщение · #18

F_a_u_s_t
Это да, что долго. Но я пока ещё не вкурил, долго из-за моей криворукости, либо из-за либы всё-таки. Дело в том, что даже примеры из буста решают схожие задачи разными способами, и, может, можно ещё лучше - короче, пока всё сводится к чтению мануалов с сайта буста...

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 10 ноября 2012 23:48
· Личное сообщение · #19

ARCHANGEL
Не, из за самой либы, годится только для мелких парсеров, если возникнет желание написать небольшой язык с помощью spirit гони эту мысль подальше, с остальными проблем вроде не было из за времени компиляции.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 ноября 2012 00:26
· Личное сообщение · #20

F_a_u_s_t
Ну, не знаю, насколько мелким можно считать такой парсер, который должен распознавать порядка 20-30 токенов. А что из аналогов - yacc? Читаю класические труды на эту тему - так там больше теория, да, конечно, автомат для распознавания я уже, в принципе, мог бы составить, но не хочется терять на это время, если всё можно уже более-менее автоматизировать. Может подскажете что-то по лексическим анализаторам? Софт, книги, что-нибудь практическое. Я пока остановился на boost::spirit::lex, но готов прислушаться к годным советам.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 11 ноября 2012 00:45
· Личное сообщение · #21

ARCHANGEL
Должен потянуть, тут еще проблема даже не в том что долго, бывает компилятор помирает во время сборки
Вот неплохая ссылка с теорией и примером.

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 ноября 2012 00:46
· Личное сообщение · #22

F_a_u_s_t
Пойду читать...

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 15 ноября 2012 14:55
· Личное сообщение · #23

flex/bison - есть сборка под виндовс, а книги Орели тоже не плохи




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 16 ноября 2012 01:25
· Личное сообщение · #24

Ну, про флекс и бизон я уже сгуглил и даж скачал и потестил дистрибутивы. А что за книги - можно конкретнее?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 16 ноября 2012 02:20
· Личное сообщение · #25

ANRLR посмотри

http://www.antlr.org/

пару слов на русском
http://club.shelek.ru/viewart.php?id=39

а вот тут подборка литературы на Гиг и даже раздача есть
http://book.libertorrent.com/viewtopic.php?t=11903

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 ноября 2012 16:29
· Личное сообщение · #26

http://www.sendspace.com/filegroup/On6PSX0DEWervK3b6AC7Zg

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 17 ноября 2012 00:51 · Поправил: ARCHANGEL
· Личное сообщение · #27

reversecode
OKOB

Спасибо, есть из чего выбирать, что читать. Буду осваивать. Концепцию я уже, вроде бы как, понял. Хорошо в литературе, что по первому, что по второму иснтрументу есть книги с практическими примерами.

--> Здесь <-- ещё нашлось описание, как это в студию прикрутить. Студия там хоть и старенькая, но всё же.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 21 ноября 2012 21:34 · Поправил: Ratinsh
· Личное сообщение · #28

del




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 ноября 2012 20:26
· Личное сообщение · #29

Ratinsh
Чё-то я не понял, причём тут бутлоадеры? Ну да ладно.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 25 ноября 2012 04:38 · Поправил: Ratinsh
· Личное сообщение · #30

Уговорили - удалил




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 ноября 2012 16:26
· Личное сообщение · #31

я тоже кстати не понял, здесь блог другого человека, а вы ему какие то емуляторы и лоадеры даете


<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >>
 eXeL@B —› Дневники и блоги —› ARCHANGEL's blog
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати