VarSetCapacity()

º¯¼öÀÇ °¡¿ë ´É·ÂÀ» Å°¿ì°Å³ª ±×ÀÇ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÕ´Ï´Ù. º¸Åë, ÀÌ ¸í·É¾î´Â DllCall°ú °°ÀÌ ºñ Á¤»óÀûÀÎ »óȲ¿¡¼­¸¸ ÇÊ¿äÇÕ´Ï´Ù.

GrantedCapacity := VarSetCapacity(UnquotedVarName [, RequestedCapacity, FillByte])

¸Å°³º¯¼ö

GrantedCapacity

Var°¡ ÇöÀç º¸À¯ÇÒ ¼ö ÀÖ´Â ¹ÙÀÌÆ® °³¼ö, RequestedCapacityº¸´Ù ´õ Å®´Ï´Ù. VarNameÀÌ À¯È¿ÇÑ º¯¼ö À̸§ÀÌ ¾Æ´Ï¸é (¹®ÀÚ ±×´ë·ÎÀÇ ¹®ÀÚ¿­ ¶Ç´Â ¼ýÀÚÀ̸é), 0ÀÌ ¹ÝȯµË´Ï´Ù. (¾ÆÁÖ Èñ±ÍÇÏÁö¸¸) ½Ã½ºÅÛ¿¡ ÃæºÐÇÑ ¸Þ¸ð¸®°¡ ¾ø¾î¼­ º¯°æÀÌ ºÒ°¡´ÉÇϸé, ¿¡·¯ ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ª°í ÇöÀç °¡¿ë ´É·ÂÀÌ ¹ÝȯµË´Ï´Ù - ÀÌ ÇàÀ§´Â ¹Ì·¡ ¹öÀü¿¡¼­´Â ¹Ù²ð ¼ö ÀÖ½À´Ï´Ù.

UnquotedVarName

º¯¼öÀÇ À̸§ (°ãµû¿ÈÇ¥·Î µÑ·¯ ½ÎÁö ¾ÊÀ½). ¿¹¸¦ µé¾î: VarSetCapacity(MyVar, 1000). Array%i%À̳ª ÇÔ¼öÀÇ ByRef ¸Å°³º¯¼ö¿Í °°ÀÌ µ¿Àû º¯¼öµµ µÉ ¼ö ÀÖ½À´Ï´Ù.

RequestedCapacity

»ý·«Çϸé, º¯¼öÀÇ ÇöÀç °¡¿ë´É·ÂÀÌ ¹ÝȯµË´Ï´Ù. ±×¸®°í ±×ÀÇ ³»¿ëÀº º¯°æµÇÁö ¾Ê½À´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ÇöÀç º¯¼ö¿¡ ÀÖ´Â ¸ðµç °ÍÀÌ »ç¶óÁý´Ï´Ù (º¯¼ö°¡ ºñ¿öÁý´Ï´Ù).

RequestedCapacity¿¡ º¯¼ö°¡ Á¶Á¤ ÈÄ¿¡ º¸À¯ÇؾßÇÒ ¹ÙÀÌÆ® °³¼ö¸¦ ÁöÁ¤ÇϽʽÿÀ. À¯´ÏÄÚµå ¹®ÀÚ¿­¿¡ ´ëÇÏ¿©, ÀÌ°ÍÀº ±× ±æÀÌÀÇ µÎ ¹è°¡ µÇ¾î¾ß ÇÕ´Ï´Ù. RequestedCapacity´Â ³»ºÎÀÇ Á¾·á ¹®ÀÚ¸¦ Æ÷ÇÔÇÏÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î 1·Î ¼³Á¤ÇÏ¸é ±× º¯¼ö´Â 1 ¹ÙÀÌÆ®¿¡´Ù ±×ÀÇ Á¾·á ¹®ÀÚ¸¦ ´õ º¸À¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÁÖÀÇ: ³ªÁß¿¡ ½ºÅ©¸³Æ®°¡ ÀÌ º¯¼ö¿¡ ´õ Å« °ªÀ» ÇÒ´çÇϸé ÀÚµ¿À¸·Î È®ÀåµË´Ï´Ù.

ÀÌ ÇÔ¼ö´Â Á¾Á¾ ±×³É º¯¼ö°¡ ÃÖ¼ÒÇÑÀÇ °¡¿ë´É·ÂÀ» °®Ãß¾ú´ÂÁö È®ÀÎÇϱâ À§ÇÏ¿© È£ÃâµÇ±â ¶§¹®¿¡, ¼öÇ༺´ÉÀÇ ÀÌÀ¯·Î, RequestedCapacity°¡ 0ÀÏ ¶§¸¸ ±× º¯¼ö¸¦ Ãà¼ÒÇÕ´Ï´Ù. ´Ù¸¥ ¸»·Î, º¯¼öÀÇ °¡¿ë ´É·ÂÀÌ ÀÌ¹Ì RequestedCapacityº¸´Ù Å©¸é, Ãà¼ÒµÇÁö ¾Ê½À´Ï´Ù (±×·¯³ª ±× º¯¼ö´Â ÀÏ°ü¼ºÀ» À§ÇØ ¿©ÀüÈ÷ ºñ¿öÁý´Ï´Ù).

±×·¯¹Ç·Î, ¸í½ÃÀûÀ¸·Î º¯¼ö¸¦ Ãà¼ÒÇÏ·Á¸é, ¸ÕÀú ±×ÀÇ ¸Þ¸ð¸®¸¦ VarSetCapacity(Var, 0)À¸·Î ÇØÁ¦ÇÑ ´ÙÀ½ VarSetCapacity(Var, NewCapacity)À» »ç¿ëÇϽʽÿÀ -- ¶Ç´Â ±×³É ÇÊ¿äÇϸé 0À¸·ÎºÎÅÍ ÀÚµ¿ È®ÀåµÇµµ·Ï ±×´ë·Î µÎ½Ê½Ã¿À

¼öÇ༺´ÉÀÇ ÀÌÀ¯·Î, ÀÌÀüÀÇ °¡¿ë´É·ÂÀÌ 64 ¹®ÀÚº¸´Ù ÀÛÀº (À¯´ÏÄÚµå ºôµå¿¡¼­´Â 128 ¹ÙÀÌÆ®º¸´Ù ÀÛÀº) º¯¼ö´Â ÇØÁ¦Çصµ ¾Æ¹« È¿°ú°¡ ¾øÀ» ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×ÀÇ ¸Þ¸ð¸®°¡ ¿µ±¸ À¯ÇüÀ̱⠶§¹®ÀÔ´Ï´Ù. ÀÌ °æ¿ì, 0ÀÌ ¾Æ´Ï¶ó ÇöÀç °¡¿ë´É·ÂÀÌ ¹ÝȯµË´Ï´Ù.

¼öÇ༺´ÉÀÇ ÀÌÀ¯·Î, °¡¿ë ´É·ÂÀÌ 4096 ¹ÙÀÌÆ®º¸´Ù ÀÛÀº º¯¼öÀÇ ¸Þ¸ð¸®´Â ºó ¹®ÀÚ¿­À» ÀúÀåÇصµ ÇØÁ¦µÇÁö ¾Ê½À´Ï´Ù (¿¹, Var := ""). ±×·¸Áö¸¸, VarSetCapacity(Var, 0)´Â º¯¼ö¸¦ ÇØÁ¦ÇÕ´Ï´Ù.

v1.0.44.03+¿¡¼­, -1À» RequestedCapacity¿¡ ÁöÁ¤ÇÏ¸é º¯¼öÀÇ ³»ºÎ¿¡ ÀúÀåµÈ ¹®ÀÚ¿­ ±æÀ̸¦ ÇöÀç ³»¿ëÀÇ ±æÀÌ·Î °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. º¯¼ö°¡ °£Á¢ÀûÀ¸·Î º¯°æµÇ´Â °æ¿ì¿¡ À¯¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¾î DllCall()¸¦ ÅëÇÏ¿© ±×ÀÇ ÁÖ¼Ò¸¦ °Ç³×´Â °æ¿ì À¯¿ëÇÕ´Ï´Ù. ÀÌ ¸ðµå¿¡¼­, VarSetCapacity()´Â °¡¿ë´É·ÂÀÌ ¾Æ´Ï¶ó ±× ±æÀ̸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î µ¹·ÁÁÝ´Ï´Ù.

FillByte

ÀÌ ¸Å°³º¯¼ö´Â º¸Åë »ý·«µË´Ï´Ù. »ý·«µÇ¸é ¸ñÇ¥ º¯¼öÀÇ ¸Þ¸ð¸®°¡ ÃʱâÈ­µÇÁö ¾Ê½À´Ï´Ù (´ë½Å¿¡, ±× º¯¼ö´Â ´Ü¼øÈ÷ À§¿¡ ±â¼úÇÑ ¹Ù¿Í °°ÀÌ ºñ¿öÁý´Ï´Ù). ±×·¸Áö ¾ÊÀ¸¸é, 0¿¡¼­ 255 »çÀÌÀÇ ¼ýÀÚ¸¦ ÁöÁ¤ÇϽʽÿÀ. ¸ñÇ¥ º¯¼öÀÇ ¸Þ¸ð¸® ±¸¿ªÀÌ (±×ÀÇ ÇöÀç °¡¿ë ´É·Â, RequestedCapacityº¸´Ù ´õ Ŭ¼ö ÀÖ½À´Ï´Ù ¸Å ¹ÙÀÌÆ®¸¶´Ù ±× ¼ýÀڷΠä¿öÁý´Ï´Ù). 0ÀÌ Áö±Ý±îÁö °¡Àå ÈçÈ÷ »ç¿ëµÇ´Â °ªÀÔ´Ï´Ù. ÀÌ °ªÀº DllCall ±¸Á¶¿Í °°ÀÌ º¯¼ö¿¡ ³¯ ÀÌÁø µ¥ÀÌÅ͸¦ ´ã¾Æ¾ß ÇÒ °æ¿ì¿¡ À¯¿ëÇÕ´Ï´Ù.

