C++ verbiedt array met variabele grootte

Ik gebruik bestaande code die iemand anders heeft geschreven, en ik krijg het niet gecompileerd (beperkte C-ervaring hier, maar ik probeer het te leren!).

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

Dit is de fout.

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

De fout op regel 251 verwijst naar

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

Als je aanvullende informatie nodig hebt, laat het me dan weten.


Antwoord 1, autoriteit 100%

De fout is correct. VLA (arrays met variabele grootte) zijn verboden in C++. Dit is een VLA:

char filename1char[filenameLength];

Wat je waarschijnlijk bedoelde is dit:

char *filename1 = new char[filenameLength];

Dat is geen VLA, maar een array van chars die op de heap zijn toegewezen. Merk op dat u deze aanwijzer moet verwijderen met de operator delete[]:

delete[] filename1;

Antwoord 2, autoriteit 48%

Probeer dit in plaats daarvan

    char *filename1 = new char[filenameLength];

je kunt op deze manier geen array maken als een lokale array met variabele lengte op de stapel

    char filename1[filenamelength];

tenzij filenamelength is gedeclareerd als const.

Ook omdat u geheugen voor een array hebt toegewezen, moet u het geheugen vrijmaken met

   delete [] filename1;

anders heb je een geheugenlek. Het is ook niet essentieel om haakjes rond uw return waarden te plaatsen;


Antwoord 3, autoriteit 7%

Ze zijn verboden, maar een tijdelijke oplossing is om een ​​stapeltoewijzer te gebruiken, bijvoorbeeld:

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

Je kunt de stapeltoewijzer gebruiken met een ::std::vector (of met een andere container, of gewoon rechtstreeks) en je hebt een VLA .

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes