2010-11-24 4 views
10

मैं सी में एक चर आकार के सरणी बनाने की कोशिश कर रहा हूँ।एक बड़े परिवर्तनीय लंबाई सरणी में निश्चित मान -1 क्यों है यदि सी में असाइन किया गया हो?

सरणी 1 के मान के रूप में वापस आती रहती है।

मैं क्या करना चाहता हूं आकार size आकार की सरणी बनाना और उसके बाद मूल्यों में वृद्धि जोड़ें। मैं क्या गलत कर रहा हूं?

int size = 4546548; 

UInt32 ar[size]; 
//soundStructArray[audioFile].audioData = (UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); 
//ar=(UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); 
for (int b = 0; b < size; b++) 
{ 
    UInt32 l = soundStructArray[audioFile].audioDataLeft[b]; 
    UInt32 r = soundStructArray[audioFile].audioDataRight[b]; 
    UInt32 t = l+r; 
    ar[b] = t; 
} 
+0

http://stackoverflow.com/questions/448844/variable-sized-arrays-in-c – alvin

+0

कोड का डुप्लिकेट ठीक दिखता है, लेकिन आकार बड़ा है। क्या आप सुनिश्चित हैं कि आपके प्रोग्राम का उपयोग करने के लिए 18 एमबी स्टैक है? –

+0

@ स्टेव। मैं इस बारे में भ्रमित हो रहा था कि मैं अपनी सरणी को कितनी चीजें पकड़ना चाहता हूं और इसका वास्तविक आकार कितना चाहता हूं। – dubbeat

उत्तर

9

आपको क्या करना होगा एक गतिशील सरणी है। एक जिसे आप प्रारंभिक आकार आवंटित कर सकते हैं, उसके बाद उचित होने पर कुछ कारकों के आकार को बढ़ाने के लिए realloc का उपयोग करें।

Ie, यह विकसित करने के लिए इस समारोह

UInt32* ar = malloc(sizeof(*ar) * totalFramesInFile); 
/* Do your stuff here that uses it. Be sure to check if you have enough space 
    to add to ar and if not, call grow_ar_to() defined below. */ 

उपयोग:

UInt32* grow_ar_to(UInt32* ar, size_t new_bytes) 
{ 
    UInt32* tmp = realloc(ar, new_bytes); 
    if(tmp != NULL) 
    { 
     ar = tmp; 
     return ar; 
    } 
    else 
    { 
     /* Do something with the error. */ 
    } 
} 
+0

बस एक नोट पर। अगर कुलframesinfile 50 है तो इसका मतलब है कि सरणी में 50 रिक्त स्थान हैं और प्रत्येक स्थान आकार UNIN32 है? – dubbeat

+0

यह सही है। – jer

4

आप शायद आवंटित (और बाद में नि: शुल्क) चाहिए सरणी गतिशील है, तो जैसे:

int *ar = malloc(sizeof(int) * size); 
for (int b = 0; b < size; b++) 
{ 
    ... 
} 

// do something with ar 

free(ar); 
-1

सी जब एक सरणी आकार को परिभाषित एक चर के उपयोग की अनुमति नहीं है, आप सब करने की ज़रूरत होगी क्या है malloc उपयोग करते हैं, यह आप यह अनुमान लगा देना चाहिए:

UInt32* ar; 
ar = (UInt32*) malloc(size * sizeof(UInt32)); 

मत भूलना यह खाली करने के लिए बाद में

+0

"सी सरणी आकार को परिभाषित करते समय एक चर का उपयोग करने की अनुमति नहीं देता है" जो मुझे नहीं पता था – dubbeat

+5

@ डबबीट: सी (वर्तमान संस्करण, सी 99) इसे अनुमति देता है। सी 8 9 नहीं है। कंपाइलर्स जो इसका समर्थन नहीं करते हैं उन्हें संकलन-समय ("निरंतर अभिव्यक्ति अपेक्षित", या समान) पर एक त्रुटि संदेश देना चाहिए, संकलित नहीं करें लेकिन आपको -1 का अप्रत्याशित मान दें। आप किस कंपाइलर का उपयोग कर रहे हैं? –

+0

आह, फिर मेरा बुरा। सच है क्योंकि उसे संकलन त्रुटि नहीं मिली थी – Argote

1

यदि आप आकार बनाते हैं तो काम करना चाहिए। साथ ही, यदि आपकी सरणी फ़ंक्शन और आकार के अंदर है, तो कहा गया कार्य का तर्क है, जो भी काम करना चाहिए।

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