³íÆò

DllCall¿¡ ±â¼úµÈ »ç¿ë¹ý ¿Ü¿¡µµ, ÀÌ ÇÔ¼ö´Â Á¡ÁøÀûÀÎ °áÇÕÀ¸·Î ¹®ÀÚ¿­À» ±¸¼ºÇÒ ¶§ ¼öÇ༺´ÉÀ» Çâ»ó½ÃÅ°´Â µ¥¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ±× ¹®ÀÚ¿­ÀÇ ÃÖÁ¾ ±æÀÌ°¡ ¾ó¸¶ÀÎÁö ¾Ë°í ÀÖ´Ù¸é ¿©·¯ ÀÚµ¿ Å©±â º¯°æ ºÎ´ãÀ» ÇÇÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ±×·± °æ¿ì RequestedCapacity´Â Á¤È®ÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù °¡¿ë ´É·ÂÀÌ ÀÛÀ¸¸é, ¼öÇ༺´ÉÀÌ ´õ¿í °³¼±µË´Ï´Ù. ±×¸®°í °¡¿ë ´É·ÂÀÌ ¼ÒÁøµÉ ¶§ ÀÚµ¿À¸·Î º¯¼ö°¡ È®ÀåÀ» ½ÃÀÛÇÒ °ÍÀÔ´Ï´Ù. °¡¿ë ´É·ÂÀÌ Å©¸é, ¸Þ¸ð¸®°¡ ³¶ºñµË´Ï´Ù. ±×·¯³ª Àá½ÃÀÏ »ÓÀÔ´Ï´Ù. ¿Ö³ÄÇÏ¸é ¿¬»ê ÈÄ¿¡ VarSetCapacity(Var, 0) ¶Ç´Â Var := ""¸¦ ¼ö´ÜÀ¸·Î ¸ðµç ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù

#MaxMem´Â º¯¼ö°¡ ½º½º·Î ÇàÇÏ´Â ÀÚµ¿ È®À常 Á¦ÇÑÇÕ´Ï´Ù. VarSetCapacity¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù.

°ü·Ã Ç׸ñ

DllCall, #MaxMem, NumPut, NumGet

¿¹Á¦

; MyVar°¡ ÀÛ¾÷¿¡ ÃæºÐÇÑ ¿©À¯ °ø°£À» È®º¸ÇÏ°í ÀÖ´ÂÁö È®ÀÎÇÏ¿© ÃÖÀûÈ­ÇÕ´Ï´Ù.
VarSetCapacity(MyVar, 10240000)  ; ~10 MB
Loop
{
    ...
    MyVar = %MyVar%%StringToConcatenate%
    ...
}
; ¹®ÀÚ¿­¿¡ ´ëÇÏ¿© ÇÊ¿äÇÑ ¹öÆÛ °ø°£À» °è»êÇÕ´Ï´Ù.
bytes_per_char := A_IsUnicode ? 2 : 1
max_chars := 500
max_bytes := max_chars * bytes_per_char

Loop 2
{
    ; DllCall¿¡ »ç¿ëÇÒ °ø°£À» ÇÒ´çÇÕ´Ï´Ù.
    VarSetCapacity(buf, max_bytes)

    if A_Index = 1
        ; DllCallÀ» ÅëÇÏ¿© º¯¼ö¸¦ °£Á¢ÀûÀ¸·Î º¯°æÇÕ´Ï´Ù.
        DllCall("wsprintf", "ptr", &buf, "str", "0x%08x", "uint", 4919)
    else
        ; ±æÀ̸¦ ÀÚµ¿À¸·Î °»½ÅÇÏ·Á¸é "str"¸¦ »ç¿ëÇÕ´Ï´Ù:
        DllCall("wsprintf", "str", buf, "str", "0x%08x", "uint", 4919)

    ; ¿Ö ±æÀ̸¦ °»½ÅÇÑ ÇÊ¿ä°¡ ÀÖ´ÂÁö º¸¿©ÁÖ±â À§ÇØ ¹®ÀÚ¿­À» °áÇÕÇÕ´Ï´Ù:
    wrong_str := buf . "<end>"
    wrong_len := StrLen(buf)

    ; º¯¼öÀÇ ±æÀ̸¦ °»½ÅÇÕ´Ï´Ù.
    VarSetCapacity(buf, -1)

    right_str := buf . "<end>"
    right_len := StrLen(buf)

    MsgBox,
    (
    ¾÷µ¥ÀÌÆ® Àü
      ¹®ÀÚ¿­: %wrong_str%
      ±æÀÌ: %wrong_len%

    ¾÷µ¥ÀÌÆ® ÈÄ
      ¹®ÀÚ¿­: %right_str%
      ±æÀÌ: %right_len%
    )
}