Russian AI Cup

Расширенный поиск  
Страницы: [1]

Автор Тема: С# alreadyHidePoints = 2; не дает эффекта.  (Прочитано 5515 раз)

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
С# alreadyHidePoints = 2; не дает эффекта.
« : Ноября 18, 2013, 01:16:20 pm »

При отладке стратегии часто натыкаюсь на такой косяк.

При исполнении строки, в которой переменной присваивается явно заданная константа

alreadyHidePoints = 2;

у переменной остается старое значение.

Если завести другую переменную, которой при определении задать значение 2, и присваивать уже ее, вместо явной двойки, то значение целевой переменной обновляется.

Студия 2010.

Разбил весь лоб. И еще долго буду бить, если не искоренить проблему.
Возможно, такое поведение есть в неизвестных мне местах стратегии.

Кто-нибудь сталкивался?

PS: случается в статических переменных класса. Если преобразовать в нестатик, то значение присваивается нормально. Но мне нужна переменная общая между солдатами.
« Последнее редактирование: Ноября 18, 2013, 01:21:30 pm от Megabyte »
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #1 : Ноября 18, 2013, 01:21:44 pm »

 :o

Афтар, ты что куришь?
Вставь по дебажной распечатки до присвоения значения и сразу после.
Убедись, что значение изменилось.

И проверь, что знак равенства один, в конце концов.
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #2 : Ноября 18, 2013, 05:41:16 pm »

Совсем никто не знает?

Ок спишем на то, что C# отстой. : )
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #3 : Ноября 18, 2013, 08:38:31 pm »

Нет, правда, Вы попробовали, как предложено?
Распечатка содержимого, присвоение и снова распечатка?
Ну ни разу не видел, чтобы число не записывалось в переменную и при этом программа не падала.
Записан

n0vi

  • Newbie
  • *
  • Сообщений: 13
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #4 : Ноября 18, 2013, 10:11:39 pm »

http://stackoverflow.com/questions/7488155/can-i-set-a-breakpoint-when-variable-is-getting-specific-value-in-net
В опциях точки останова из контектом меню выбрать Condition ввести любое условие с этой переменной равной какому-то значению и включить галочку On Change. Тогда проблема с присвоением сразу вылезет наружу.
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #5 : Ноября 19, 2013, 05:24:45 am »

Нет, правда, Вы попробовали, как предложено?
Распечатка содержимого, присвоение и снова распечатка?
Ну ни разу не видел, чтобы число не записывалось в переменную и при этом программа не падала.

Сеогодня не получается воспроизвести баг. Присваиваться стало нормально.
Встречалось три раза с разными переменными, с интервалом в день.

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

Как натолкнусь снова, попробую onchange брекпоинт. Оборачивать каждую операцию распечаткой входного значения результата, чтобы исключить баги c# не хочется. : )
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #6 : Ноября 19, 2013, 06:09:56 am »

Держите в курсе, весьма интересно, в чем же дело.
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #7 : Ноября 22, 2013, 09:28:38 pm »

Так и не понял что это было. Гугл молчит. Может ошибка в конкретном билде студии. Уже подумываю студию новую качать. Констант у меня много. Может какая и за глючит. Да и не факт, что на сервере компилятор с теми же багами.
Записан

antofik

  • Newbie
  • *
  • Сообщений: 3
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #8 : Ноября 22, 2013, 09:49:34 pm »

Сложно сказать, что у вас было, но это явно не баг C#
Отловить проблему можно следующим образом. Допустим у вас такое определение переменной:


public int alreadyHidePoints;


Замените его на следующее:


private int _alreadyHidePoints;
public int alreadyHidePoints
{
    get{return _alreadyHidePoints; }
    set
    {
           Debug.WriteLine("Assigning alreadyHidePoints: {0} => {1}", _alreadHidePoints, value);
           _alreadyHidePoints = value;
     }
}


Теперь у вас только одна точка, где происходит изменение переменной, и вы можете её контролировать: или поставить точку останова, или выводить сообщение тестовые - на ваш вкус.

 
Записан

jojo

  • Newbie
  • *
  • Сообщений: 9
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #9 : Ноября 22, 2013, 09:59:45 pm »

Это не паблик статик переменная должна быть?
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #10 : Ноября 23, 2013, 01:45:24 pm »

Баг встречал только на на статических переменных, которым присваивается явная числовая константа.

Когда знаешь на какой переменной эта проблема, и оборачивать нет смысла.
А оборачивать все переменные до единой гемор лишний.
Надеюсь не повторится : )
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #11 : Декабря 03, 2013, 02:24:59 pm »

опять при отладке столкнулся.

bool переменная заморожена на false.

myBoolVar = true; 
не дает эффекта. Отладчик показывает false, код ведет себя так, как будто эта переменная равна false.

Если такой-же компилятор используется на сервере, то это жопень.
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #12 : Декабря 03, 2013, 02:31:13 pm »

вот этот код


public static bool srataUzkiyJumpPrepared;

void f()
{
srataUzkiyJumpPrepared = true;
Console.WriteLine(srataUzkiyJumpPrepared);

}

выводит False в консоль.

Visual C# compiler version 4.0.30319
именно этот компилятор я использую для отладки, и именно он используется на сервере.
Как быть?
Скорее всего таких багов куча, за всеми переменными и присвоениями не уследишь.
« Последнее редактирование: Декабря 03, 2013, 02:36:21 pm от Megabyte »
Записан

