Sobre funções

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Sobre funções

Re: Sobre funções

Post by Hologram » 29 Sep 2020, 17:03

Tem razao foi um erro bem feio meu kk, o resultado que eu esperava era assim:

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, "search", "chat_yellow")
Resultado2 := search_Image_All_Window(PosX2, PosY2, "search", "chat_green")
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return





search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}
return

Re: Sobre funções

Post by Gio » 29 Sep 2020, 16:11

Bom, se está completo, então onde as variávies search, chat_yellow e chat_green estão recebendo seus valores?

Pelo que está no corpo da função search_Image_All_Window(), essas variáveis deveriam conter respectivamente o caminho da pasta e o nome do arquivo png que seriam buscados no ImageSearch. Sendo assim, o código deveria ser pelo menos algo como:

Code: Select all

search := "imagens" ; Nome da pasta que está dentro do script
chat_yellow := "imagem1" ; Nome do arquivo imagem1.png

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return
search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}

:arrow: Afinal de contas, quando você executa a chamada search_Image_All_Window(PosX1, PosY1, search, chat_yellow), o conteúdo da variável Search se torna o conteúdo da variável page dentro do corpo da função, e ao mesmo tempo, conteúdo da variável chat_yellow se torna o conteúdo da variável name dentro do corpo da função.

Re: Sobre funções

Post by Hologram » 29 Sep 2020, 12:01

O codigo esta completo kk, creio que tu nao viu pq pulei algumas linhas que ficaram ocultas sem abaixar um pouco a caixa de codigos

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return
search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}

Re: Sobre funções

Post by Gio » 29 Sep 2020, 11:33

Bom dia.

O código não parece estar inteiro, preciso ver como você está definindo os valores das variáveis, especialmente as variáveis chat_yellow e search.

Lembre-se que ao inserir literais usando o operador :=, você precisa colocá-los entre aspas duplas, pois do contrário, eles serão avaliados como variáveis onde o conteúdo deverá ser colocado na interpretação (e não o nome).

Re: Sobre funções

Post by Hologram » 29 Sep 2020, 10:51

Eu tentei seguir sua lógica, que faz bastante sentido pra falar a verdade, mas nao obtive um resultado nessa funçao, consegue apontar o erro

Code: Select all

loop{
Resultado1 := search_Image_All_Window(PosX1, PosY1, search, chat_yellow)
Resultado2 := search_Image_All_Window(PosX2, PosY2, search, chat_green)
	if (Resultado1 = 1) or (Resultado2 = 1){
		msgbox, imagem encontrada!
	}
}
return





search_Image_All_Window(PosX, PosY, page, name){
	ImageSearch, PosX, PosY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/%page%/%name%.png
	If (ErrorLevel = 0){
		Return 1
	}
}
Testando ela eu vi que o erro ta na variavel 'name' se eu tirar ela da funçao e colocar o nome da imagem manualmente, acaba rodando tranquilo

Re: Sobre funções

Post by Gio » 14 Sep 2020, 08:52

O comando Return tem um significado especial dentro de funções: além de retornar a execução para a linha da chamada da função, ele transforma a chamada em um resultado matemático.

Então execute o código simplificado abaixo e veja o que acontece:

Code: Select all

msgbox % 5 + RESOLVER()
Return


RESOLVER()
{
Return 9
}

:arrow: Como a função RESOLVER() retorna o valor matemático 9, o resultado de 5 + RESOLVER() se torna 14 (e é por isso que a msgbox exibe 14).

:arrow: Então se utilizarmos uma chamada a uma função que retorna um valor em uma expressão com o operador :=, o que teremos é que o valor do resultado será inserido dentro de uma variável. Por isso a linha Resultado := get_Cath(A_index) do código anterior está simplesmente inserindo o resultado retornado pela função get_Cath() dentro da variável Resultado.

Sendo assim, o que ocorre no código é que: nas iterações do loop em que a imagem for encontrada, a variável Resultado se transformará em 1 e com isso a condicional If (Resultado = 1) se tornará verdadeira, exibindo o tooltip.

:arrow: Creio que ficou um pouco difícil entender o código pelo fato de que ele não é testável sem que as condições ideais (imagens encontradas) ocorram, além de que o tooltip não tem um delay que o torne visível. Para entender melhor a lógica código anterior, removi o ImageSearch e coloquei um delay. Veja como agora o return 1 dita quais iterações do loop vão se transformar em tooltips:

