2012-07-07 77 views
12

我正在使用其他人編寫的一些現有代碼,我無法編譯它(這裏的C經驗有限,但我正在學習!)。C++禁止使用可變大小的數組

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

你是否在傳遞'-Werror',將警告視爲錯誤? g ++允許VLA作爲擴展。 – 2012-07-07 23:22:05

+5

真的,這是C,而不是C++。你只是使用C++編譯器。 – 2012-07-07 23:22:45

+3

C何時引入「新」和「刪除」關鍵字? – DavidO 2012-07-08 00:27:55

回答

11

試試這個

char *filename1 = new char[filenameLength]; 

你不能這樣

char filename1[filenamelength]; 

除非filenamelength被聲明爲const創建數組作爲棧上的局部變量的長度數組。

而且,你已經爲數組分配的內存,您應該釋放使用

delete [] filename1; 

否則就會有內存泄漏的內存。此外,在您的return值附近加上括號並不重要;

+0

我認爲這對我有效。謝謝 – user1509364 2012-07-07 23:25:53

20

錯誤是正確的。在C++中禁止使用VLA(可變大小的數組)。這是一個VLA:

char filename1char[filenameLength]; 

你什麼意思大概是這樣的:

char *filename1 = new char[filenameLength]; 

這不是VLA,但char秒的陣列在堆上分配。請注意,您應該使用運營商delete[]刪除此指針:

delete[] filename1; 
+1

我應該用delete [] filename1替換delete(filename1)? – user1509364 2012-07-07 23:32:53

+2

@ user1509364,'刪除'你'新'','刪除[]'你'新'[]''。 – chris 2012-07-07 23:34:22

+0

@ user1509364是的,正好。 – mfontanini 2012-07-07 23:41:07