Erros, bugs, perguntas - página 326

 
Urain:

No primeiro posto que estiver a fazer operações de atribuição, a atribuição múltipla em cascata é aceitável. Aqui está a tentar fazer uma comparação múltipla.


Eu sei como comparar, mas se(a<b<c) funciona e parece mais bonito embora a ajuda não diga nada sobre isso. como é que funciona mais rápido?
 
sergey1294:
Sei como comparar, mas se(a<b<c) funciona e parece mais bonito, embora a ajuda não diga nada sobre isso. Mas como é que funciona mais depressa?

A sua expressão é igual a esta

if(a<(b<c))
se comparar b e c, o resultado desta comparação será 0 ou 1 e depois comparar este resultado com a.
 
sergey1294:
Sei como comparar, mas se(a<b<c) funciona e parece mais bonito, mesmo que a ajuda não diga nada sobre isso. Como funciona mais rápido?

É assim que funciona.

if(a&&b&&c==3)Alert("a=b=c=3");
if(a<b&&b<c)Alert("a<b<c");
  if(a==b)Alert("a=b");

e isto não acontece.

 if(a<b<c)Alert("a<b<c");
 if(a=b=c=3)Alert("a=b=c=3");
 if(a==b==c==3)Alert("a=b=c=3");
 if(a==b==c)Alert("a=b=c"); //Вот нежелание работать этого примера для меня странно (хотя может так и задумано)
Urain:

A sua expressão é igual a isto

se comparar b e c, o resultado desta comparação será 0 ou 1 após o qual se compara este resultado com a.
Com esta lógica tudo se torna claro, mas por alguma razão penso que a e b serão comparados primeiro (pode ser que eu esteja errado, claro)...
 
Urain:

A sua expressão é a mesma que esta.

se comparar b e c, o resultado desta comparação é 0 ou 1 e depois compara-se este resultado com a.

Estou a ver, mas aqui está o truque com esta expressão, mas não funciona

void OnStart()
  {
//---
   int a=1;
   int b=2;
   int c=3;
   int d=3;
//---   
   if(a!=b<c==d)Alert("");
   else Alert("Условие не верно");
//---
  }
 
Interesting:
... Só eu penso de alguma forma que a e b serão comparados primeiro (posso estar errado, claro)...
Sim, estou mecanicamente errado, primeiro há uma comparação com a esquerda, depois com a direita.
 
sergey1294:

Estou a ver, mas aqui está o truque com esta expressão, mas não funciona

Não, é só que é preciso ter em conta as prioridades das operações e o comentário de Urain.

Também não há qualquer problema com esta expressão, mas ela falha muito mal.

if(a<b<c)Alert("a<b<c");

Esta edição é descrita em pormenor na secção "Prioridades e ordem de operações ". (A prioridade e a ordem das operações devem ser tidas em conta).

Assim, se bem entendi, a comparação de acordo com o compilador parece-se com isto (tendo em conta os comentários de Nikolai)

if((a!=(b<c))==d)Alert("")
 
Interesting:
Qual é o tamanho aproximado da lista? Talvez haja um limite para o tamanho da lista...
Exactamente 100 linhas.
 
-Alexey-:
Exactamente 100 linhas.

Experimentei com uma das minhas bibliotecas (110 funções), exibia 100 a 106 na lista (e um número diferente a toda a hora, mas não 110).

 

Ao ler o ficheiro .csv, vários problemas surgiram ao mesmo tempo. A fim de tentar descobrir as razões do mau funcionamento, escrevi um guião simples. O guião lê dados do ficheiro "test.csv". Assim que chega ao fim do ficheiro, imprime o número de iteração do laço "para", o tamanho do ficheiro e a posição do ponteiro do ficheiro no registo. Mas aqui acontecem coisas incompreensíveis, nomeadamente: O ficheiro "test.csv" tem apenas 15 linhas, pelo que o número de iteração do laço "para" deve ser 14, mas a revista gera 0. O tamanho do ficheiro é impresso correctamente, mas a posição do ponteiro final do ficheiro tem um tamanho maior do que o próprio ficheiro por alguma razão. Código do guião:

void OnStart()
  {
   int handle;
   ulong i, size;
   double _Ask, _Bid;
   string str;
      
   handle = FileOpen("test.csv",FILE_CSV|FILE_READ,',');
   
   if (handle != INVALID_HANDLE)
     {
      size = FileSize(handle);
      
      for (i = 0; i < size; i++)
        {
         str = FileReadString(handle);
         _Ask = FileReadNumber(handle);
         _Bid = FileReadNumber(handle);
        
         if (FileIsEnding(handle))
           {
            Print(i," ",size," ",FileTell(handle));
            break;
           }
        }
     }   
      
   FileClose(handle);

   return;
  }

ficheiro "test.csv" e log em anexo. Quem tem alguma ideia sobre esta questão?

P.S. O mais interessante é que em MT4 este guião funciona sem erros.

Arquivos anexados:
test.zip  1 kb
 
DenisR:

Ao ler o ficheiro .csv, vários problemas surgiram ao mesmo tempo. A fim de tentar descobrir as razões do mau funcionamento, escrevi um guião simples. O guião lê dados do ficheiro "test.csv". Assim que chega ao fim do ficheiro, imprime o número de iteração do laço "para", o tamanho do ficheiro e a posição do ponteiro do ficheiro no registo. Mas aqui acontecem coisas incompreensíveis, nomeadamente: O ficheiro "test.csv" tem apenas 15 linhas, pelo que o número de iteração do laço "para" deve ser 14, mas a revista gera 0. O tamanho do ficheiro é impresso correctamente, mas a posição do ponteiro final do ficheiro tem um tamanho maior do que o próprio ficheiro por alguma razão. Código do guião:

ficheiro "test.csv" e log em anexo. Quem tem alguma ideia sobre esta questão?

P.S. O mais interessante é que em MT4 este guião funciona sem erros.

Num relance, todo o ficheiro é escrito para str...
Adicionar a bandeira FILE_ANSI, uma vez que lê unicode por defeito:)
Além disso, terei 15 anos, uma vez que há uma linha em branco no final.