2012-07-07 13 views
12

Ich verwende etwas vorhandenen Code, den jemand anderes geschrieben hat, und ich kann es nicht zum Kompilieren bekommen (begrenzte C-Erfahrung hier, aber ich versuche zu lernen!).C++ verbietet Array variabler Größe

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

ist hier der Fehler.

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 

Der Fehler auf der Leitung 251 bezieht sich auf

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

Wenn Sie weitere Informationen lassen Sie mich brauchen, wissen Sie.

+0

Übergeben Sie "-Werror", die Warnungen als Fehler behandelt? g ++ erlaubt VLAs als Erweiterung. –

+5

Wirklich, das ist C, nicht C++. Sie verwenden nur einen C++ - Compiler. –

+3

Wann hat C die Schlüsselwörter "new" und "delete" eingeführt? – DavidO

Antwort

11

dieses Versuchen Sie stattdessen

char *filename1 = new char[filenameLength]; 

Sie dieses

char filename1[filenamelength]; 

ein Array als lokale Variable Länge Array auf dem Stapel wie nicht schaffen kann, wenn filenamelength als const deklariert wird.

auch, wie Sie Speicher für ein Array zugewiesen haben, sollten Sie den Speicher frei mit

delete [] filename1; 

sonst werden Sie einen Speicherverlust haben. Es ist auch nicht notwendig, Klammern um Ihre return Werte zu haben;

+0

Das funktionierte für mich, denke ich. Danke – user1509364

20

Der Fehler ist richtig. VLA (Arrays variabler Größe) sind in C++ verboten. Dies ist ein VLA:

char filename1char[filenameLength]; 

Was Sie wahrscheinlich gemeint ist dies:

char *filename1 = new char[filenameLength]; 

das kein VLA ist, sondern eine Reihe von char s auf dem Heap zugeordnet. Beachten Sie, dass Sie diesen Zeiger mit Operator delete[] löschen sollten:

delete[] filename1; 
+1

Ich sollte löschen (Dateiname1) durch Löschen ersetzen [] Dateiname1? – user1509364

+2

@ user1509364, 'löschen' was du' neu', 'lösch []' was du 'neu []'. – chris

+0

@ user1509364 Ja, genau. – mfontanini

1

Sie verboten sind, aber eine Behelfslösung ist ein Stapel allocator zu verwenden, zum Beispiel:

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

Sie den Stapel allocator verwenden können mit einem ::std::vector (oder mit einem anderen Container, oder nur direkt) und Sie haben sich eine VLA.

Verwandte Themen