Wednesday, June 4, 2014

Dynamic number of arguments in functions


Cũng tất cả chúng ta biết làm thế nào để tạo ra một hàm nhưng những gì về một hàm sử dụng số năng động của các thông số.
Tôi khuyên bạn nên không đọc nếu bạn không có kiến ​​thức cơ bản kịch bản.

PHP Code:
public function_add(num1num2result)
{
    
result num1 num2 }  
Nhưng làm thế nào chúng ta có thể tạo ra một hàm sử dụng một thông số động?
Vâng câu trả lời là đơn giản, bạn chỉ cần sử dụng các hàm này:

Ví dụ cho hàm mà chúng ta đã tạo ở trên chúng ta có thể làm một cái gì đó như thế này:

PHP Code:
public function_add( ... )
{
    
// Để đọc các tham số đầu tiên bạn phải luôn luôn sử dụng getarg (0)      // Nó bắt đầu với 0
    
setarg(2getarg(0)+getarg(1))
}  
Như bạn thấy hàm này không chứa bất kỳ đối số ở tất cả các chỉ dấu chấm.
Điều đó có nghĩa rằng số lượng các thông số có thể thay đổi.

Đây có phải là chỉ giới hạn ở giá trị số nguyên?
Không bạn cũng có thể sao chép các vector, chuỗi, và các giá trị Float.
Đây là một ví dụ cơ bản

Float Ví dụ:
PHP Code:
public function_mean( ... )
{
    
// Bạn cần phải truyền qua hai tham số đầu tiên là giá trị float hoặc tính toán khác
    // Sẽ được sai lầm
    // Tham số thứ 3 là một số nguyên (giá trị bình thường)
    
setarg(2floatround((Float:getarg(1)+Float:getarg(0)) / 2.0))
}  
String Ví Dụ:
PHP Code:
// Chúng tôi nghĩ rằng chuỗi là tham số đầu tiênpublic function_copystring( ... )
{
    
// position là chỉ số cho phép chúng ta sao chép mỗi ô của chuỗi hoặc mảng
    // len là chiều dài tối ta của chuỗi.
    // string đại diện cho mảng nơi mà chúng ta lưu tin nhắn văn bản
    // ch là kí tự, nơi mà chúng ta sẽ giữ giá trị ( tránh nhiều các cuộc gọi)
    
new positionchstring[100], len
    len 
charsmax(string)
    
  

    
while ( (position len) && (ch getarg(0position)) )
    {
        
// Lưu trữ giá trị ch
        
string[position] = ch
        
// Tăng vị trí cho các ô tiếp theo để tải
        
position++;
    }
    
    
// Chúng ta cần phải làm điều này vì để kết thúc một chuỗi
    
string[position] = '^0';
    
position++;
    
    
// Bây giờ chúng ta có chuỗi sao chép. Và in nó ra Server.
    
server_print(string)
}  
Nó dễ như thế nào?
Vâng ví dụ tôi sử dụng nó để tạo ra một cách để gửi tin nhắn văn bản dễ dàng hơn.

Đây là những gì hàm của tôi có:
PHP Code:
/* This function uses a different system of getting arguments see funcwiki for details
*  Params:
*  - id, player id
*  - print_type (ex: print_chat, print_center, etc.) 
*  - string to send to player (ex: #Alias_Not_Avail)
*  - the rest, more strings, see cstrike_english.txt to see how much strings you need in this message (you need to count the "%s" parts coresponding a tag)

*  Return:
*  - None.
*/
sendTxtMsg(any: ...)
{
    new 
numstring numargs() - 2
    
new string[100]
    new 
poschtotalchars charsmax(string)
    
    
message_begin(MSG_ONEget_user_msgid("TextMsg"), _getarg(0))
    
write_byte(getarg(1))
    
    for (new 
i=0numstringi++)
    {
        
// Here we copy the sting that we want to send to a player
        
pos 0;
        while (
pos totalchars && (ch getarg(ipos))) 
        {
            
string[pos++] = ch
        
}
        
        
// Add ending to the string (necessary)
        
string[pos++] = '^0';
        
        
//server_print("STRING %s", string)
        // Send it!
        
write_string(string)
    }
    
    
// End the function chain
    
message_end()
}  
Và bây giờ tôi có thể dễ dàng truyền tải mỗi tin nhắn khách hàng dễ dàng. 
Ví dụ thay vì viết:
PHP Code:
    message_begin(MSG_ONEget_user_msgid("TextMsg"), _id);
    
write_byte(print_center);
    
write_string("#Alias_Not_Avail");
    
write_string("Item");
    
message_end();  
Tôi sử dụng nó như thế này:
PHP Code:
sendTxtMsg(idprint_center"#Alias_Not_Avail""Item")  
Và vẻ đẹp của nó là nó hỗ trợ số năng động của các thông số. Điều đó có nghĩa là tôi không cần phải thích ứng với mã của tôi đối với từng loại tin nhắn văn bản. Tôi chỉ cần thêm một chuỗi hơn các thông số hàm. Vì vậy, dễ đọc hơn và dễ dàng hơn. 
Ví dụ:
PHP Code:
// For "Cstrike_TitlesTXT_Game_radio"        
// "%s1 (RADIO): %s2" 
sendTxtMsg(idprint_center"#Cstrike_TitlesTXT_Game_radio""Youpii""Having fun mate!")  
Và tôi không cần phải tạo ra hàm khác đặc biệt cho việc này.

0 nhận xét:

Post a Comment