Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Làm sao để tạo hàm với số lượng đối số bất kỳ ???

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Mặc định Làm sao để tạo hàm với số lượng đối số bất kỳ ???

    Xin hỏi các bạn cách tạo hàm có số lượng đối số truyền vào bất kỳ .Xin cảm ơn !
    What you see is never what you get...

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Xét đơn giản với số lượng đối số cùng kiểu, bất kì.

    Code:
    void void_main(T *list)
    {
       int n = list->nItems;
       // Xuất thông tin từng phần từ:
       T *myData = list.toArray();
       for(int i=0;i<n;i++)
           cout<<myData[i];
    }
    Xét kiểu dữ liệu bất kì :

    Code:
    void void_main(void **pData)
    {
    
    }
    Với hàm bất kì trên giờ tớ muốn đưa vào 5 biến kiểu , int,float, double,class, struct tớ sẽ làm như sau:
    Code:
    void main()
    {
          n=5;
           void **p = new *void[n] ;
           int(*p+1)= new int;
           float(*p+2) = new float;
           double(*p+3)= new double;
          myClass(*p+4)= new myClass();
         vol_main(p)
    }
    Chưa test nhưng ý tưởng là thế.

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Bằng cách nào có thể viết một hàm nhận số đối số bất kỳ?

    Ta dùng <stdarg.h>. Ví dụ:
    Code:
    #include <stdlib.h>	/* for malloc, NULL, size_t */
    #include <stdarg.h>		/* for va_ stuff */
    #include <string.h>		/* for strcat et al */
    
    char *vstrcat(char *first, ...) // số lượng đối số không giới hạn
    {
    	size_t len = 0;
    	char *retbuf;
    	va_list argp; // dùng kiểu  va_list
    	char *p;
    
    	if(first == NULL)
    		return NULL;
    
    	len = strlen(first);
    
    	va_start(argp, first); // khởi tạo va_list với các tham số tiếp sau first
    
    	while((p = va_arg(argp, char *)) != NULL) // lấy tham số kế tiếp có kiểu char*, 
    /* ở đây nếu để tham số thực là kiểu khác char*, sẽ dẫn đến lỗi. Ta phải khai báo đúng kiểu của tham số thực */
    		len += strlen(p);
    
    	va_end(argp); // kết thúc va_list
    
    	retbuf = malloc(len + 1);	/* +1 for trailing \0 */
    	
    	if(retbuf == NULL)
    		return NULL;		/* error */
    
    	(void)strcpy(retbuf, first);
    
    	va_start(argp, first); // khởi tạo lại va_list để dùng 1 lần nữa
    
    	while((p = va_arg(argp, char *)) != NULL)
    		(void)strcat(retbuf, p);
    
    	va_end(argp); // kết thúc va_list
    
    	return retbuf;
    }
    
    void main()
    {
    	char *str = vstrcat("Hello, ", "world!", (char *) NULL);
    	char *str2 = vstrcat("Hello, ", “cruel”, "world!", (char *) NULL);
    }

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    kidkid hiểu sai ý tớ rồi , ý tớ là muốn tạo hàm truyền vào số lượng đối số bất kỳ ,không giới hạn số lượng đối số ngay trong lời gọi hàm chứ không phải truyền vào con trỏ .

    Thanks anh nguyentuan2.

    Vui lòng không gửi liên tục nhiều bài viết liên tục liền nhau trong cùng một đề tài. (Nhắc nhở bởi Dreaminess)
    What you see is never what you get...

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Chú ý là để dùng va_start, va_end, hàm phải có calling convention là cdecl.
    Không nên lạm dụng cách này, đây là cách dở, nguy hiểm, khó debug, khó bảo trì, nguy hiểm về security....
    Lúc trước mới học lập trình, tui cũng rất khoái và tìm cách viết, dùng hàm có đối số thay đổi. Giờ thì thôi, không dám.
    Vd với đoạn code trên của nguyentuan2, tui có thể viết 1 hàm # tường minh, rõ ràng hơn:
    LPTSTR MultiStrCat(const LPCTSTR *ppStr, int Count);
    Hàm của nguyentuan2 có 1 nguy hiểm là nếu coder quên không truyền NULL cho tham số cuối cùng, ct sẽ crash tại vòng while và strlen đầu tiên.
    Bà con debug = OllyDbg chắc chắn sẽ biết bug OutputDebugString. OllyDbg mắc lỗi này do dùng hàm viết theo dạng trên: va_start, va_end.
    Đã được chỉnh sửa lần cuối bởi TQN : 08-12-2007 lúc 10:09 PM.

  6. #6
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Mặc định Làm sao để tạo hàm với số lượng đối số bất kỳ ???

    dở là do người lập trình đã áp dụng trong những trường hợp không cần thiết, chứ không phải cấu trúc hay phát biểu đó dở

    Trình biên dịch đã hỗ trợ những phát biểu trên thì rõ ràng là chúng sẽ được dùng trong những trường hợp nhất định, ví như làm vsprint chẳng hạn

    ta đã hiểu rõ sự nguy hiểm nó, nhưng đương nhiên là có cách viết hay cách áp dụng để tránh được sự nguy hiểm trên, người lập trình hoàn toàn có thể kiểm soát được nó để tránh cho việc crash chương trình

    Ở trên chỉ là 1 ví dụ, thực ra là mình copy từ chỗ khác cho cậu void_main biết cách, chứ cũng chẳng quan tâm nó lỗi hay dở đến nỗi nào

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Ke cả 2 anh đều nói rất hay. Ko bàn luận vụ này nữa nhé.
    Cái bài NT hôm trước em đọc ở đâu rồi thì phải nhưng chưa thực hành lúc nào ?

    Cái vụ đối số bất kì này để làm gì nhri ? Có ai cho 1 ví dụ ko ?

  8. #8
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Cái vụ này trong C# chỉ cần xài từ khóa params là xong

    Cái vụ đối số bất kì này để làm gì nhri ? Có ai cho 1 ví dụ ko ?
    Nhiều ứng dụng lắm chứ. Ví dụ:
    - Hàm print
    - Format chuỗi
    - Tra cứu records với đầu vào là một số thông tin ko biết trước độ dài.
    Keep moving forward!

    ... Retired ...

  9. #9
    Ngày gia nhập
    10 2007
    Bài viết
    50

    à vụ truyền tham số với số lượng bất kì rất quan trọng, bạn thử nghỉ xem nếu, một người nào đó yêu cầu bạn tìm phần tử là: số dương, chia hết cho 3,4, tổng các chữ số của nó <10... thì bạn nghĩ xem làm sao.sau khi bạn thực hiện ý tưởng của bạn xong, mình bảo bạn lại tìm phần tử theo kiểu khác, chẳn lẻ phải viết lại....
    Bạn có thể làm như sau: đóng gói các bộ lọc(các bộ lọc >0,%3==0,%4==0,...)
    rồi truyền vào hàm không xác định số lượng tham số, rồi cho mảng đi qua từng bộ lọc, như thể bạn hỗ trỡ nhiều bộ lọc thì bạn có thể hỗ trợ hầu hêt việc tìm kiếm theo bất kì yêu cầu nào
    hy vọng bạn hiểu được tầm quan trọng của nó!!

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn