Ошибки, баги, вопросы - страница 1970

 
pavlick_:

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

Вроде нашёл:

if(sizeof(color) <= sizeof(ulong))
   {
      
      if( ObjectCreate(0, "any_object", OBJ_TREND, 0, 0, 0)  &&
          ObjectSetInteger(0, "any_object", OBJPROP_COLOR, clrNONE) )
      {
         ulong clr;
         if( ObjectGetInteger(0, "any_object", OBJPROP_COLOR, 0, clr) )
         {
            Alert("clr == clrNONE ?  ", clr == (ulong)clrNONE);
            Alert("clrNONE value = ", (ulong)clrNONE);
            Alert("value that was returned = ", clr);
         }
         
      }
   }

Alert:

clr == clrNONE ?  false

clrNONE value = 4294967295

value that was returned = 18446744073709551615

Т.е. устанавливаем объекту цвет clrNONE, следом читаем цвет объекта, сравниваем полученное с clrNONE - они не сходятся.
 
pavlick_:

Т.е. устанавливаем объекту цвет clrNONE, следом читаем цвет объекта

читаем цвет другого объекта
 

Да, спасибо. Я там имена подправил, но ошибка всё равно осталась.

 
pavlick_:

устанавливаем объекту цвет clrNONE, следом читаем цвет объекта, сравниваем полученное с clrNONE - они не сходятся.

Alert("clr == clrNONE ?  ", (color)clr == clrNONE); // true

clrNONE - все биты 4-х байт заполнены единицами.

ulong clr - все биты 8-и байт заполнены единицами.

 
pavlick_:

Да, спасибо. Я там имена подправил, но ошибка всё равно осталась.

По факту в ObjectGetInteger, вместо

void ObjectGetInteger( long& x ) { x = clrNONE; }

происходит

void ObjectGetInteger( long& x ) { x = -1; }

выход: далее везде писать вместо x

(color)x
 
fxsaber:

clrNONE - все биты 4-х байт заполнены единицами.

ulong clr - все биты 8-и байт заполнены единицами.

Тут какая-то ошибка, думаю.

1. clrNONE - положительное 4х байтовое число т.к. Alert( long(clrNONE) ) == 4294967295 (если бы было отриц (color знаковый), то ушло бы в минус)

2. Перегнали его в лонг в SetInteger, значение не могло измениться

3. Почему в SetInteger я получаю непервоначальное число?

То ли внутри терминала color перегоняется в знаковый тип, int например, и потом вырастает при переводе в алонг, то ли ещё что-то.

 
Ещё раз всем большое спасибо. Почти уверен, что внутри цвет кастуется в signed, при обратном кастинге и ошибка. Ну это забота разработчиков написать валидную ObjectGetInteger(), делов то на несколько символов: ObjectGetInteger() { return long((uint)internal_clr); }
 
Это ошибка (разные массивы) или нет?
void OnStart()
{
  short Data[] = {1};
  short Data2[];
  
  StringToShortArray(ShortArrayToString(Data), Data2);
//  StringToShortArray(ShortArrayToString(Data), Data2, 0, ArraySize(Data)); // так массивы совпадут
  
  ArrayPrint(Data);  // 1
  ArrayPrint(Data2); // 1 0
}
 
fxsaber:
Это ошибка (разные массивы) или нет?
нет, просто завершающий 0 добавлен.
 
Комбинатор:
нет, просто завершающий 0 добавлен.

Выше добавил строку - указал копировать длину строки. Стало совпадать. Т.е. получается, что входной параметр count = -1 добавляет ноль в конец, а count = StringLen - ничего не добавляет. Нюансик!