ฟอรั่มของบล็อก http://pssix.blogspot.com


มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

Share

offxo2591
สมาชิกทั่วไป
สมาชิกทั่วไป


จำนวนข้อความ : 11
ความนิยม : 0
เข้าร่วมเมื่อ : 23/07/2014

มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by offxo2591 on 05/11/15, 07:37 pm

คือผมกำลังเขียนสคริปนึง มันเป็นสคริป For ใน While อะครับ
ขออธิบายไว้ว่า เนื้อหาด้านล่างนี้ ผมได้บอกไว้ 2 ลูป คือลูปใหญ่(While) และลูปย่อย(For) ฉะนั้น พยายามอย่างงนะครับ 555+

While $w1 <<<(ลูปใหญ่)
ToolTip("รอบที่1",0,0,"")
For $w1 = 6 To 1 Step -1 <<<(ลูปย่อย)
PixelSearch(210,100,267,148,0x840000)
If not @error Then
ExitLoop
Elseif $w1 = 1 Then
$w1 = not $w1
EndIf
sleep(1000)
Next
PixelSearch(210,100,267,148,0x8AB912)
If not @error then
MouseClick("Left",381,12,1,10)
ExitLoop
EndIf
Sleep(2000)
WEnd

ตามสคริปด้านบนนะครับ คือผม จะให้ For เนี่ย ทำการตรวจสอบบริเวณสีที่กำหนด ท่าเจอ ให้ออกจากลูปของ For ท่าไม่เจอ และ จำนวนรอบของ For มาถึงรอบสุดท้าย ให้เปลี่ยนตัวแปร $w1 เป็นเป็นเท็จ จากนั้น ลูปทั้งหมด จะหยุดทำงาน ซึ่ง พอเจอ สีที่กำหนดเนี่ย มันจะออกจากลูปของ For และมาอยู่ที่บรรทัด PixelSearch ใช่ไหมครับ และบรรทัดนั้นก็จะทำการตรวจสีในบริเวณนั้นๆ คือท่ามันจะ ก็จะสั่งเมาส์คลิก และออกจากลูป(While) แต่คือท่ามันไม่เจอเนี่ย มันก็ต้องย้อนกลับไปเริ่มลูปไหมใช่ไหมครับ พอมันเริ่มใหม่ มันก็จะมาเปิด ลูปของ For อีก! เนี่ยแหละครับปัญหาของผม คือผมจะทำให้ไอลูป For เนี่ย มันเปิดใช้ครั้งเดียว และทิ้งไปเลยครับ ไม่ต้องเปิดใช้อีก จะทำอย่างไรครับ ผมยังไม่รู้ทางออกของปัญหาเลย

ขอขอบคุณล่วงหน้า

ironsulfide
มือใหม่เพิ่งสมัคร
มือใหม่เพิ่งสมัคร


จำนวนข้อความ : 9
ความนิยม : 3
เข้าร่วมเมื่อ : 09/05/2013

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by ironsulfide on 11/11/15, 01:44 pm

ไม่ลองกำหนดค่า Bolean ใช้ในการกำกับการเข้า Loop ก่อนอีกทีล่ะครับ
เช่น ตั้ง ตัวแปรBooolean ชื่อ First กำหนดไว้ว่า จะให้มันทำงานเพียงครั้งแรกของการเปิดใช้งานโปรแกรม

เมื่อจะเข้าลูป For คุณก็ใส่ If ไว้ก่อนว่า ถ้า First เป็น True นะจะเข้าเงื่อนไขใช้ For
พอคุณ ถึงส่วนทีจะออกจาก For คุณก็กำหนดค่าใช้ First เป็นFalse แค่นี้ หลังจาก Loop ใหญ่กลับมาวน เมื่อมาถึงส่วนของ If First มันก็จะข้าม ลูป For ไปแล้วนี่ครับ ถ้าผมเข้าใจตรงไหนผิดก็อธิบายเพิ่มไว้ละกันครับ แล้วจะมาช่วยกัน งงใหม่ 55555

offxo2591
สมาชิกทั่วไป
สมาชิกทั่วไป


