Ir para conteúdo


Foto

Problema com Logica

#global #select #local #dim #logica #switch #problema #if

Melhor Resposta Manimal, 01 maio 2017 - 08:16

Olá Denis de Araújo Ferreira.

 

Na maioria das linguagens ditas "tipadas" esse tipo de comparação que vc está tentando fazer não seria possível.

 

Em linguagens como C, Pascal ou Java seria impossível comparar um número com uma string.

 

Felizmente (ou infelizmente) o AutoIt tem uma liberdade muito grande neste ponto. E por isto mesmo que devemos ter um cuidado extra ao fazermos este tipo de comparações.

 

Quando fazemos um IF, estamos basicamente comparando 2 variáveis do MESMO TIPO, ou seja, ambas numéricas, ambas string ou ambas lógicas. Ao efetuar comparações entre TIPOS DIFERENTES de variáveis, devemos ter em mente como que esta comparação será feita.

 

No AutoIt, ao compararmos TIPOS DISTINTOS, elas serão basicamente convertidas para números e daí feita a comparação. Neste caso todas as variáveis string são avaliadas como 0 (zero), pois não possuem um "valor" específico pois começam com letras, portanto o valor delas é zero!

 

Por isso teu programa deu resultado 5 e não 3 como vc gostaria.

 

Mas é interessante notar que o AutoIt ao converter as variáveis tipo string para números, leva em consideração o conteúdo das mesmas. Assim mesmo strings que contenham números serão convertidas para números, o que pode levar a conclusões e lógicas de programação incorretas. Por exemplo:

  1.  
  2. $variavel = "AutoIt"
  3. If $Variavel = 0 then ... ; isto vai ser VERDADEIRO porque ao converter a string, a primeira letra não tem representação numérica, portanto valor 0 (zero)
  4.  

mas se alterarmos o conteúdo da variável

  1.  
  2. $variavel = "5AutoIt"
  3. If $Variavel = 0 then ... ; isto vai ser FALSO porque ao converter a string, a primeira letra TEM representação numérica, nesse caso 5 (cinco)
Muito cuidado com isto!

 

A partir daqui temos 2 caminhos que vc deve seguir:

  1. Ou converte todas as variáveis para o mesmo tipo usando as funções string() ou number()
  2. Ou modifica seu programa pra refletir o que vc realmente quer

Eu acho que no seu exemplo, se a intenção era verificar se havia conteúdo dentro das variáveis string, então o operador correto a ser usado na comparação seria ==

Porque daí vc força a comparação do tipo (númerica/string) e do conteúdo da variável!

 

Outra possibilidade (e a mais correta no meu entendimento): Ao saber que as variáveis $x1, $x2 e $x3 são string, trate-as como tal da seguinte forma:

  1.  
  2. If $x1 = "" then ...
Visualizar todo o conteúdo do post


  • Por favor, faça o login para responder
5 respostas neste tópico

#1 DENIS DE ARAUJO FERREIRA

DENIS DE ARAUJO FERREIRA

    Novato

  • Membros
  • 3 posts
  • LocationMauá

Postado 01 maio 2017 - 12:48

Boa tarde,
 
Estou tendo o seguinte problema com meu script.
 
-Defino variável $y = 0
-Defino as variáveis $a = nomes
-Defino as variáveis $x = 0
-Defino que as variáveis $x serão iguais as $a
-Defino que toda vez que alguma variável $x for 0 some +1 na variável $y
-Dou um comando "msgbox" e ele me retorna o valor de $y como se todos $x fossem 0, e isto esta errado...
 

A resposta deveria ser: 3 (pois somente $x4,$5 e $6) sao = 0

Mas ele retorna: 5 (como se todos "$x" fossem 0)

Segue código anexo, obrigado.
 
 
 
 
 

Arquivo(s) anexado(s)


Editado por DENIS DE ARAUJO FERREIRA, 01 maio 2017 - 03:48 .


#2 DENIS DE ARAUJO FERREIRA

DENIS DE ARAUJO FERREIRA

    Novato

  • Membros
  • 3 posts
  • LocationMauá

