2016-05-15 9 views
8

मैं सोच रहा हूं कि पॉइंटर्स की एक सरणी बनाने का कोई तरीका है जो पूर्णांक के बहुआयामी सरणी में प्रत्येक पंक्ति के पहले कॉलम को इंगित करता है। उदाहरण के लिए, कृपया नीचे दिए गए कोड को देखो:पॉइंटर्स की Arrays जो पूर्णांक के arrays को इंगित करती हैं

#include <stdio.h> 

int day_of_year(int year, int month, int day); 

main() 
{ 
    printf("Day of year = %d\n", day_of_year(2016, 2, 1)); 
    return 0; 
} 

static int daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

int day_of_year(int year, int month, int day) 
{ 
    int leap; 
    int *nlptr = &daytab[0][0]; 
    int *lpptr = &daytab[1][0]; 
    int *nlend = nlptr + month; 
    int *lpend = lpptr + month; 

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 
    if (leap) 
     for (; lpptr < lpend; lpptr++) 
      day += *lpptr; 
    else 
     for (; nlptr < nlend; nlptr++) 
      day += *nlptr; 
    return day; 
} 

जब मैं नीचे इस प्रकार लिख:

int *p[2]; 
*p[0] = daytab[0][0]; 
*p[1] = daytab[1][0]; 

मैं इस तरह एक त्रुटि प्राप्त:

Error: Array must have at least one element 
Error: Variable 'p' is initialized more than once 
Error: { expected 
Error: Variable 'p' is initialized more than once 
Error: { expected 
***5 errors in Compile*** 

मैं इसे की तरह बदल यह:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

मुझे अभी भी मिलता है एक ही त्रुटि

मैं जानता हूँ कि हम निम्न में के रूप में चरित्र तार की ओर इशारा की एक सरणी बना सकते हैं:

char *str[] = { 
    "One", "Two", "Three", 
    "Four", "Five", "Six", 
    "Seven", "Eight", "Nine" 
} 

हम कैसे हैं कि पूर्णांक सरणियों के लिए?

+0

"* यह काम नहीं करता है *" अधिक या कम महत्वपूर्ण त्रुटि रिपोर्ट एक दे सकते हैं। त्रुटि, चेतावनी, खराब होने पर आपको अधिक सटीक रहें, निरीक्षण करें! – alk

+2

पहला उदाहरण: अमान्य पॉइंटर को डिफ्रेंस करके सेगमेंटेशन फॉल्ट का कारण बनने का बड़ा मौका दूसरा उदाहरण: क्या आप समझाएंगे कि "काम नहीं करता" से आपका क्या मतलब है? – MikeCAT

+1

दिखाए गए कोड (दूसरे दृष्टिकोण का उपयोग करके) मुझे अच्छा लग रहा है। – alk

उत्तर

2

आपका कोड आकर्षण के रूप में काम करना चाहिए:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

printf("%d \n", p[0][2]); // shows: 28 
printf("%d \n", p[1][2]); // shows: 29 

यह भी काम करता है:

int *p[2] = { &daytab[0][0],&daytab[1][0] }; 
+0

पूर्व कोड, संकलित होने पर, मुझे ऊपर बताई गई त्रुटियों को जारी रखता है, हालांकि मुझे लगता है कि यह नहीं होना चाहिए। लेकिन उत्तरार्द्ध मेरे लिए काम करता है, और इसने कार्यक्रम को और अधिक कॉम्पैक्ट बनाया है, और अगर आवश्यकता के लिए उन्मूलन की आवश्यकता है। धन्यवाद। –

+0

बाद वाला कोड काम करता है जब मैं इसे सीपीपी के रूप में संकलित करता हूं। लेकिन जब मैं इसे c के रूप में संकलित करता हूं, तो मुझे 'int * pe [2] = {p [0] + month, p [1] + month} पंक्ति में' कार्य दिवस_of_year' में अवैध प्रारंभिक त्रुटि 'मिलती है; '। –

+1

जैसा कि पहले से ही एल्क द्वारा उल्लेख किया गया है, कृपया जितनी जल्दी हो सके अपने कंपाइलर को अपग्रेड करें! यह 90 के दशक में अप्रचलित था और यह निश्चित रूप से आपको सिरदर्द का अधिकतर लाभ देगा। – tomekpe

1

यदि यह daytab की परिभाषा बदल रहा है 3 उदाहरण आप इस का उपयोग करना चाहते हो सकता है की तरह जाने के लिए के बारे में बताया गया है:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

इसके बजाए।

या रहने बचाने के लिए और एक प्रहरी का उपयोग कर सरणी के अंत चिह्नित करने के लिए कार्य करें:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    NULL 
}; 

या^2 अंकन भी सेवर रहने के लिए भी भीतरी सरणी समाप्त होता है:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    NULL 
}; 

कृपया ध्यान दें कि यौगिकों ((Type){Initialiser}) यहां उपयोग किए गए हैं केवल सी 99 से उपलब्ध हैं।

1

उपयोग की तरह

नीचे

int *p[2]; p[0] = daytab[0]; p[1] = daytab[1];

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