Erros, bugs, perguntas - página 1970

 
pavlick_:

Tenho um erro no meu guião, tentando localizá-lo, por isso é contornado por agora.

Acho que a encontrei:

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);
         }
         
      }
   }

Alerta:

clr == clrNONE ? falso

valor clrNONE = 4294967295

valor que foi devolvido = 18446744073709551615

Ou seja, definimos clrNONE de cor para o objecto, depois lemos a cor do objecto e comparamo-la com clrNONE - eles não convergem.
 
pavlick_:

Ou seja, definir a cor do objecto para clrNONE, depois ler a cor do objecto

ler a cor de outro objecto
 

Sim, obrigado. Fixei lá os nomes, mas o erro ainda está lá.

 
pavlick_:

definir o objecto para colorir clrNONE, depois ler a cor do objecto, compará-lo com clrNONE - não correspondem.

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

clrNONE - todos os pedaços de 4 bytes são preenchidos com uns.

ulong clr - todos os pedaços de 8 bytes são preenchidos com uns.

 
pavlick_:

Sim, obrigado. Fixei lá os nomes, mas o erro ainda está lá.

Na verdade, em ObjectGetInteger, em vez de

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

vai

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

solução: depois escrever x em vez de x em todo o lado.

(color)x
 
fxsaber:

clrNONE - todos os pedaços dos 4 bytes são preenchidos com uns.

ulong clr - todos os pedaços de 8 bytes são preenchidos com uns.

Há aqui algum tipo de erro, penso eu.

1. clrNONE é um número positivo de 4 bytes desde Alert( long(clrNONE) ) == 4294967295 (se fosse negativo (sinal de cor), entraria em menos)

2. Convertemo-lo em longo no SetInteger, o valor não podia mudar

3. Porque recebo um número não-primário no SetInteger?

Ou a cor dentro do terminal é convertida para um tipo assinado, int por exemplo, e depois cresce quando convertida, ou outra coisa qualquer.

 
Mais uma vez, muito obrigado a todos vós. Tenho quase a certeza de que a cor interior é fundida para assinar, com fundição invertida e erro. Bem, cabe aos programadores escrever um ObjectGetInteger() válido, são necessários apenas alguns caracteres: ObjectGetInteger() { return long((uint)internal_clr); }
 
Isto é ou não um erro (matrizes diferentes)?
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:
Isto é ou não um erro (matrizes diferentes)?
não, apenas um 0 final acrescentado.
 
Комбинатор:
Não, apenas acrescenta um 0 de terminação.

Acrescentou uma linha acima - especificada para copiar o comprimento da linha. Começou a corresponder. Ou seja, acontece que a contagem do parâmetro de entrada = -1 adiciona zero ao fim, enquanto que a contagem = StringLen não adiciona nada. Nyuansyk!

Razão: