2015-03-06 10 views
5

कभी कभी सी कार्य करने के लिए शून्य पैरामीटर पारित करने के लिए, एक शून्य सूचक एक सी एपीआई के लिए आवश्यकता हो सकती है।सीजीओ, कैसे

सीजीओ में संभव है?

उदाहरण के लिए, मैं एक जाओ भाषा कार्यक्रम में strcmp() करने के लिए एक शून्य तर्क के पास करना चाहते हैं:

package strutil 

/* 
#include <stdlib.h> 
#include <string.h> 
*/ 
import (
    "C" 
    "unsafe" 
) 

func StrCmp(a, b string) int { 
    pca := C.CString(a) 
    defer C.free(pca) 
    pcb := C.CString(b) 
    defer C.free(pcb) 
    ret := C.strcmp(pca, pcb) 
    return int(ret) 
} 

अगर मैं nil को pca निर्धारित करते हैं, यह त्रुटि आती:

Exception 0xc0000005 0x0 0x0 0x76828b21 
PC=0x76828b21 
signal arrived during cgo execution 

strutil._Cfunc_strcmp(0x0, 0x761b00, 0x0) 
    strutil/_obj/_cgo_gotypes.go:79 +0x49 
strutil.StrCmp(0x19, 0x10, 0x4bbf38, 0xa, 0x1fbc1f98, 0x0, 0x0, 0xffff, 0x0,  0x0, ...) 

तो, क्या मैं नल को strcmp पास कर सकता हूं?

धन्यवाद

+0

मैं जाओ में सी एपीआई उपयोग नहीं किया है, लेकिन अपने कार्य को स्वीकार करने की अनुमति के लिए एक ' Null', तुम कर सकते हो 'strcmp (ए, बी * स्ट्रिंग) पूर्णांक {...}' समारोह सी मानक के –

उत्तर

7

आप एक सी समारोह आप बस इसे में nil गुजारें सकता करने के लिए शून्य पास करना चाहते हैं।

हालांकि यह दस्तावेज नहीं है क्या होता है जब आप समारोह strcmp(...) करने के लिए एक शून्य सूचक भेजें। मुझे लगता है कि जब आप इसे पास कर रहे हैं तो strcmp विफल रहता है। हाथ से पहले अपना इनपुट जांचना बेहतर होगा और आपके इनपुट में से कोई एक शून्य पर सेट होने पर त्रुटि लौटाएगा।

package main 

/* 
#include <stdlib.h> 
#include <string.h> 
*/ 
import "C" 

import (
    "errors" 
    "fmt" 
    "unsafe" 
) 

func StrCmp(a, b *string) (int, error) { 
    if nil == a || nil == b { 
     return 0, errors.New("Both strings have to be set") 
    } 
    pca := C.CString(*a) 
    defer C.free(unsafe.Pointer(pca)) 
    pcb := C.CString(*b) 
    defer C.free(unsafe.Pointer(pcb)) 

    ret := C.strcmp(pca, pcb) 
    return int(ret), nil 
} 

func main() { 
    left := "Left" 
    right := "Right" 
    fmt.Println(StrCmp(&left, &right)) 
    fmt.Println(StrCmp(&left, &left)) 
    fmt.Println(StrCmp(nil, &right)) 
    fmt.Println(StrCmp(&left, nil)) 
} 

यदि आवश्यक हो एक उदाहरण है कि कैसे एक समारोह शून्य संकेत स्वीकार करता है कि करने के लिए शून्य पारित करने के लिए:

package main 

/* 
#include <stdio.h> 
int am_i_null(int* pointer) { 
    if (NULL == pointer) { 
    return -1; 
    } 
    return *pointer; 
} 
*/ 
import "C" 

import (
    "fmt" 
    "unsafe" 
) 

func main() { 
    fmt.Println(C.am_i_null(nil)) 

    var cInteger C.int = 8 
    fmt.Println(C.am_i_null(&cInteger)) 

    var goInteger int = 7 
    fmt.Println(C.am_i_null((*C.int)(unsafe.Pointer(&goInteger)))) 
} 
+2

7.1.4.1 यह बताता है कि 'अपरिभाषित व्यवहार में strcmp' परिणाम के लिए शून्य से गुजर रहा है (क्योंकि' strcmp' 'isn टी न्यूल पॉइंटर्स को स्वीकार करने के लिए दस्तावेज)। –

+0

धन्यवाद, @ सैंडर, मैं आपके exmaples कोशिश करेंगे – tanbro