Postado 01 maio 2017 - 03:41

Coloquei a msg no primeiro post.

Editado por DENIS DE ARAUJO FERREIRA, 01 maio 2017 - 03:49 .


#3 Manimal

Manimal

    Membro Nível 3

  • Administradores (Adm)
  • PipPipPipPip
  • 358 posts
  • LocationVideira/SC

Postado 01 maio 2017 - 08:16   Melhor Resposta

Olá Denis de Araújo Ferreira.

 

Na maioria das linguagens ditas "tipadas" esse tipo de comparação que vc está tentando fazer não seria possível.

 

Em linguagens como C, Pascal ou Java seria impossível comparar um número com uma string.

 

Felizmente (ou infelizmente) o AutoIt tem uma liberdade muito grande neste ponto. E por isto mesmo que devemos ter um cuidado extra ao fazermos este tipo de comparações.

 

Quando fazemos um IF, estamos basicamente comparando 2 variáveis do MESMO TIPO, ou seja, ambas numéricas, ambas string ou ambas lógicas. Ao efetuar comparações entre TIPOS DIFERENTES de variáveis, devemos ter em mente como que esta comparação será feita.

 

No AutoIt, ao compararmos TIPOS DISTINTOS, elas serão basicamente convertidas para números e daí feita a comparação. Neste caso todas as variáveis string são avaliadas como 0 (zero), pois não possuem um "valor" específico pois começam com letras, portanto o valor delas é zero!

 

Por isso teu programa deu resultado 5 e não 3 como vc gostaria.

 

Mas é interessante notar que o AutoIt ao converter as variáveis tipo string para números, leva em consideração o conteúdo das mesmas. Assim mesmo strings que contenham números serão convertidas para números, o que pode levar a conclusões e lógicas de programação incorretas. Por exemplo:

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

mas se alterarmos o conteúdo da variável

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido

Muito cuidado com isto!

 

A partir daqui temos 2 caminhos que vc deve seguir:

  1. Ou converte todas as variáveis para o mesmo tipo usando as funções string() ou number()
  2. Ou modifica seu programa pra refletir o que vc realmente quer

Eu acho que no seu exemplo, se a intenção era verificar se havia conteúdo dentro das variáveis string, então o operador correto a ser usado na comparação seria ==

Porque daí vc força a comparação do tipo (númerica/string) e do conteúdo da variável!

 

Outra possibilidade (e a mais correta no meu entendimento): Ao saber que as variáveis $x1, $x2 e $x3 são string, trate-as como tal da seguinte forma:

Por favor Login ou se não possuir um conta Registre-se para ver o conteúdo escondido



#4 DENIS DE ARAUJO FERREIRA

DENIS DE ARAUJO FERREIRA

    Novato

  • Membros
  • 3 posts
  • LocationMauá

Postado 01 maio 2017 - 11:56

sensacional, muito obrigado pela aula :D

 

Resolvido, e aprendi mais um pouco.



#5 humble

humble

    Novato

  • Membros
  • 1 posts

Postado 03 maio 2017 - 07:49

Boa noite a todos

Estou querendo aprender a programar em autoit, mas não entendo de programação.

Fico olhando os pequenos scripts do fórum e fico perdido, peço ajuda de todos.

Estou atualmente olhando pela net logica de programação.

Quem tiver alguma dica fico muito agradecido.



#6 Pedro Pinheiro

Pedro Pinheiro

    Membro Nível 2

  • Membros
  • PipPipPip
  • 212 posts
  • LocationBrazil

Postado 05 maio 2017 - 11:45

@manimal.muito boa explicação.

@humble. O help do autoit tem uma variedade gigantesca de exemplos para tudo. eu vi aqui no forum em algum lugar o dowload do help em pt br traduzido pelo Airhead se for o caso. Nao posso te dar mais dicas deralhadas pq estou net no pc, mas o basico é isso.

Editado por Pedro Pinheiro, 05 maio 2017 - 11:50 .





0 usuário(s) está(ão) lendo este tópico

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

Documentação OnLine de referência