2016-03-22 13 views
5

पर स्ट्रक्चर पॉइंटर सेट करें मैं कंप्यूटर के आरएस 485 इंटरफ़ेस पर किसी डिवाइस के साथ संवाद करने के लिए जेएनए का उपयोग शुरू कर रहा हूं। मुझे आश्चर्यजनक रूप से मैं बहुत अच्छे परिणाम के लिए आया था। लेकिन अब मैं एक साधारण समस्या से फंस गया हूँ। मैं जिस पुस्तकालय का उपयोग करता हूं वह संरचना के सूचक के लिए एक सूचक को स्वीकार करता है। वास्तविक हस्ताक्षरजेएनए: नल

func(Struct1 **, Struct2 **, Struct3 *, Struct4 *, long)

अब पहले पैरामीटर पुस्तकालय की उम्मीद पिछले सूचक एक शून्य सूचक होने के लिए के आकार का संकेत है। यह असफल रहता है। technomage के प्रश्न के अनुसार 1

s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well 

संपादित 2

Struct1.ByReference[] s = (Struct1.ByReference[]) new Struct1.ByReference().toArray(size); 
    int pos = 0; 

    // ... 
    // for loop to set the s[pos] struture values 
    for(pos = 0; pos < size - 1; pos++) 
    // ... 

    // Now set the last array element to a null pointer to indicate end-of-list 
    s[pos].getPointer().setPointer(0, null);// Following does not work: results in zero memoried structure 
    s[pos] = null; // Following does not work wither: NullPointerException at com.sun.jna.Structure.autoWrite 

संपादित करें: निम्न कोड है जो मैं अब तक की कोशिश की है। मैं सी कोड लिखने के लिए थे, तो यह शायद ऐसा ही कुछ दिखेगा:

Struct1 **s = malloc(n * sizeof(Struct1*)); 

for(int i=0; i<n; i++) 
{ 
    if(i == n -1) 
    { 
     s[i] = NULL; 
    } 
    else 
    { 
     s[i] = malloc(sizeof(Struct1)); 
     s[i].bla = value; 
     .... 
    } 
} 

लेकिन चेतावनी दी: मैं C/C बहुत कुशल नहीं हूँ ++। मैं जावा को अपना डोमेन मानता हूं।

क्या किसी को भी ऐसी ही समस्या है? शायद मैं पेड़ के लिए लकड़ी नहीं देख रहा हूं ...

अग्रिम धन्यवाद।

+0

कृपया मूल उपयोग का नमूना शामिल करें। पॉइंटर विविधताओं के लिए फ़ंक्शन घोषणाएं उस संदर्भ के बिना संदिग्ध हो सकती हैं - एक सूचक के बीच एक सूचक के बीच अंतर करने का कोई तरीका नहीं है, एक पॉइंटर मूल्य के लिए सूचक, या कई अन्य विविधताएं हैं। – technomage

+0

'उदाहरण उपयोग' के साथ आपका क्या मतलब है? लाइब्रेरी को फ्रीआरटीओएस चलाने वाले एम्बेडेड डिवाइस के कोड से अपनाया गया था जो एक ओपन सोर्स रीयल-टाइम ऑपरेटिंग सिस्टम है। लाइब्रेरी के तरीकों को निर्यात करने वाले हेडर फ़ाइल के अलावा मेरे पास कोई मूल कोड नहीं है। –

+0

यदि आप 'सी' में कोड लिखना चाहते थे जो लाइब्रेरी को आपकी इच्छानुसार एक्सेस करता है, तो _that_ कैसा दिखता है? – technomage

उत्तर

0

जेएनए में संरचनाएं पॉइंटर्स हैं, इसलिए आपको वास्तव में यहां जो चाहिए वह एक सूचक (एक सूचक के लिए सूचक) है, जो PointerByReference है - आपके मामले में, उनमें से एक सरणी।

ऊपर कोड उदाहरण को देखते हुए, आप, संरचनाओं के अपने सरणी बना देंगे एक कम n से:

Struct1[] struct1Array = new Struct1[n-1]; 

यह केवल सरणी के लिए जावा स्मृति आवंटित करता है।

इसके बाद आप का दृष्टांत और परिवर्तन आप देशी स्मृति करने के लिए कर लिखेंगे:

for (int i = 0; i < n-1; i++) { 
    struct1Array[i] = new Struct1(); 
    struct1Array[i].bla = value; 
    struct1Array[i].write(); 
} 

new Struct1() इन संरचनाओं के लिए देशी पक्ष स्मृति आवंटित करता है। ऐसा करने के लिए Structure.toArray() विधि का भी उपयोग करना संभव है; मैं जानबूझ कर यह कर रहा हूं कि क्या हो रहा है यह स्पष्ट करने के लिए यह थोड़ा और अधिक मैनुअल और निम्न-स्तर कर रहा है।

फिर आप इन संरचनाओं के पॉइंटर्स को पकड़ने के लिए संबंधित PointerByReference सरणी बनाएंगे। आप शून्य के लिए एक अतिरिक्त तत्व जोड़ देंगे:

PointerByReference[] pbrArray = new PointerByReference[n]; 

फिर, यह केवल जावा-साइड आवंटन है।

for (int i = 0; i < n-1; i++) { 
    pbrArray[i] = new PointerByReference(struct1Array[i].getPointer()); 
} 
pbrArray[n - 1] = new PointerByReference(Pointer.NULL); 

यहाँ new PointerByReference() कौन से स्थानीय साइड संरचना आप आवंटित की ओर इशारा करता सूचक खुद के लिए देशी पक्ष स्मृति, आवंटित: और फिर आप संरचना की ओर इशारा करने के लिए संकेत दिए गए, Structure.getPointer() विधि से प्राप्त के साथ इसे भरने पहले।

मैं आपके प्रारंभिक प्रश्न को कैसे समझता हूं, आप अपने PointerByReference सरणी को अपने फ़ंक्शन में पास कर देंगे, जो संभावित रूप से आपके संरचनाओं को अपडेट करता है।

चूंकि आपने इस फैशन में दो एरे बनाए हैं, इसलिए आप सरणी अनुक्रमणिका द्वारा उनके पत्राचार का ट्रैक रख सकते हैं। आपको स्ट्रक्चर सरणी और read() के माध्यम से जावा-साइड स्ट्रक्चर में मूल स्मृति को इसके साथ आगे संसाधित करने के लिए पुन: प्रयास करना पड़ सकता है। आम तौर पर जब आप सीधे संरचनाओं के साथ काम करते हैं, तो वे स्वचालित रूप से संरचनाओं को संदर्भित करने के लिए PointerByReference का उपयोग करते समय संरचनाओं को संदर्भित करते हैं, लेकिन जेएनए अनुकूल नहीं है।

के रूप में इसी सूचकांक द्वारा दो सरणियों पर नज़र रखने के लिए एक विकल्प है, तो आप प्रारंभिक संरचना काम "भूल" कर सकता है और बाद में अपने सरणी पर PointerByReference.getValue() विधि का उपयोग कर संरचना को याद करने के लिए सूचक ठीक करने के लिए यह ठीक है, और फिर दृष्टांत उस पॉइंटर का उपयोग अपने कन्स्ट्रक्टर में करते हुए एक नई संरचना (उदाहरण के लिए new Struct1(pbr.getValue()) जो उस पॉइंटर के साथ super() पर कॉल करता है)।

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