2016-02-22 10 views
6

के संदर्भ में सी में ** और ** के बीच अंतर I गतिशील रूप से आवंटित 2 डी सरणी के साथ मैट्रिक्स गुणा करने के लिए होमवर्क असाइनमेंट पर काम कर रहा हूं। इस प्रकार2 डी मैट्रिक्स

int **a; 

और फिर प्रारंभ और इसे लोड:

void loadMatrix(FILE* fp, int** matrix, int rowSize, int colSize) { 

    for (int i = 0; i < rowSize; i++) { 
     for (int j = 0; j < colSize; j++) { 
      fscanf(fp, "%d", &matrix[i][j]); 
     } 
    } 
} 

इस प्रकार मैं एक वैश्विक चर के रूप में मेरी मैट्रिक्स की घोषणा: मैं मैट्रिक्स लोड करने के लिए निम्नलिखित समारोह में लिखा है

// allocate memory for the array rows 
a = (int **) malloc(m * sizeof(int*)); 

// allocate memory for array columns 
for (int i = 0; i < m; i++) { 
    a[i] = malloc(k * sizeof(int)); 
} 

loadMatrix(fp, a, m, k); 

सब कुछ अपेक्षित काम करता है, हालांकि शिक्षक द्वारा दिए गए फ़ंक्शन हस्ताक्षर निम्नलिखित हैं:

void loadMatrix(FILE*, int ***, int, int); 

मुझे लगता है कि हस्ताक्षर उपयोग करने की कोशिश, और मैट्रिक्स & का उपयोग कर, और मेरे loadMatrix समारोह से & को हटाने, यह सोचकर कि outputs एक ही होना चाहिए के पते में पारित, लेकिन का उपयोग कर *** अपेक्षा के अनुरूप काम नहीं करता है। मैं क्या खो रहा हूँ? यदि कोई है तो ट्रिपल पॉइंटर्स का उपयोग करने का क्या फायदा होगा?

+3

'loadMatrix (fp, और a, m, k); 'और फ़ंक्शन के अंदर malloc'd करें। – BLUEPIXY

+3

बस 'और मैट्रिक्स [i] [j] 'से' & (* मैट्रिक्स) [i] [j] 'fprintf' में और' loadMatrix (fp, और a, m, k) 'पर फ़ंक्शन कॉल बदलें। – haccks

+0

@ haccks वाह जो ठीक काम किया। तो वह क्यों है? मुझे लगता है कि & & * एक अर्थ में एक-दूसरे को रद्द करना चाहिए। मैं गलतफहमी क्या कर रहा हूं? –

उत्तर

1

आपका कोड में निम्न समस्याएं हैं:

  • आप 2 डी सरणियों का आवंटन नहीं कर रहे हैं, बल्कि सूचक-टू-सूचक आधारित लुक-अप टेबल ढेर भर में खंडित किया। यह व्यापक है लेकिन खराब अभ्यास: आपके 2 डी सरणी को विभाजित करने और इसे कई स्थानों पर आवंटित करने का कोई कारण नहीं है। कोड जटिल हो जाता है और कार्यक्रम बिना किसी लाभ के धीमा हो जाता है।

  • मैट्रिक्स को वैश्विक चर के रूप में घोषित करने का कोई कारण नहीं है।

  • सी में संकेत के 3 स्तर होने का कोई कारण नहीं है। इसे "तीन सितारा प्रोग्रामिंग" के रूप में जाना जाता है और यह मूलभूत रूप से त्रुटिपूर्ण प्रोग्राम डिज़ाइन का एक निश्चित संकेत है। दुर्भाग्यवश, इसका मतलब है कि आपका शिक्षक सी ज्ञान का भरोसेमंद स्रोत नहीं है।

इसके बजाय, आप 2 डी सरणियों का आवंटन किया जाना चाहिए:

#include <stdio.h> 
#include <stdlib.h> 

void loadMatrix(FILE* fp, int rowSize, int colSize, int matrix[rowSize][colSize]) 
{ 
    for (int i = 0; i < rowSize; i++) { 
     for (int j = 0; j < colSize; j++) { 
      fscanf(fp, "%d", &matrix[i][j]); 
     } 
    } 
} 


int main (void) 
{ 
    const int ROWS = 4; 
    const int COLS = 5; 
    int (*matrix)[ROWS][COLS]; // array pointer to variable-length array 

    matrix = malloc(sizeof(int[ROWS][COLS])); 
    if(matrix == NULL) 
    { 
    // error handling 
    } 

    FILE* fp = ...; 
    loadMatrix(fp, ROWS, COLS, *matrix); // contents of what the pointer points at is the array 

    free(matrix); 
} 

पूरी तरह से ऊपर समझने के लिए, मैं चर लंबाई सरणियों का अध्ययन करने की सलाह देते हैं और कैसे सरणियों पहला तत्व की ओर इशारा में क्षय।

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