2010-01-07 20 views
6

मेरे पास उन संरचनाओं की संरचना और बोली-आयामी सरणी है:सी: संरचना की सरणी के लिए पॉइंटर्स की गतिशील सरणी

typedef struct { 
char exit_n; 
char exit_s; 
char exit_w; 
char exit_e; 
} room; 

room map[MAP_WIDTH][MAP_HEIGHT]; 

मुझे उन structs के पॉइंटर्स की एक सरणी चाहिए। निम्नलिखित कोड संकलित करता है, लेकिन मुझे वांछित परिणाम नहीं मिलते हैं। कोई मदद? यह वास्तव में मुझे भ्रमित हो रहा है, किसी भी स्पष्टीकरण की सराहना की जाएगी

room *rooms; 
rooms = (room*)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = map[room_x][room_y]; 
[..] 

उत्तर

1

मैं कर रहा हूँ कर रहा हूँ यकीन है कि आप

sizeof(room) 

आप struct के लिए पर्याप्त जगह आवंटित करने के लिए की जरूरत है चाहता हूँ। आप केवल एक सूचक के लिए आवंटित कर रहे हैं।

तुम भी अलग ढंग से आवंटित करने के लिए यदि आप एक 2 डी सरणी चाहते आवश्यकता हो सकती है: यहाँ dynamic allocating array of arrays in C

+1

संयोग से, 32 बिट सिस्टम पर इस विशेष मामले के आकार (कमरे) == आकार (कमरा *) में: डी – mingos

+0

@mingos: अच्छी आंख! –

1

देखना प्रमुख मुद्दा मैं देख रहा हूँ यह है कि आप sizeof(room*) उपयोग कर रहे हैं। इसका मतलब यह है कि आप एक सूचक के आकार को एक संरचना में ले जा रहे हैं, जो आप नहीं चाहते हैं। आप संरचना के आकार को आवंटित करना चाहते हैं, इसलिए sizeof(room) बनाएं। इसके अलावा, इस मामले में calloc का उपयोग करें, malloc नहीं, क्योंकि आप मूल रूप से कमरे के आकार से कमरों की संख्या गुणा करके पूर्व की कार्यक्षमता को कार्यान्वित कर रहे हैं।

+0

यह _rooms_ की एक और सरणी बनाने की तरह नहीं है जहां मैं ___ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – pistacchio

+0

आह, मैं देखता हूं कि आपका क्या मतलब है। कुछ अन्य पदों ने इसे सही किया है। – avpx

1

आपके वर्तमान कोड में, roomsroom संरचनाओं की एक सरणी बन जाती है, न कि पॉइंटर्स की एक श्रृंखला। आप संकेत है कि आपके map सरणी के लिए प्रत्येक बिंदु, आप अविवेक की एक और परत की जरूरत है की एक सरणी चाहते हैं:

room** rooms = malloc(ROOM_NUM * sizeof *rooms); 
// ... 
rooms[n] = &map[room_x][room_y]; 

(या आप sizeof (room *) अपने कोड की तरह sizeof *rooms के बजाय है का उपयोग कर सकते है, मैं इसे इस तरह से लिखने के लिए पसंद करते हैं असल में नकल प्रकार की जानकारी से बचने के लिए।)

+0

उसे वास्तव में कमरे की आवश्यकता हो सकती है *** कमरे के पॉइंटर्स की एक 2 डी सरणी –

+1

ऐसा लगता है कि 'कमरे' को 2-आयामी होने की बजाय 'मानचित्र' तक पहुंचने का एक वैकल्पिक, 1-आयामी तरीका माना जाता है। – JaakkoK

+0

मुझे ऐसा नहीं लगता है। उसे ROOM_NUM कमरे मिल गए हैं। मुझे लगता है कि ROOM_NUM मानचित्र के आयामों के उत्पाद के बराबर है। कमरा *** वैसे भी एक 2 डी सरणी के लिए काम नहीं करेगा। –

9

, मुझे लगता है कि आप चाहते हैं

room** rooms; 
rooms = (room**)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = &map[room_x][room_y]; 

यह आपको अपने कमरे की ओर इशारा की एक सरणी देता है।

0

आपको पॉइंटर्स और कमरे के लिए स्थान आवंटित करने की आवश्यकता है और फिर पॉइंटर्स को कमरे को इंगित करने के लिए प्रारंभ करें।

room *rooms; 
room **prooms; 
rooms = (room*)malloc((sizeof(room) + sizeof(room*)) * ROOM_NUM); 
prooms = (room**)(&rooms[ROOM_NUM]); 
for (int ii = 0; ii < ROOM_NUM; ++ii) 
    prooms[ii] = &rooms[ii]; 
0

अगर मैं सही ढंग से समझ, आप map में सभी room मूल्यों के संकेत की एक सरणी चाहते हैं। चूंकि MAP_WIDTH*MAP_HEIGHT ऐसे मूल्य हैं, हम की जरूरत है कि कई संकेत:

room *rooms[MAP_WIDTH*MAP_HEIGHT]; 

ऊपर संकेत की एक सरणी के रूप में rooms की घोषणा की।

अब, मान निर्दिष्ट:

size_t i; 
size_t j; 

for (i=0; i < MAP_WIDTH; ++i) 
    for (j=0; j < MAP_HEIGHT; ++j) 
     rooms[i*MAP_HEIGHT+j] = &map[i][j]; 

हम मूल रूप से map में प्रत्येक तत्व के पते मिल जाए, और rooms में सही प्रविष्टि में संग्रहीत।

क्या यह आप चाहते थे?

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