2012-06-30 15 views
14

मेरे पास एक वैरिएडिक फ़ंक्शन है जो एक फ्लोट पैरामीटर लेता है। यह क्यों काम नहीं करता है? कार्यों कीवैराडिक फ़ंक्शन (va_arg) फ्लोट के साथ काम नहीं करता है?

va_arg(arg, float) 
+0

आप पूर्ण समारोह पोस्ट कर सकते हैं? – Jack

+9

आप भाग्यशाली हैं कि आप एक ऐसा उत्तर प्राप्त करने में सक्षम थे जो शायद सही है, यह देखते हुए कि आपने कितना छोटा संदर्भ दिया है। ध्यान दें कि उत्तर "पाठ्यपुस्तक" है ... यानी, यह किसी भी व्यक्ति के लिए उपलब्ध है जो उचित दस्तावेज़ीकरण (उदाहरण के लिए, मैन स्टडर्ग) पढ़ता है। –

+0

आप सही हैं जानकारी stdarg दस्तावेज में है। मैंने इसे पहले नहीं देखा था। –

उत्तर

37

पैरामीटर कि ... के अनुरूप अपने variadic कार्य करने के लिए पारित करने से पहले पदोन्नत कर रहे हैं। char और shortint करने के लिए प्रोत्साहित कर रहे हैं, float, double करने के लिए प्रोत्साहित किया जाता है आदि

6.5.2.2.7 एक समारोह प्रोटोटाइप declarator का कारण बनता है तर्क जैसे रूपांतरण पिछले घोषित पैरामीटर के बाद बंद करने के लिए अंडाकार अंकन। डिफ़ॉल्ट तर्क प्रचार पीछे तर्कों पर किया जाता है।

इसका कारण यह है कि सी के प्रारंभिक संस्करणों में फ़ंक्शन प्रोटोटाइप नहीं थे; फ़ंक्शन साइट पर पैरामीटर प्रकार घोषित किए गए थे लेकिन कॉल साइट पर ज्ञात नहीं थे। लेकिन विभिन्न प्रकारों का अलग-अलग प्रतिनिधित्व किया जाता है, और पारित तर्क के प्रतिनिधित्व को बुलाए गए फ़ंक्शन की अपेक्षा से मेल खाना चाहिए। ताकि int पैरामीटर के साथ कार्यों के लिए चार और लघु मानों को पारित किया जा सके, या फ्लोट वैल्यू को डबल पैरामीटर के साथ कार्यों में पारित किया जा सकता है, संकलक छोटे प्रकार के छोटे प्रकार के "प्रचारित" होते हैं। यह व्यवहार तब भी देखा जाता है जब कॉलम पर पैरामीटर का प्रकार ज्ञात नहीं होता है - अर्थात्, प्रोटोटाइप के बिना घोषित विविधता कार्यों या कार्यों के लिए (उदा।, int foo();)।

+0

मेरे पास इसके बारे में एक सवाल है, क्योंकि मुझे बस एक ही समस्या थी। मैंने सुना है कि 'printf' 'float' को' डबल 'तक भी बढ़ावा देता है, लेकिन' printf' आमतौर पर मेरे लिए" काम कर रहा है "ठीक है। इन दो मामलों के बीच क्या अंतर है? – Kusavil

+1

@ कुसाविल यदि आपके पास फॉलो-अप प्रश्न है, तो आप एक नया प्रश्न पोस्ट करने से बेहतर होंगे (आप इस पोस्ट को अपने पोस्ट में संदर्भित कर सकते हैं)। अपनी समस्या का वर्णन करें, और समस्याग्रस्त कोड दिखाएं। यह आपको केवल एक से अधिक उत्तर लाएगा, और पुराने प्रश्न पर टिप्पणी के मुकाबले दूसरों के लिए सहायक होने की उच्च संभावना होगी। – dasblinkenlight

+0

@ dasblinkenlight ठीक है, मैंने अपना खुद का प्रश्न पोस्ट किया है :) सुनिश्चित नहीं है कि यह अच्छा सवाल है, जबकि यहां चीजों को समझने और समझने का मेरा तरीका कई तरीकों से कम है, लेकिन अगर कोई दिलचस्पी लेता है, तो मेरा प्रश्न यहां है: http: // stackoverflow। com/प्रश्न/23836118/variadic-function-va-arg-doesnt-work-with-float-while-printf-do-what- – Kusavil

9

@dasblinkenlight के रूप में उल्लेख किया गया है, फ्लोट को पर दोहराया जाता है। यह मेरे लिए ठीक काम करता है:

#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; 
} 

आउटपुट:

3.300000 
4.400000 
+4

ध्यान दें कि '3.3' और' 4.4' प्रकार 'डबल' के स्थिरांक हैं - यह दिखाने के लिए कि 'फ्लोट' को बढ़ावा दिया जाता है, आपको' 3.3f' और '4.4f' का उपयोग करना चाहिए। – caf

+0

@ कैफ बस मुझे मुश्किल से हराया। :) –

+1

धन्यवाद। संपादित :) – Jack

संबंधित मुद्दे