Перейти к содержанию

Что сравнивает оператор if?


Рекомендуемые сообщения

LPDIRECT3DBASETEXTURE9 BTEX = NULL;vector<DWORD> BASETEX;pDev->GetTexture(0, &BTEX);Found = false;for (UINT i = 0; i < BASETEX.size(); i++){   if (BASETEX[i] == (DWORD)BTEX)   {      Found = true;   }}

Что именно сравнивает оператор if в этом коде?

Ссылка на комментарий
Поделиться на другие сайты

/*----------------------------------------------------------------------------*/

 

Привет!

Сравнивает, равны ли BASETEX и (DWORD)BTEX. Первое - элемент массива (как

видно выше - вектора, но сути это не меняет) BASETEX по индексу i, второе -

значение переменной BTEX, приведённое к типу DWORD, так как элементы BASETEX

тоже имеют тип DWORD.

 

/*----------------------------------------------------------------------------*/

Ссылка на комментарий
Поделиться на другие сайты

Привет Кенг

BaseTexture BTEX;BTEX = device.GetTexture(0);List<BaseTexture> BASETEX = new List<BaseTexture>(); found = false;foreach (BaseTexture item in BASETEX){      if (item == BTEX)      {            found = true;       }}if (found == false){      BASETEX.Add(BTEX);}

почему вот тут, это не проходить? то есть, оператор if никогда не получает "TRUE". (Я уже ВЕСь мозг сломал за два дня)

Ссылка на комментарий
Поделиться на другие сайты

Я так понял проблема перевода с С++ на С#

 

Список из List<BaseTexture> BASETEX перед началом цикла каждый раз инициируется и уже абсолютно пустой. Судя по коду цикл ищет текстуру и естественно не может найти. Поэтому found всегда будет false.

 

На C# у шаблонного класса List<T> есть функция проверки вхождения bool List<T>.Contains<T>(), которая возвратит результат. Вот так бы это выглядело на движке Unity3D

List<Texture2D> listTexture2d = new List<Texture2D>();void TryAddTexture(Texture2D texture2D){  if(!listTexture2d.Contains(someTexture)){   listTexture2d.Add();  }   }void Start(){ // Запускается один раз  var someTexture1 = new Texture2D(10,10);  var someTexture2 = new Texture2D(10,10);  TryAddTexture(someTexture1);  TryAddTexture(someTexture2);}
Ссылка на комментарий
Поделиться на другие сайты

Я так понял проблема перевода с С++ на С#

 

Список из List<BaseTexture> BASETEX перед началом цикла каждый раз инициируется и уже абсолютно пустой. Судя по коду цикл ищет текстуру и естественно не может найти. Поэтому found всегда будет false.

 

Привет MasterGH, я немного не так показал код, извиняюсь, все пременные глобалны и они заного не инициализируеться, то есть вот так:

BaseTexture BTEX;BTEX = device.GetTexture(0);List<BaseTexture> BASETEX = new List<BaseTexture>();int DrawIndexedPrimitiveHook(IntPtr devicePtr, SharpDX.Direct3D9.PrimitiveType primitiveType, ...){    found = false;    foreach (BaseTexture item in BASETEX)    {          if (item == BTEX)          {                found = true;          }    }    if (found == false)    {         BASETEX.Add(BTEX);    }}

вот наглядное видео:

 

 

На C# у шаблонного класса List<T> есть функция проверки вхождения bool List<T>.Contains<T>(), которая возвратит результат. Вот так бы это выглядело на движке Unity3D

List<Texture2D> listTexture2d = new List<Texture2D>();void TryAddTexture(Texture2D texture2D){  if(!listTexture2d.Contains(someTexture)){   listTexture2d.Add();  }   }void Start(){ // Запускается один раз  var someTexture1 = new Texture2D(10,10);  var someTexture2 = new Texture2D(10,10);  TryAddTexture(someTexture1);  TryAddTexture(someTexture2);}

Эту сейчас проверю, но сомневаюсь что поможет... %)  по тому что, на ровном месте не сравниваеть!

Ссылка на комментарий
Поделиться на другие сайты

Имеет смысл не меняя этот код (на видео)  попробовать его на той же игре, что на видео. Обязательно! Первым делом! Только тот код и только та игра. Проверь внимательно совпадает ли он с тем что на видео.

 

Если не успешно, то искать причину логируя в файл ключевые моменты, а именно, проверка на null текстуру, прохождение тех или иных условий. Все пусть логируется. Если логи слишком частые, то хотя бы первые пару тысяч строк лога. Если успешно, то пробовать на разных играх. Если опять не успешно, то обязательно разобраться с тем что и какая строчка кода делает (вообще желательно в любом случае разобраться), какой результат должна возвратить, сравнить логи. 

 

Попробуй использовать визуальный отладчик этой dll в чужом процессе игры. Мне что-то помниться, что реально прямо из студии. Поставишь бряк, да и посмотришь состояние переменных и регистров. Если не знаешь как, то придется вести логи в файл или в текст в gui.

Ссылка на комментарий
Поделиться на другие сайты

Имеет смысл не меняя этот код (на видео)  попробовать его на той же игре, что на видео. Обязательно! Первым делом! Только тот код и только та игра. Проверь внимательно совпадает ли он с тем что на видео.

 

Если не успешно, то искать причину логируя в файл ключевые моменты, а именно, проверка на null текстуру, прохождение тех или иных условий. Все пусть логируется. Если логи слишком частые, то хотя бы первые пару тысяч строк лога. Если успешно, то пробовать на разных играх. Если опять не успешно, то обязательно разобраться с тем что и какая строчка кода делает (вообще желательно в любом случае разобраться), какой результат должна возвратить, сравнить логи. 

 

Попробуй использовать визуальный отладчик этой dll в чужом процессе игры. Мне что-то помниться, что реально прямо из студии. Поставишь бряк, да и посмотришь состояние переменных и регистров. Если не знаешь как, то придется вести логи в файл или в текст в gui.

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

 

Не ожиданно ответил сам создатель SharpDX (Alexandre Mutel), не ожидал потому что, вопрос задавал через гугл переводчик :-D думал не поймет. вот ответ:

"You need to compare the item.NativePointer. COM Objects are not cached"

 

Что значить "COM Objects are not cached"? ну... перевод понял но, смысл не понял. Я COM Objects не зняю

Ссылка на комментарий
Поделиться на другие сайты

DirectX не существует для C# как такового, всё это лишь managed обёртка над unmanged кодом (с++ либой DX).

Так вот, тебе нужно сравнивать не указали этих объектов C#, а указатели нативных объектов DX.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.