2012-07-07 17 views
12

私は他の誰かが書いた既存のコードをいくつか使用していますが、コンパイルできません(ここではCの経験は限られていますが、ここでC++は可変サイズの配列を禁止しています

#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); 
} 

utilities.ccはエラーです。あなたが私にしてください知っている任意の追加情報が必要な場合はライン251上の

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 

エラー は

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

を指します。

+0

警告をエラーとして扱う '-Werror'を渡していますか? g ++は、VLAを拡張として許可します。 –

+5

本当に、これはCであり、C++ではありません。あなたはC++コンパイラを使っています。 –

+3

Cは「new」と「delete」のキーワードをいつ紹介しましたか? – DavidO

答えて

11

これを試してみてください代わりに

char *filename1 = new char[filenameLength]; 

filenamelengthconstとして宣言されていない限り、あなたはこの

char filename1[filenamelength]; 

のようなスタック上のローカル可変長配列として配列を作成することはできません。あなたは配列にメモリを割り当てたとして

また、あなたはそうしないと、メモリリークを持っています

delete [] filename1; 

を使用してメモリを解放する必要があります。また、値の末尾にかっこを付けることは必須ではありません。

+0

これは私のために働いたと思います。ありがとう – user1509364

20

エラーは正しいです。 VLA(可変サイズ配列)はC++では禁止されています。これはVLAです:VLAない

char *filename1 = new char[filenameLength]; 

が、charの配列はヒープに割り当て:

char filename1char[filenameLength]; 

は何あなたはおそらく意味することは、このです。あなたは演算子delete[]を使用して、このポインタを削除する必要があることに注意してください:

delete[] filename1; 
+1

私はdelete(filename1)をdelete [] filename1に置き換えるべきですか? – user1509364

+2

@ user1509364、 'あなたが' '新しいもの'、 ''あなたは ''新しい[] 'を削除します。 – chris

+0

@ user1509364はい、正確です。 – mfontanini

1

彼らは禁じられますが、回避策は、たとえば、スタックアロケータを使用することですされている:あなたは、スタックアロケータを使用することができます

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

::std::vector(または他のコンテナと一緒に、あるいは直接に)VLAがあなた自身です。

関連する問題