2012-10-18 8 views
5

अब मैं एक इनपुट फ़ाइल पढ़ने के लिए साइथन का उपयोग कर रहा हूं, स्ट्रिंग को int में परिवर्तित कर सकता हूं और उन्हें अंतरिक्ष बचाने के लिए एक सी सरणी (सूची के बजाय) में संग्रहीत कर सकता हूं। कोड जो मैंने देखा है:इनपुट फ़ाइल पढ़ने के दौरान एक सी सरणी को अद्यतन करना

cdef long p[10000000] 
cdef long i 
i = 0 
f = open(filename, 'r') 
for line in f: 
    temp = map(int, line.split()) 
    p[i] = temp[0] 
    i = i + 1 
f.close() 

हालांकि, जब मैं सरणी पी को संदर्भित करता हूं तो प्रोग्राम हमेशा निरस्त हो जाता है। किसी भी तरह सरणी "परिभाषित" नहीं है क्योंकि स्मृति उपयोग बहुत कम है। यह काम करता है, फिर भी, अगर मैं

cdef i 
for i in range(0, 1000): 
    p[i] = i 
+1

जब कार्यक्रम रोकता मैं का मूल्य क्या है के साथ आपकी समस्या को पुन: पेश नहीं कर सका? – user1245262

+11

यदि आप अंतरिक्ष –

+1

के बारे में चिंतित हैं, तो आप 'array.array()' का उपयोग कर सकते हैं, वैसे, आप पहले से 'i' घोषित करने और हाथ से वृद्धि "करने के बजाय गणना का उपयोग कर सकते हैं। वैसे भी, क्या यह संभव है कि समस्या यह है कि आप सरणी के लिए एक गैर-सीडीएफ आवंटित करते हैं? क्या होगा यदि आप ऐसा करते हैं: 'temp = map (int, lines.rstrip()। विभाजन()) [0]; पी [i] = temp' और आप temp भी cdef? – Bakuriu

उत्तर

1

मेरे अनुमान कर रहा हूँ:

  • कोड आप पोस्ट वास्तव में एक समारोह में लपेटा जाता है, जिसमें मामले p ढेर पर आवंटित और जैसे ही है दिए गए फ़ंक्शन रिटर्न, p तक पहुंच अवैध है।
  • आप ओवरफ्लो के लिए i चेक नहीं करते हैं, तो i > 1000000 पर क्या होता है?
  • स्टैक पर 1M 8-बाइट पूर्णांकों आवंटित क्या अनुमत सीमा से आगे हो सकता है, की जांच करने की कोशिश कर ulimit -a

कुल मिलाकर वहाँ ओपी में पर्याप्त जानकारी, जैसे नहीं है:

  • कि कोड शीर्ष है मॉड्यूल या एक समारोह की सामग्री में स्तर?
  • प्रोग्राम कैसे छोड़ा गया है (एसईजीवी?)
  • p का संदर्भ किस संदर्भ में है?
  • आप किस ओएस/आर्क का उपयोग करते हैं?

मैं अजगर 2.7.3 Cython 0.17.2 जीसीसी 4.7.2 लिनक्स 3.6.9 x86-64

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