2010-09-30 25 views
10

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

गैमेस्टूडियो लाइट-सी नामक एक स्क्रिप्टिंग भाषा का उपयोग करता है। यह सी के समान वाक्यविन्यास है और वेबसाइट पर वे कहते हैं, कि इसे किसी भी सी संकलक के साथ संकलित किया जा सकता है। यह शुद्ध सी है, कोई सी ++ या कुछ और नहीं है।

मैं मैं सामान्य रूप से नेट भाषाओं और कुछ पटकथा भाषाओं में कार्यक्रम,

उत्तर

0

एक बार सी में एक सरणी बना दिया गया है, यह सेट किया गया है सी के लिए नया हूँ। आपको एक लिंक्ड सूची या एक ऐरेलिस्ट

0

realloc पर एक नज़र डालें, जो आपको किसी दिए गए पॉइंटर (जो सी में, एरे पॉइंटर्स हैं) द्वारा इंगित स्मृति को आकार देने की अनुमति देगा।

+1

मुझे लगता है कि इस के लिए काम करने के लिए सरणी मॉलोक द्वारा आवंटित एक सरणी होनी चाहिए, न कि स्टैक पर। और यह भी चेतावनी दी जाती है कि यदि यह जगह में आवंटित करने में विफल रहता है तो यह पुराने ब्लॉक को मुक्त कर देगा और एक नया ब्लॉक आवंटित करेगा। यह किसी भी पॉइंटर्स को मूल ब्लॉक में अमान्य करता है। –

+0

आह, हाँ। यदि आप रीयलोक का उपयोग करने जा रहे हैं तो उन दोनों को ध्यान में रखा जाना चाहिए। – dj2

+0

Arrays पॉइंटर्स नहीं हैं। एक समारोह में पारित होने पर Arrays पॉइंटर्स को क्षय। एक सरणी और एक सूचक दो बहुत ही अलग चीजें हैं। – Robbie

3

Arrays स्थिर हैं ताकि आप इसका आकार बदल सकें। आपको लिंक की गई सूची डेटा संरचना बनाने की आवश्यकता होगी। सूची मांग पर बढ़ सकती है और घट सकती है।

0

जैसा कि निकटफ्राइड ने सुझाव दिया था, लिंक्ड लिस्ट जाने का एक तरीका है। एक और बात यह है कि आपके पास अब तक की अधिकतम संख्या रखने वाली तालिका रखने के लिए पर्याप्त तालिका है और इसे प्रबंधित करें (कौन सा मान्य है या नहीं, वर्तमान में सूची में कितने दुश्मन हैं)।

जहां तक ​​आकार बदल रहा है, आपको एक टेबल के बजाय एक पॉइंटर का उपयोग करना होगा और आप पुन: आवंटित कर सकते हैं, कॉपी कर सकते हैं और इसी तरह ... निश्चित रूप से ऐसा कुछ नहीं जो आप किसी गेम में करना चाहते हैं।

यदि प्रदर्शन एक मुद्दा है (और मैं अनुमान लगा रहा हूं), तालिका ठीक से आवंटित की गई है जो संभवतः मैं उपयोग करूंगा।

+0

यह अभी भी एक सूची का एक सरणी कार्यान्वयन है। हालांकि आप सही हैं, इसके लिए अधिकतम सरणी आकार के ज्ञान की आवश्यकता है। –

19

आप नहीं कर सकते। यह आमतौर पर गतिशील स्मृति आवंटन के साथ किया जाता है।

// Like "ENEMY enemies[100]", but from the heap 
ENEMY* enemies = malloc(100 * sizeof(ENEMY)); 
if (!enemies) { error handling } 

// You can index pointers just like arrays. 
enemies[0] = CreateEnemy(); 

// Make the array bigger 
ENEMY* more_enemies = realloc(enemies, 200 * sizeof(ENEMY)); 
if (!more_enemies) { error handling } 
enemies = more_enemies; 

// Clean up when you're done. 
free(enemies); 
+2

'x = realloc (x, ...) 'एक स्मृति रिसाव होने का इंतजार कर रहा है। (हालांकि, मुझे एहसास है कि गतिशील आवंटन विफलताओं को संभालने का तरीका यह जवाब नहीं था।) – bk1e

+1

सच है, और मुझे यह जांचना चाहिए था कि 'मॉलोक' रिटर्न 'न्यूल' भी है या नहीं। – dan04

+1

उचित त्रुटि जांच करने के लिए संपादित (लंबित पीयर समीक्षा) उत्तर दें, क्योंकि इसे डुप्मार्किंग के लिए लक्ष्य के रूप में और पहले से ही ~ 24k दृश्यों के रूप में उपयोग किया जा रहा है। –

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