2012-06-30 25 views
14

Tôi có một hàm variadic có tham số float. Tại sao nó không hoạt động?Hàm Variadic (va_arg) không hoạt động với float?

va_arg(arg, float) 
+0

Bạn có thể gửi đầy đủ các chức năng? – Jack

+9

Bạn may mắn vì bạn đã có thể nhận được câu trả lời có thể đúng, với ít bối cảnh bạn cung cấp. Lưu ý rằng câu trả lời là "sách giáo khoa" ... nghĩa là, nó có sẵn cho bất kỳ ai đọc tài liệu thích hợp (ví dụ: man stdarg). –

+0

Bạn đúng thông tin nằm trong tài liệu hướng dẫn sử dụng. Tôi đã không nhận thấy nó trước đây. –

Trả lời

37

Các thông số của các chức năng tương ứng với ...thúc đẩy trước khi đi qua với chức năng variadic của bạn. charshort được thăng int, float được thăng double vv

6.5.2.2.7 Các ký hiệu lược trong một prototype hàm declarator gây đối số kiểu chuyển đổi để dừng lại sau khi tham số tuyên bố cuối cùng. Đối số mặc định quảng cáo được thực hiện trên các đối số theo sau.

Lý do cho điều này là các phiên bản đầu của C không có các nguyên mẫu chức năng; các kiểu tham số được khai báo tại trang hàm nhưng không được biết tại trang gọi. Nhưng các kiểu khác nhau được biểu diễn khác nhau và biểu diễn đối số đã truyền phải khớp với kỳ vọng của hàm được gọi. Vì vậy, các giá trị char và giá trị ngắn có thể được chuyển tới các hàm có tham số int hoặc các giá trị float có thể được chuyển tới các hàm có tham số kép, trình biên dịch "quảng bá" các loại nhỏ hơn là loại lớn hơn. Hành vi này vẫn được nhìn thấy khi loại tham số không được biết tại trang cuộc gọi - cụ thể là đối với các hàm hoặc hàm được khai báo không có mẫu thử nghiệm (ví dụ: int foo();).

+0

Tôi có một câu hỏi liên quan đến điều đó, bởi vì tôi chỉ có cùng một vấn đề. Tôi nghe nói rằng 'printf' cũng quảng bá' float' thành 'double', nhưng' printf' thường "làm việc" ok cho tôi. Sự khác biệt giữa hai trường hợp này là gì? – Kusavil

+1

@Kusavil Nếu bạn có câu hỏi tiếp theo, bạn nên đăng câu hỏi mới (bạn có thể tham khảo câu hỏi này trong bài đăng của mình). Mô tả vấn đề của bạn và hiển thị mã có vấn đề. Điều này sẽ mang lại cho bạn nhiều câu trả lời hơn chỉ một câu trả lời, và nó sẽ có tiềm năng cao hơn để giúp ích cho người khác hơn là nhận xét về một câu hỏi cũ. – dasblinkenlight

+0

@ dasblinkenlight okay, tôi đã đăng câu hỏi của riêng mình :) Không chắc chắn nếu đó là câu hỏi hay trong khi cách nhận thức và hiểu biết của tôi ở đây thiếu nhiều cách, nhưng nếu ai đó quan tâm, đây là câu hỏi của tôi: http: // stackoverflow. com/questions/23836118/variadic-function-va-arg-doesnt-work-với-float-while-printf-does-what-the – Kusavil

9

Như @dasblinkenlight đã đề cập, float được tăng gấp đôi. Nó hoạt động tốt đối với tôi:

#include <stdio.h>   
#include <stdarg.h> 

void foo(int n, ...) 
{ 
    va_list vl; 
    va_start(vl, n); 

    int c; 
    double val; 

    for(c = 0; c < n; c++) { 
     val = va_arg(vl, double); 
     printf("%f\n", val); 
    } 

    va_end(vl); 
} 


int main(void) 
{ 
    foo(2, 3.3f, 4.4f); 
    return 0; 
} 

Output:

3.300000 
4.400000 
+4

Lưu ý rằng '3.3' và' 4.4' là các hằng số của kiểu 'double' - để hiển thị rằng' float' được quảng bá, bạn nên sử dụng '3.3f' và' 4.4f'. – caf

+0

@caf Chỉ vừa mới đánh tôi với nó. :) –

+1

Cảm ơn. Đã chỉnh sửa :) – Jack

Các vấn đề liên quan