简体   繁体   中英

C++ Expression must have constant value

#include <iomanip>
#include <iostream>
#include <Windows.h>
using namespace std;

template <class T>
void sort(int n, T a[]){
       for(i=0;i<n-1;i++){
          for(j=i;j<n;j++){
               if(a[i] > a[j]){
               temp=a[i];
               a[i]=a[j];
               a[j]=temp;
               }
           }
     }
}


void main(){
    int size;
    cout<<" Please input the amount of numbers you would like to sort"<<endl;
    cin>>size;
    int Amta[size];
    for(int i=0; i<size; i++){
        cout<<"Please enter the "<<size+1<< "number";
        cin>>Amta[i];
    }
    Sleep(100000);
}

I am trying to get the how many numbers the user would like to input from the user and store it in the variable size.

But when I initialize array Amta[size] I get the following compile errors:

Expression must have constant value

and

C2057: expected constant expression" compile error.

You can't enter a non-constant value between the brackets when you declare your array:

int Amta[size];

Since you're getting size from the user, the compiler can't tell ahead of time how much memory it needs for Amta . The easiest thing to do here (especially for an exercise) is to just choose a relatively large value and make that the constant allocation, like:

int Amta[1024];

And then if you want to be careful (and you should) you can check if (size > 1024) and print an error if the user wants a size that's beyond the pre-allocated bounds.

If you want to get fancy, you can define Amta with no pre-set size, like int *Amta; and then you allocate it later with malloc :

Amta = (int *)malloc(sizeof(int) * size);

Then you must also free Amta later, when you're done with it:

free(Amta);

C++ doesn't allow variable length arrays . The size must be a constant. C99 does support it so if you need you can use a C99 compliant compiler. Some compilers like GCC and Clang also support VLA as an extension in C++ mode

But if C++ is a must then you can use alloca (or _alloca on Windows ) to allocate memory on stack and mimic the C99 variable length array behavior

Amta = (int *)alloca(sizeof(int) * size);

This way you don't need to free the memory after going out of scope because the stackframe will automatically be restored. However you need to be very careful while using this . It's still better to use std::vector in C++ for these purposes

The answer depends on 'Compiler'. Every programming language or code is simply a text file with some special language text (the source program). It is the compiler (or sometimes interpreter) that 'translates' our special language into another target language. SO who ever built this compiler is responsible for what can be done and what cannot be done. So in this case, you are using a c++ compiler that does not support "defining array size later". If you use the G++ compiler, you will not get this error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM