2016-07-10 9 views
6

So möchte ich ein Array in einer Funktion mit der Größe durch eine Zahl als Parameter festgelegt werden. Hier ist ein Beispiel:Erstellen Sie ein Array in einer Funktion in C++ ohne eine globale Variable

void temp_arr (const int array_size) { 
    int temp_arr[array_size]; //ERROR array_size needs to be a constant value 
    //Then do something with the temp arr 
} 

Auch wenn der Parameter ein const int ist, wird es nicht funktionieren. Ich möchte kein globales const benutzen und nicht Vektoren benutzen. Ich bin nur neugierig, wie ich C++ lerne. Ich möchte dafür sorgen, dass die Array-Größe bei jedem Aufruf der Funktion unterschiedlich ist. Gibt es eine Lösung für dieses oder bin ich eine const-Variable und das Array vor dem Aufruf der Funktion zu erstellen?

+0

'int * temp_arr = new int [ARRAY_SIZE]; ... löschen [] temp_arr; ' – songyuanyao

+0

@songyuanyao Das ist nicht wirklich dasselbe, da es von der statischen Zuweisung zur dynamischen Zuweisung gehen würde. – user2296177

+1

* und keine Vektoren verwenden. Ich bin nur neugierig, wie ich C++ lerne.* - Sie denken also, dass 'std :: vector' nicht C++ ist? Was ist mit "Vektor", warum so viele Anfänger denken, dass sie es nicht benutzen sollten oder können? – PaulMcKenzie

Antwort

7

eine Template-Funktion verwenden:

template<std::size_t array_size> 
void temp_arr() 
{ 
    int temp_arr[ array_size ]; 
    // ...work with temp_arr... 
} 

Sie können dann mit dieser Syntax die Funktion aufrufen:

temp_arr<32>(); // function will work with a 32 int statically allocated array 

Hinweis

Jeder Anruf mit einem anderen Wert von array_size instanziert eine neue Funktion.

+2

Was ist, wenn die Größe von einer Variablen kommt? – Dmitri

+0

@Dmitri Nur wenn es ein 'constexpr' ist:' constexpr std :: size_t sz {32}; temp_arr (); 'wird funktionieren. Der Punkt ist, dass es beim Kompilieren verfügbar sein muss. – user2296177

+0

Das hat für mich funktioniert. Ich verwende einen Const Int, um in die Vorlage zu gelangen. – kingcobra1986

2

Wenn Sie einen Wert in dieser Funktion übergeben, ist der Wert keine Konstante. Das Definieren eines Arrays muss mit einem konstanten Wert erfolgen. Obwohl Sie const int array_size verwendet haben, wird nur eine Ganzzahl erstellt, die innerhalb der Funktion konstant ist. Wenn Sie also einen Variablenwert in der Funktion übergeben, wird er als Variable verwendet. Daher erzeugt es einen Fehler. Ja, Sie erstellen eine Konstante und übergeben sie während des Funktionsaufrufs.

+0

suchen Ich habe es leid, eine const int in Haupt und haben, dass in die Funktion übergeben. Und ich habe auch versucht, ein const int zu addieren, das Array_size innerhalb der Funktion gleich ist. Willst du sagen, dass ich eine globale Variable erstellen soll? – kingcobra1986

+0

@ kingcobra1986 Sie müssen keine globale Variable erstellen, siehe meine Antwort. – user2296177

+0

@ kingcobra1986 Wie in der Antwort von user2296177 gezeigt, muss keine globale Variable erstellt werden. –

0

können Sie verwenden:

int const size = 10; 
int array[size]; 

ein Array in C++ zu erstellen. Sie können jedoch nicht

verwenden
void temp_arr (const int array_size) { 
    int temp_arr[array_size]; 
} 

ein Array zu erstellen, wenn der Compiler VLAs als Erweiterung unterstützt. Der Standard unterstützt keine VLAs.

Das Qualifikationsmerkmal const in einem Argumenttyp macht lediglich die Variable const in der Funktion - Sie können den Wert nicht ändern. Der Wert kann jedoch nicht unbedingt zur Kompilierungszeit bestimmt werden.

Zum Beispiel können Sie die Funktion aufrufen:

int size; 
std::cout << "Enter the size of the array: "; 
std::cin >> size; 
temp_arr(size); 

Da der Wert nicht unbedingt bei der Kompilierung bestimmt werden werden, kann sie nicht verwendet werden, um ein Array zu erstellen.

+2

Das 'const'-Qualifikationsmerkmal im Argument-Typ ist nicht" unbrauchbar " –

0

Wenn Sie mit dem Gedächtnis haben Problem nicht lassen Sie mich Ihnen eine einfache Art und Weise sagen: -

void temp_arr (const int array_size) 
    { 
     //lets just say you want to get the values from user and range will also be decided by the user by the variable array_size 

     int arr[100]; //lets just make an array of size 100 you can increase if according to your need; 
     for(int i=0; i<array_size ; i++) 
     { 
     scanf("%d",&arr[i]); 
     } 
    } 

Ich weiß, dass dies keine perfekte Lösung, sondern nur eine einfache Möglichkeit für Anfänger.

+1

Sie sollten Code einbinden, um Pufferüberläufe zu verhindern, wenn sie die Größe größer als 100 geben –

+0

völlig einverstanden @ M.M war es nur, um die Idee an die Anfänger zu geben. – dreamBegin

+0

Ich bin auch auf dem Weg zum Programmieren Ich möchte nur die Dinge teilen, die ich kenne. – dreamBegin

0

Sie eine std :: unique_ptr verwenden:

void temp_arr(int array_size) 
{ 
    auto temp_arr = std::make_unique<int[]>(array_size); 
    // code using temp_arr like a C-array 
} 
Verwandte Themen