Code: Select all

#Persistent

Loop 10
{
	Resultado := get_Cath(A_index)
	If (Resultado = 1)
	{
		ToolTip, A imagem %A_Index%.png foi encontrada.
	}
	Sleep 500
}
Return

get_Cath(corpse)
{
	If ((corpse = 3) OR (corpse = 5) OR (corpse = 7))
	{
		Return 1 ; Este valor retorna ao lugar onde ocorreu a chamada da função (as chamadas podem ser colocadas dentro de expressões matemáticas).
	}
}

Re: Sobre funções

Post by Hologram » 12 Sep 2020, 20:55

Uma ultima pergunta, pq nesse caso, a função vem depois do resultado? nao deveria ser vice-versa? eu tentei alterar e setou erro

Re: Sobre funções

Post by Gio » 11 Sep 2020, 21:09

Faltou um símbolo de chave de fechamento no código acima. Acabei de corrigir.

Hologram wrote:
11 Sep 2020, 20:40
Resultado := get_Cath(A_index)
O quê significa 'A_index' nessa linha?

E desse modo aonde eu posso especificar cada imagem pra ser procurada?
A_Index é uma variável embutida que contém o número da iteração atual dentro de um loop.

Então se esta for a primeira vez que o loop está rodando, A_Index vai conter 1. Já se for a trigésima vez que o loop está rodando, ela vai conter 30.

A_Index é portanto uma variável bastante útil para acessar listas de variáveis indexadas numericamente.

Re: Sobre funções

Post by Hologram » 11 Sep 2020, 20:40

Resultado := get_Cath(A_index)
O quê significa 'A_index' nessa linha?

E desse modo aonde eu posso especificar cada imagem pra ser procurada?

Re: Sobre funções

Post by Gio » 11 Sep 2020, 16:22

Bom, primeiramente, o return só vai servir para que a função devolva algum valor se ele estiver dentro das chaves (os símbolos { e } se chamam chaves, os colchetes são os símbolos [ e ]). O corpo da função termina no símbolo de chave de fechamento.


Acho que entendi o que você quer fazer. Para procurar 10 imagens cujos nomes foram indexados numericamente (de 1.png até 10.png) através de uma função, você pode fazer assim:

Code: Select all

Loop 10
{
	Resultado := get_Cath(A_index)
	If (Resultado = 1)
	{
		ToolTip, A imagem %A_Index%.png foi encontrada.
	}
}
Return

get_Cath(corpse)
{
	ImageSearch, PosX10, PosY10, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/search/%corpse%.png ; Se corpse é uma variável, você precisa dos %s para dereferenciá-la (do contrário o parâmetro entenderá como texto já que este parâmetro espera valores literais)
	If (ErrorLevel = 0)
	{
		MouseMove, 855, 629
		MouseClick, Right
		Sleep, 10
		MouseMove, %PosX10%, %PosY10%
		MouseClick, Left
		Return 1 ; Este valor retorna ao lugar onde ocorreu a chamada da função (as chamadas podem ser colocadas dentro de expressões matemáticas).
	}
}

Sobre funções

Post by Hologram » 11 Sep 2020, 14:49

Como mencionado no post anterior eu to procurando uma maneira de reduzir drasticamente as linhas em 1 dos meus scripts, nunca precisei de uma função em ahk, poderia corrigir pra mim por favor
a intenção é poder variar o nome 'corpse' dentro da imagesearch, e para nao deixar tantos return, eu poderia colocar 'and' ficando 'return get_Cath(1) and get_Cath(2) and get_Cath(3)... etc??

Code: Select all

get_Cath(corpse)
{
	ImageSearch, PosX10, PosY10, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/search/corpse.png
	If (ErrorLevel = 0){
		MouseMove, 855, 629
		MouseClick, Right
		Sleep, 10
		MouseMove, %PosX10%, %PosY10%
		MouseClick, Left
}
return get_Cath(1)
return get_Cath(2)
return get_Cath(3)
return get_Cath(4)
return get_Cath(5)
return get_Cath(6)
return get_Cath(7)
return get_Cath(8)
return get_Cath(9)
return get_Cath(10)
PS: O return eu deixei pra fora do colchetes pq quero retornar a função em forma global, nao sei se esta correto

Top