C ++ interdit le tableau de taille variable
Je suis en utilisant le code existant que quelqu'un d'autre a écrit, et je n'arrive pas à compiler (limité de l'expérience en C ici, mais je suis en train d'apprendre!).
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]=='#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);
}
')
{
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);
}
Voici l'erreur.
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
L'erreur sur la ligne 251 se réfère à
char *filename1 = new(char[filenameLength]);
Si vous avez besoin d'informations supplémentaires laissez-moi savoir s'il vous plaît.
source d'informationauteur user1509364 | 2012-07-07
Vous devez vous connecter pour publier un commentaire.
L'erreur est correcte. VLA(de taille variable tableaux) sont interdit en C++. C'est un VLA:
Ce que vous avez probablement voulais dire, c'est ceci:
Qui n'est pas un VLA, mais un tableau de
char
s alloués sur le tas. Notez que vous devez supprimer ce pointeur à l'aide de l'opérateurdelete[]
:Essayez plutôt ceci
vous ne pouvez pas créer un tableau comme une variable locale de la longueur de tableau sur la pile comme ce
sauf
filenamelength
est déclarée commeconst
.Également que vous avez alloué de la mémoire pour un tableau, vous devez libérer de la mémoire à l'aide de
sinon vous allez avoir une fuite de mémoire. Aussi il n'est pas essentiel d'avoir des parenthèses autour de votre
return
valeurs;Ils ne sont pas interdits, mais une solution de contournement consiste à utiliser une pile allocateur, par exemple:
http://howardhinnant.github.io/stack_alloc.html
Vous pouvez utiliser la pile de l'allocateur avec un
::std::vector
(ou avec un autre conteneur, ou tout simplement directement) et vous avez vous-même unVLA
.