CyberWo1f

  • Full Member
  • ***
  • Сообщений: 105
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #13 : Декабря 03, 2013, 02:33:02 pm »

Вы отлаживаете стратегию через локал ранер?
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #14 : Декабря 03, 2013, 02:36:59 pm »

Да через локал ранер и через репитер. Результат один.
Записан

CyberWo1f

  • Full Member
  • ***
  • Сообщений: 105
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #15 : Декабря 03, 2013, 02:38:21 pm »

У меня была мысль, что если вы через репитер работаете, то возможно не ту стратегию ему подсовываете, вот он и ведет себя не так как надо. Но если и в локал ранере такое повторяется, то тогда не знаю даже, что у вас =)
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #16 : Декабря 03, 2013, 02:51:31 pm »

заменяю прямое присвоение константы на такой вариант

bool b = true;
srataUzkiyJumpPrepared = b;


начинает работать как надо.
Перенос переменной в другой класс, смена модификатора доступа, не помогают.

Заменить все прямые присвоения констант невозможно. Это нужно и все числовые значения оборачивать, и возможно, те значения что внутри выражений.

Буду искать.
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 187
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #17 : Декабря 03, 2013, 02:59:43 pm »

Такая ситуация только при дебаге возникает? Если скомпилировать и запустить exe-шник, то всё ОК?
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #18 : Декабря 03, 2013, 03:06:25 pm »

Билдил релизную версию, тоже самое. Работает не правильно.

Сменил настройки приложения target framework на NET.3.5, работает как надо. И скомпилировалось без изменения кода.
Возвращаю NET 4.0   ошибка тоже возвращается. Переменная замораживает свое значение.

Похоже, найден корень кривизны всего софта от MS.

Может поменяете версию NET на сервере и всех предупредите о необходимости компилить под 3.5?
Записан

SladeThe

  • Global Moderator
  • Sr. Member
  • *****
  • Сообщений: 187
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #19 : Декабря 03, 2013, 03:29:42 pm »

Вы уверены, что на сервере наблюдается тот же эффект? Я имею в виду, что вы не можете просматривать вывод стратегии в боях на сайте (кроме верификационных).

Можете предоставить нам минимальную стратегию, на которой можно наблюдать данный эффект (с выводом в консоль и т.д.)? Мы проведём собственный эксперимент.
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #20 : Декабря 03, 2013, 03:31:43 pm »

Обнаружил что проблема возникает когда на строке установлена точка останова.
Если поставить точку останова строкой ниже, то все ок.
Глюк студии. : (
Но шарпу теперь доверия никакого.

Буду у себя тестить под NET 3.5
Записан

nakilon

  • Full Member
  • ***
  • Сообщений: 98
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #21 : Декабря 03, 2013, 04:13:06 pm »

Энный раз вижу у людей проблемы из-за использования инструментов дебага более сложных, чем аккуратный printf.
Записан

vovo4ka

  • Jr. Member
  • **
  • Сообщений: 34
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #22 : Декабря 03, 2013, 06:42:35 pm »

Обнаружил что проблема возникает когда на строке установлена точка останова.
Если поставить точку останова строкой ниже, то все ок.
Глюк студии. : (
Но шарпу теперь доверия никакого.

Буду у себя тестить под NET 3.5
Вот вам и ответ. Проблема не в шарпе. И не в студии. Проблемы надо искать в себе..
Записан

Megabyte

  • Jr. Member
  • **
  • Сообщений: 27
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #23 : Декабря 06, 2013, 10:19:07 am »

Обнаружил что проблема возникает когда на строке установлена точка останова.
Если поставить точку останова строкой ниже, то все ок.
Глюк студии. : (
Но шарпу теперь доверия никакого.

Буду у себя тестить под NET 3.5
Вот вам и ответ. Проблема не в шарпе. И не в студии. Проблемы надо искать в себе..

А в чем логика этого ответа?
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #24 : Декабря 06, 2013, 10:55:23 am »

В батхерте :-)
Записан

DVS

  • Hero Member
  • *****
  • Сообщений: 688
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #25 : Декабря 06, 2013, 02:10:08 pm »

Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #26 : Декабря 06, 2013, 02:11:09 pm »

Если не знаете, значит лучше и не знать :-)
Записан

moat

  • Newbie
  • *
  • Сообщений: 5
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #27 : Декабря 06, 2013, 02:36:42 pm »

Страшно подумать какие будут у вас результаты, если не будет этой проблемы  :)
А попробуйте volatile использовать с этим static int.
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #28 : Декабря 06, 2013, 02:38:33 pm »

Представил результаты.
Ушел стирать штаны.
Записан

moat

  • Newbie
  • *
  • Сообщений: 5
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #29 : Декабря 06, 2013, 02:41:29 pm »

Представил результаты.
Ушел стирать штаны.
Как-то мало у вас конструктива.
Ну хотя у вас времени теперь много свободного  ;D
Записан

access_denied

  • Sr. Member
  • ****
  • Сообщений: 282
Re: С# alreadyHidePoints = 2; не дает эффекта.
« Ответ #30 : Декабря 06, 2013, 02:55:40 pm »

Если бы.
Ровно столько же.
Так же пилю дальше.
Записан
Страницы: [1]