จำนวนข้อความ : 11
ความนิยม : 0
เข้าร่วมเมื่อ : 23/07/2014

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by offxo2591 on 19/11/15, 06:46 pm

ironsulfide พิมพ์ว่า:ไม่ลองกำหนดค่า Bolean ใช้ในการกำกับการเข้า Loop ก่อนอีกทีล่ะครับ
เช่น ตั้ง ตัวแปรBooolean ชื่อ First กำหนดไว้ว่า จะให้มันทำงานเพียงครั้งแรกของการเปิดใช้งานโปรแกรม

เมื่อจะเข้าลูป For คุณก็ใส่ If ไว้ก่อนว่า ถ้า First เป็น True นะจะเข้าเงื่อนไขใช้ For
พอคุณ ถึงส่วนทีจะออกจาก For  คุณก็กำหนดค่าใช้ First เป็นFalse  แค่นี้ หลังจาก Loop ใหญ่กลับมาวน เมื่อมาถึงส่วนของ If First มันก็จะข้าม ลูป For ไปแล้วนี่ครับ   ถ้าผมเข้าใจตรงไหนผิดก็อธิบายเพิ่มไว้ละกันครับ แล้วจะมาช่วยกัน งงใหม่ 55555

ขอบคุณครับ ผมหาทางออกแล้ว ความจริง For มันก็เป็นลูปอย่างนึงเช่นกันแต่แค่กำหนดรอบไว้เท่านั้นเอง พอผมเอา for ไปใส่ไว้ในwhile มันก็เลยทำงานผิดพลาด พอผมเอา while ออกแล้วใส่ for เดี่ยวๆเลย ทำงานปกติครับ หาค่าสีได้ปกติ ขอบคุณครับผม! แต่ก็มีคำถามมาใหม่ ผมกำลังหาวิธีเข้าไปทำงานลูปเดิมอะครับ กำลังงงเลยตอนนี้ คือเมื่อผมออกจากลูปปกติใช่ไหมครับ สคลิปจะทำงาน บน ลง ล่าง ซึ่งพอมันผ่านลูปหนึ่งมาแล้วเนี่ย คือผมอยากจะให้มันกลับไปทำงานที่ลูปที่มันผ่านมาอะครับต้องใช้คำสั่งอะไรหรอครับ ผมยังหาคำสั่งไม่ได้เลย ตอนนี้ต้องมานั่งก๊อปคำสั่งต่อกัน 1000 กว่าบรรทัดแทน เพราะไม่สามารถกลับไปใช้ลูปเก่าได้ ต้องมานั่งสร้างลูปแบบเดียวกัน ต่อกันแทน -0- (ผมอาจจะอธิบายไม่เข้าใจ ก็ขออภัยด้วยครับ)

ironsulfide
มือใหม่เพิ่งสมัคร
มือใหม่เพิ่งสมัคร


จำนวนข้อความ : 9
ความนิยม : 3
เข้าร่วมเมื่อ : 09/05/2013

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by ironsulfide on 20/11/15, 04:00 pm

คือตามปกติเราจะให้มันกลับไปวนทำงานในบรรทัดที่ผ่านมา ตามอัลกอริทึ่ม แล้วเราจะใช้ลูปครอบ เพื่อตรวจสอบเงื่อนไขและย้อนกลับไปทำ   หรือ เราจะตัดเอาลูป for ตัวนั้นไปทำงานเป็นฟังกชั่นแยกไป  เมื่อจะใช้ตรงจุดไหนเราก็เรียกฟังก์ชั่นนั้นๆ ก็ได้ครับ  ซึ่ง กรณีการทำให้เป็นฟังก์ชั่นจะมีความยืดหยุ่นกว่า เพราะไม่จำเป็นต้องมีลูปก็ได้ หรือเรียกจากจุดไหนๆก็ได้ครับ

