2013-02-15 9 views
5

मुझे एक समस्या है जब मैं किसी सरणी के पॉइंटर को पास करने का प्रयास करता हूं (जिसमें मेरे प्रोग्राम में कुछ फ़ंक्शंस द्वारा आवश्यक पैरामीटर शामिल होते हैं), जिसे तब उन कार्यों में पारित किया जाना चाहिए। जीएसएल उदाहरण के लिए मुझे इस तरह से पैरामीटर पास करना चाहता है।मैं संरचना/कक्षा में स्थिर 2 डी सरणी के सूचक को कैसे पास कर सकता हूं?

एक छोटी सी उदाहरण कार्यक्रम इस प्रकार है:

#include <iostream> 

using namespace std; 

struct myparams 
{ 
    double * a; 
    double ** b; 
}; 

int main() 
{ 
    double c[10] = {0,1,2,3,4,5,6,7,8,9}; 
    double d[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; 

    double** e = new double*[4]; 
    for (int i = 0; i < 4; i++) { 
     e[i] = new double[3]; 
    } 

    myparams params; 

    // THIS WORKS: 
    params.a = c; 
    for (int i = 0; i < 10; i++) { 
     cout << params.a[i] << endl; 
    } 

    // THIS DOESN'T WORK 
    params.b = d; 

    // THIS WORKS: 
    params.b = e; 

    delete[] e; 
} 

क्या संकलक "cannot convert 'double[4][3]' to 'double**' in assignment" या ऐसा ही कुछ के साथ शिकायत

params.b = d 

के साथ समस्या यह (से जर्मन अनुवाद) है।

+1

'डबल [एन] [एम]' डबल ** 'में क्षय नहीं हो सकता है, जबकि 'डबल [एन]' 'डबल *' में क्षय हो सकता है। यही कारण है कि पहला असाइनमेंट मान्य है, और बाद वाला नहीं है। – Zeta

+0

यह भी देखें http://stackoverflow.com/a/13273979/560648 और http://stackoverflow.com/a/9557855/560648 और http://stackoverflow.com/a/7139014/560648 –

+0

इसके अलावा, कभी भी " यह फिर से काम नहीं करता है! –

उत्तर

7

double d[4][3]; सरणी की एक सरणी है। double b**; पॉइंटर के लिए एक सूचक है। ये प्रकार समान नहीं हैं (सामान्य "सरणी केवल पॉइंटर्स हैं" आपने इंटरनेट पर पढ़ा होगा गलत)।

d के तत्व double[3] प्रकार के हैं। Arrays, जब चारों ओर पारित, उनके पहले तत्व के लिए पॉइंटर्स को क्षय (सी ++ मानक के खंड 4.2 देखें)। ddouble(*)[3] (3 युगल की सरणी के लिए सूचक) तक क्षय हो जाएगा।

लंबी कहानी लघु, double(*)[3]double** में परिवर्तनीय नहीं है और यह संकलक आपको बता रहा है।

यदि आपको d रखना है, तो आपको double (*b)[3] के रूप में घोषित करने की आवश्यकता है;

अधिक गहराई से स्पष्टीकरण के लिए, this SO question देखें।

+0

धन्यवाद! यह लगभग समाधान था। यह 'डबल (* बी) [4]' नहीं है, लेकिन 'डबल (* बी) [3]'। – GriffinPeterson

+0

मुझे पसंद है कि आपने सही उत्तर पर गलत जवाब कैसे स्वीकार किया है। यह समझ आता है। –

+0

@LightnessRacesinOrbit यदि आप इंगित करते हैं कि क्या गलत है, तो मैं इसे ठीक कर दूंगा। धन्यवाद। – jrok

6

ऐसा इसलिए है क्योंकि एक पॉइंटर (या पॉइंटर्स के रूप में इसका उपयोग किया जा सकता है) के लिए पॉइंटर एरे की सरणी के समान नहीं है। स्मृति में लेआउट असंगत है।

उदाहरण के लिए, मान लीजिए कि हम इन दोनों घोषणाओं है:

char aa[2][2] = { { 'a', 'b' }, { 'c', 'd' } }; 
char **pp; 

pp = new char*[2]; 
pp[0] = new char[2]; 
pp[1] = new char[2]; 

सरणी aa स्मृति में इस तरह दिखता है:

+----------+----------+----------+----------+ 
| aa[0][0] | aa[0][1] | aa[1][0] | aa[1][1] | 
+----------+----------+----------+----------+ 

"सरणी" pp इस बीच इस तरह दिखता है:

+------+------+ 
| a[0] | a[1] | 
+------+------+ 
    |  | 
    |  v 
    |  +---------+---------+ 
    |  | a[0][0] | a[0][1] | 
    |  +---------+---------+ 
    V 
    +---------+---------+ 
    | a[0][0] | a[0][1] | 
    +---------+---------+ 

"सरणी" pp बिंदु शामिल है ers से दूसरे "सरणी"

+0

+1: बिलकुल सही। –

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद! लेकिन पॉइंटर को सरणी 'डी' में स्टोर करने के लिए मुझे अपनी संरचना' myparams' में किस सदस्य की आवश्यकता है? – GriffinPeterson

+0

ठीक है मुझे लगता है कि यह [मेरे आरेख] से बेहतर है (http://stackoverflow.com/a/7139014/560648)। Dammit। –

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