2012-07-07 11 views
12

Estoy usando un código existente que alguien más ha escrito, y no puedo obtenerlo para compilar (¡tengo experiencia limitada en C aquí pero estoy tratando de aprender!).C++ prohíbe el arreglo de tamaño variable

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

Aquí está el error.

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 

El error en la línea 251 se refiere a

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

Si necesita cualquier información adicional por favor hágamelo saber.

+0

¿Está pasando '-Werror' que trata las advertencias como errores? g ++ permite VLAs como una extensión. –

+5

Realmente, esto es C, no C++. Solo estás usando un compilador de C++. –

+3

¿Cuándo C introdujo las palabras clave 'nuevo' y 'eliminar'? – DavidO

Respuesta

11

probar este lugar

char *filename1 = new char[filenameLength]; 

no se puede crear una matriz como una matriz de longitud variable local en la pila como esto

char filename1[filenamelength]; 

menos filenamelength está declarada como const.

También como se ha asignado memoria para una matriz, debe liberar la memoria utilizando

delete [] filename1; 

de lo contrario tendrá una pérdida de memoria. Además, no es esencial tener paréntesis alrededor de sus valores return;

+0

Esto funcionó para mí, creo. Gracias – user1509364

20

El error es correcto. VLA (matrices de tamaño variable) están prohibidas en C++. Se trata de un VLA:

char filename1char[filenameLength]; 

Lo que probablemente quiere decir es esto:

char *filename1 = new char[filenameLength]; 

que no es un VLA, pero una serie de char s asignados en el montón. Tenga en cuenta que debe eliminar este puntero usando el operador delete[]:

delete[] filename1; 
+1

Debo reemplazar delete (filename1) con delete [] filename1? – user1509364

+2

@ user1509364, 'eliminar' lo que' nuevo', 'eliminar []' lo que 'nuevo []'. – chris

+0

@ user1509364 Sí, exactamente. – mfontanini

Cuestiones relacionadas