ข้อสังเกตุตัวโปรแกรมท่านที่จะเสี่ยงทำให้เกิดปัญหาคือ
ลอจิกที่ใช้สร้างให้ค่า Sw เป็นเท็จนั้น จะไม่ใช้แบบนั้นนะครับ ปกติใช้ $var = False  หรือ $var = True  มากกว่าครับ
และการที่ท่านพยายามใช้ตัวแปรเดิมแต่แปลงชนิดของตัวแปร  แม้ใน Autoit จะทำได้ แต่ผมแนะนำให้เลี่ยงดีกว่าครับไว้ยามจำเป็นค่อยใช้เพราะโอกาสที่จะเกิดปัญหามันเยอะกว่าการกำหนดตัวแปร แยกประเภทกันไป

offxo2591
สมาชิกทั่วไป
สมาชิกทั่วไป


จำนวนข้อความ : 11
ความนิยม : 0
เข้าร่วมเมื่อ : 23/07/2014

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by offxo2591 on 20/11/15, 07:56 pm

ironsulfide พิมพ์ว่า:คือตามปกติเราจะให้มันกลับไปวนทำงานในบรรทัดที่ผ่านมา ตามอัลกอริทึ่ม แล้วเราจะใช้ลูปครอบ เพื่อตรวจสอบเงื่อนไขและย้อนกลับไปทำ   หรือ เราจะตัดเอาลูป for ตัวนั้นไปทำงานเป็นฟังกชั่นแยกไป  เมื่อจะใช้ตรงจุดไหนเราก็เรียกฟังก์ชั่นนั้นๆ ก็ได้ครับ  ซึ่ง กรณีการทำให้เป็นฟังก์ชั่นจะมีความยืดหยุ่นกว่า เพราะไม่จำเป็นต้องมีลูปก็ได้  หรือเรียกจากจุดไหนๆก็ได้ครับ

ข้อสังเกตุตัวโปรแกรมท่านที่จะเสี่ยงทำให้เกิดปัญหาคือ
ลอจิกที่ใช้สร้างให้ค่า Sw เป็นเท็จนั้น จะไม่ใช้แบบนั้นนะครับ ปกติใช้ $var = False  หรือ $var = True  มากกว่าครับ
และการที่ท่านพยายามใช้ตัวแปรเดิมแต่แปลงชนิดของตัวแปร  แม้ใน Autoit จะทำได้ แต่ผมแนะนำให้เลี่ยงดีกว่าครับไว้ยามจำเป็นค่อยใช้เพราะโอกาสที่จะเกิดปัญหามันเยอะกว่าการกำหนดตัวแปร แยกประเภทกันไป

ขอบคุณครับที่แนะนำปกติพอผมจะปิดลูปผมจะใช้ not กลับข้างมัน แต่ผมเพิ่งรู้ว่าใช้ = flase หรือ = true ได้ ขอบคุณที่แนะนำครับ แต่คืออย่างหนึ่งผมยังไม่เข้าใจคือ "ใช้ลูปครอบเพื่อตรวจสอบเงื่อนไขและย้อนกลับไปทำ" กับ "แยกฟังชั่นและเรียกใช้ฟังชั่นจากจุดจุดใดก็ได้" มันทำอย่างไรหรอครับ ผมไม่เคยทำเลยอะครับ ปกติใช้แค่ HotKeySet("{F1}","exit") ใช้เป็นคำสั่ง HotKeySetเพื่อเรียกใช้ฟังชั่น Func exit()
exit
endfunc

ตามที่ผมเข้าใจแค่นั้นอะครับ O_O หรือผมเข้าใจความหมายของ ฟังก์ชั่นผิดกันนะ รบกวนด้วยนะครับ!!!(ยกตัวอย่างด้วยผมจะเข้าใจง่ายขึ้น)

ironsulfide
มือใหม่เพิ่งสมัคร
มือใหม่เพิ่งสมัคร


จำนวนข้อความ : 9
ความนิยม : 3
เข้าร่วมเมื่อ : 09/05/2013

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by ironsulfide on 24/11/15, 01:12 pm

Code เดิมของท่าน เป็นการสร้างลูปครอบลูปอีกที ถือว่าถูกแล้วครับในกรณีการเรียกลูปมาใช้งาน
ส่วนการเรียกฟังก์ชั่นนั้น  ผมจะลงตัวอย่างการใช้ฟังก์ชั่นเบื้องต้นนะครับ
ตัวอย่างนี้จะเขียนเลข เป็นแถว จำนวน 10 แถวแถวละ 5 ตัว โดยปกติเราจะสร้างมันด้วยการซ้อนลูป  แต่การซ้อนลูปจะไม่สามารถเรียกใช้จากจุดอื่นๆได้ครับ ในตัวอย่างมีการเรียกใช้ฟังก์ชั่นสร้างคอลัมน์ จากฟังก์ชั่นrow และในตอนท้าย ใช้ฟังก์ชั่นเมนเรียกใช้งานโดยตรง โดยในตอนท้ายเราจะเปลี่ยนค่าให้ฟังก์ชั่นเป็น 10 ครับ

Global $c_number =1   ;สร้างตัวแปรโกบอล ที่ทุกฟังก์ชั่นสามารถใช้งานและเขียนตัวแปรนี้ได้



Func make_row() ;ฟังก์ชั่นสำหรับสร้างแถว ไม่มีการรับค่าเข้าในฟังก์ชั่น
  $i = 1                 ;ประกาศตัวแปรในฟังก์ชั่น(เมื่อออกจากฟังก์ชั่นตัวแปรนี้จะหายไป
  For $i = 1 to 10
 make_column(5)    ;ฟังก์ชั่นเรียกใช้ฟังก์ชั่นกันเอง
 ConsoleWrite(@CRLF)
  Next

EndFunc

Func make_column($column_count) ;ฟังก์ชั่นสำหรับสร้างคอลัมน์ ตามจำนวนที่ระบุ  โดยรับค่าเข้ามาในฟังก์ชั่น
for $i = 1 to $column_count
  ConsoleWrite('    ' & $c_number)
  $c_number += 1
Next
Return $c_number   ;คืนค่าตัวแปรกลับไป  หากไม่คืนค่า ตัวแปรหลักจะไม่เปลี่ยนแปลงค่าตามในฟังก์ชั่น
EndFunc


;main function
make_row()
ConsoleWrite(@CRLF &'Test Call Column Function' &@CRLF &@CRLF)
make_column(10)   ;เรียกใช้ซับฟังก์ชั่นโดยตรง
ConsoleWrite(@CRLF)

offxo2591
สมาชิกทั่วไป
สมาชิกทั่วไป


จำนวนข้อความ : 11
ความนิยม : 0
เข้าร่วมเมื่อ : 23/07/2014

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by offxo2591 on 01/12/15, 05:59 pm

ironsulfide พิมพ์ว่า:Code เดิมของท่าน เป็นการสร้างลูปครอบลูปอีกที ถือว่าถูกแล้วครับในกรณีการเรียกลูปมาใช้งาน
ส่วนการเรียกฟังก์ชั่นนั้น  ผมจะลงตัวอย่างการใช้ฟังก์ชั่นเบื้องต้นนะครับ
ตัวอย่างนี้จะเขียนเลข เป็นแถว จำนวน 10 แถวแถวละ 5 ตัว โดยปกติเราจะสร้างมันด้วยการซ้อนลูป  แต่การซ้อนลูปจะไม่สามารถเรียกใช้จากจุดอื่นๆได้ครับ ในตัวอย่างมีการเรียกใช้ฟังก์ชั่นสร้างคอลัมน์ จากฟังก์ชั่นrow และในตอนท้าย ใช้ฟังก์ชั่นเมนเรียกใช้งานโดยตรง  โดยในตอนท้ายเราจะเปลี่ยนค่าให้ฟังก์ชั่นเป็น 10 ครับ

Global $c_number =1   ;สร้างตัวแปรโกบอล ที่ทุกฟังก์ชั่นสามารถใช้งานและเขียนตัวแปรนี้ได้



Func make_row() ;ฟังก์ชั่นสำหรับสร้างแถว ไม่มีการรับค่าเข้าในฟังก์ชั่น
  $i = 1                 ;ประกาศตัวแปรในฟังก์ชั่น(เมื่อออกจากฟังก์ชั่นตัวแปรนี้จะหายไป
  For $i = 1 to 10
 make_column(5)    ;ฟังก์ชั่นเรียกใช้ฟังก์ชั่นกันเอง
 ConsoleWrite(@CRLF)
  Next

EndFunc

Func make_column($column_count) ;ฟังก์ชั่นสำหรับสร้างคอลัมน์ ตามจำนวนที่ระบุ  โดยรับค่าเข้ามาในฟังก์ชั่น
for $i = 1 to $column_count
  ConsoleWrite('    ' & $c_number)
  $c_number += 1
Next
Return $c_number   ;คืนค่าตัวแปรกลับไป  หากไม่คืนค่า ตัวแปรหลักจะไม่เปลี่ยนแปลงค่าตามในฟังก์ชั่น
EndFunc


;main function
make_row()
ConsoleWrite(@CRLF &'Test Call Column Function' &@CRLF &@CRLF)
make_column(10)   ;เรียกใช้ซับฟังก์ชั่นโดยตรง
ConsoleWrite(@CRLF)

ขอบคุณมากครับผมเข้าใจละ แต่ติดอยู่ตรงหนึ่งอะครับ ตรงReturn อะครับ คืนค่ากลับไป นี้มันหมายความว่าอย่างไรหรอครับ ผมลองทดสอบโดยเอาreturnออกและreturnอยู่ปกติผลลัพท์ก็ออกมาเหมือนเดิมอะครับ กำลังงงอยู่

ironsulfide
มือใหม่เพิ่งสมัคร
มือใหม่เพิ่งสมัคร


จำนวนข้อความ : 9
ความนิยม : 3
เข้าร่วมเมื่อ : 09/05/2013

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by ironsulfide on 07/12/15, 08:54 pm

คำสั่ง Return คือการออกจากฟังก์ชั่นย่อย โดยจะมีสองรูปแบบคือ ออกโดยไม่ส่งค่ากลับ
รูปแบบคือ Return

กับแบบส่งค่ากลับ รูปแบบคือ Return วรรค ตามด้วยค่าที่จะส่งกลับ เช่น Return 1 เป็นต้น

การใช้งานฟังก์ชั่นจะมีสองรูปแบบคือใช้งานกระบวนการภายในฟังก์ชั่นเพียวๆ หรือ ใช้งานค่าที่ส่งกลับมาด้วย ยกตัวอย่างฟังก์ชั่นที่เราใช้กันบ่อยๆคือ $_coordinade = Pixelsearch(x,y,x2,y2,0x00FFFF) จะเห็นว่าไม่ได้ใช้แค่กระบวนการ แต่มีการรับค่ามาที่ตัวแปร _coordinade ด้วย ซึ่งก็ได้มาจากการ Return ค่ามานั่นเอง

การรีเทรินค่า จะใช้ได้หลายกรณี พื้นๆมักใช้คืนค่าว่าฟังก์ชั่นทำงานสำเร็จให้คืนค่า 1 ไม่สำเร็จให้คืนค่า 0 หรือจะใช้ส่งค่าอย่างอื่นอย่างฟังก์ชั่น Pixelsearch ก็ไม่ได้ส่งค่าสำเร็จหรือล้มเหลวกลับมาที่หัวฟังก์ชั่น แต่ส่งค่าพิกัดที่ค้นหาสีที่ต้องการเจอกลับมาใส่ตัวแปร _coordinade นั่นเองครับ

ironsulfide
มือใหม่เพิ่งสมัคร
มือใหม่เพิ่งสมัคร


จำนวนข้อความ : 9
ความนิยม : 3
เข้าร่วมเมื่อ : 09/05/2013

Re: มีวิธีทำให้ปิดลูปถาวรไหมครับ (รายละเอียดด้านใน)

ตั้งหัวข้อ by ironsulfide on 07/12/15, 09:03 pm

ส่วนบรรทัดที่สงสัย พอดีก่อนหน้านี้ผมเขียนในอีกทิศทางนึงแล้วลืมลบออกครับ 5555555..

    เวลาขณะนี้ 07/12/16, 12:55 am