2012-07-07 10 views
12

Używam istniejącego kodu, który ktoś napisał, i nie mogę go skompilować (ograniczone doświadczenie C tutaj, ale staram się uczyć!).C++ zabrania zmiennej tablicy zmiennych

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

Tutaj jest błąd.

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 

Błąd na linii 251 odnosi się do

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

Jeśli potrzebujesz dodatkowych informacji proszę dać mi znać.

+0

Czy przekazujesz '-Werror', który traktuje ostrzeżenia jako błędy? g ++ zezwala na VLA jako rozszerzenie. –

+5

Naprawdę, to jest C, nie C++. Używasz tylko kompilatora C++. –

+3

Kiedy wprowadzono słowa kluczowe "nowe" i "usuń"? – DavidO

Odpowiedz

11

Spróbuj zamiast

char *filename1 = new char[filenameLength]; 

nie można utworzyć tablicę jako lokalny tablicy zmiennej długości na stosie jak to

char filename1[filenamelength]; 

chyba filenamelength jest zadeklarowana jako const.

także jak masz przydzielone pamięć dla tablicy, należy zwolnić pamięć korzystając

delete [] filename1; 

inaczej będziesz mieć przeciek pamięci. Nie jest również istotne, aby nawiasy były powiązane z wartościami return;

+0

To działało dla mnie, jak sądzę. Dziękuję – user1509364

20

Błąd jest poprawny. VLA (tablice o zmiennych rozmiarach) są zabronione w C++. Jest to VLA:

char filename1char[filenameLength]; 

Co prawdopodobnie oznaczało to:

char *filename1 = new char[filenameLength]; 

który nie jest VLA, ale tablica char s alokowane na stercie. Należy pamiętać, że należy usunąć ten wskaźnik za pomocą operatora delete[]:

delete[] filename1; 
+1

powinienem zastąpić delete (filename1) z delete [] filename1? – user1509364

+2

@ user1509364, "usuń" to, co "nowe", "usuń []" co "nowe" [] '. – chris

+0

@ user1509364 Tak, dokładnie. – mfontanini

Powiązane problemy