19

他の誰かが書いた既存のコードを使用していますが、コンパイルできません (C の経験は限られていますが、学習しようとしています!)。

ユーティリティ.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]);

追加情報が必要な場合は、お知らせください。

4

3 に答える 3

30

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

char filename1char[filenameLength];

あなたがおそらく意味したのはこれです:

char *filename1 = new char[filenameLength];

これは VLA ではなく、charヒープに割り当てられた の配列です。operator を使用してこのポインタを削除する必要があることに注意してくださいdelete[]

delete[] filename1;
于 2012-07-07T23:22:01.940 に答える
15

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

    char *filename1 = new char[filenameLength];

このように、スタック上にローカル可変長配列として配列を作成することはできません

    char filename1[filenamelength];

filenamelengthとして宣言されていない限りconst

また、配列にメモリを割り当てたので、次を使用してメモリを解放する必要があります

   delete [] filename1;

そうしないと、メモリリークが発生します。returnまた、値を括弧で囲むことは必須ではありません。

于 2012-07-07T23:21:53.890 に答える
3

これらは禁止されていますが、回避策はスタック アロケータを使用することです。次に例を示します。

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

スタック アロケータを::std::vector(または他のコンテナで、または直接) 使用することができ、VLA.

于 2014-01-17T11:29:23.853 に答える