2012-07-07 12 views
12

मैं किसी मौजूदा कोड का उपयोग कर रहा हूं जिसे किसी और ने लिखा है, और मैं इसे संकलित नहीं कर सकता (यहां सीमित सी अनुभव है लेकिन मैं सीखने की कोशिश कर रहा हूं!)।सी ++ वैरिएबल-साइज सरणी को रोकता है

utilities.cc

#include "utilities.h" 
FILE *open_file(char *filename, const char*extension, const char *access) 
{ 
    char string[MAX_STR_LEN]; 
    FILE *strm = NULL; 

    if(filename[0]=='\0') 
    { 
     printf("\n INPUT FILENAME (%s) > ",access); 
     fgets(string,MAX_STR_LEN,stdin); 
     sscanf(string,"%s",filename); 
     printf(" FILE %s opened \n", filename); 
    } 
    int len=strlen(filename); 

    if(len + strlen(extension) >= MAX_STR_LEN) 
    { 
     printf("\n ERROR: String Length of %s.%s Exceeds Maximum", 
       filename, extension); 
     return(NULL); 
    } 

    // char *filename1 = new(char[len+strlen(extension)+1]); 

    const int filenameLength = len+strlen(extension)+1; 
    char *filename1 = new(char[filenameLength]); 

    strcpy(filename1,filename); // temp filename for appending extension 

    /* check if file name has .extension */ 
    /* if it does not, add .extension to it */ 
    int i=len-1; 
    while(i > 0 && filename[i--] != '.'); 
    // printf("\n Comparing %s to %s", extension, filename+i+1); 
    if(strcmp(extension, filename+i+1) ) 
     strcat(filename1,extension); 
    if((strm = fopen(filename1, access)) == NULL) 
    { 
     printf("\n ERROR OPENING FILE %s (mode %s)", filename1,access); 
    } 
    delete(filename1); 
    return(strm); 
} 

यहाँ त्रुटि है। तुम मुझे कृपया पता है किसी भी अतिरिक्त जानकारी की जरूरत है

Compiling utilities.cc ... 
src/utilities.cc: In function ‘FILE* open_file(char*, const char*, const char*)’: 
src/utilities.cc:251: error: ISO C++ forbids variable-size array 
gmake: *** [/home/landon/geant4/work/tmp/Linux-g++/exampleN01/utilities.o] Error 1 

त्रुटि लाइन 251 पर

char *filename1 = new(char[filenameLength]); 

को दर्शाता है।

+0

क्या आप '-वायरर' पास कर रहे हैं जो चेतावनियों को त्रुटियों के रूप में मानता है? जी ++ वीएलए को विस्तार के रूप में अनुमति देता है। –

+5

वास्तव में, यह सी है, सी ++ नहीं। आप बस एक सी ++ कंपाइलर का उपयोग कर रहे हैं। –

+3

सी ने 'नया' और 'हटाएं' कीवर्ड कब पेश किया? – DavidO

उत्तर

11

इस प्रयास करें बजाय

char *filename1 = new char[filenameLength]; 

आप ढेर पर एक स्थानीय चर लंबाई सरणी के रूप में एक सरणी इस

char filename1[filenamelength]; 

की तरह नहीं बना सकते, जब तक कि filenamelengthconst के रूप में घोषित किया गया है।

के रूप में भी आप एक सरणी के लिए स्मृति आवंटित है, तो आप

delete [] filename1; 

का उपयोग कर अन्यथा आप एक स्मृति रिसाव होगा स्मृति मुक्त करना चाहिए। इसके अलावा आपके return मानों के आसपास कोष्ठक रखना आवश्यक नहीं है;

+0

यह मेरे लिए काम करता है, मुझे लगता है। धन्यवाद – user1509364

20

त्रुटि सही है। वीएलए (परिवर्तनीय आकार सरणी) सी ++ में वर्जित हैं। यह एक VLA है:

char *filename1 = new char[filenameLength]; 

जो एक VLA नहीं है, लेकिन char रों की एक सरणी ढेर पर आवंटित:

char filename1char[filenameLength]; 

क्या आप शायद मतलब यह है। ध्यान दें कि आप ऑपरेटर delete[] का उपयोग कर इस सूचक को हटा देना चाहिए:

delete[] filename1; 
+1

मुझे हटाएं [filename1) को हटाएं [] filename1 को हटा देना चाहिए? – user1509364

+2

@ user1509364, 'नया' हटाएं, 'हटाएं'] 'हटाएं []' आप क्या नया [] '। – chris

+0

@ user1509364 हां, बिल्कुल। – mfontanini

1

वे मना रहे हैं, लेकिन कोई समाधान उदाहरण के लिए, एक ढेर संभाजक उपयोग करने के लिए है:

http://howardhinnant.github.io/stack_alloc.html

आप ढेर संभाजक उपयोग कर सकते हैं ::std::vector (या किसी अन्य कंटेनर के साथ, या सीधे) के साथ और आप को VLA मिल गया है।

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