472,352 Members | 1,495 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,352 software developers and data experts.

"error C2057: expected constant expression", "error C2466: cannot allocate an array of constant size 0". Why doesn't my simple program work???

Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]){

const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

But I get the error message shown in title. Why doesn't my program
work? Thanks for help!

Jan 20 '07 #1
13 27123
On 2007-01-20 17:08, hn********@gmail.com wrote:
Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]){

const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

But I get the error message shown in title. Why doesn't my program
work? Thanks for help!
Because T is not constant at compile-time, which it needs to be for the
compiler to know how much space to allocate on the stack. That, of
course, is not the correct explanation according to the standard but it
quite nicely describes what is going on. Consider the following code in
which T is also constant but can wary with every run of the application:

#include<iostream>

int main()
{
double L;
std::cin >L;
const int T = static_cast<const int>(L);
return 0;
}

--
Erik Wikström
Jan 20 '07 #2
hn********@gmail.com wrote:
Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

Why doesn't my program work?
Good question. The code compiled fine for my g++ compiler, but not for
http://www.comeaucomputing.com/tryitout I have some questions about
comeau's output:
"ComeauTest.c", line 6: warning: type qualifier is meaningless on cast type
const int T = static_cast<const int>(L);
^
What is this? Isn't the 'const' required in the above context?
"ComeauTest.c", line 7: error: constant value is not known
int arr[T];
^
Why is that?
Jan 20 '07 #3
Erik Wikström wrote:
On 2007-01-20 17:08, hn********@gmail.com wrote:
>Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]){

const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

But I get the error message shown in title. Why doesn't my program
work? Thanks for help!

Because T is not constant at compile-time,
Huh? How is that?
which it needs to be for the
compiler to know how much space to allocate on the stack. That, of
course, is not the correct explanation according to the standard but it
quite nicely describes what is going on. Consider the following code in
which T is also constant but can wary with every run of the application:

#include<iostream>

int main()
{
double L;
You are cheating in the line above. The OP had:

const double L = 1.234;
^^^^^
std::cin >L;
With the line of the OP, this would be undefined behavior.
const int T = static_cast<const int>(L);
return 0;
}

Best

Kai-Uwe Bux

Jan 20 '07 #4
Daniel T. wrote:
hn********@gmail.com wrote:
>Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

Why doesn't my program work?

Good question. The code compiled fine for my g++ compiler, but not for
http://www.comeaucomputing.com/tryitout I have some questions about
comeau's output:
>"ComeauTest.c", line 6: warning: type qualifier is meaningless on cast type
const int T = static_cast<const int>(L);
^

What is this? Isn't the 'const' required in the above context?
>"ComeauTest.c", line 7: error: constant value is not known
int arr[T];
^

Why is that?
In order for T to be a compile-time constant, it has to have an
initializer that's a compile-time constant. Floating-point values aren't.

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)
Jan 20 '07 #5
Pete Becker <pe**@versatilecoding.comwrote:
Daniel T. wrote:
hn********@gmail.com wrote:
Hi:
I have the following simple program:
>
#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}
>
Why doesn't my program work?
Good question. The code compiled fine for my g++ compiler, but not for
http://www.comeaucomputing.com/tryitout I have some questions about
comeau's output:
"ComeauTest.c", line 6: warning: type qualifier is meaningless on cast type
const int T = static_cast<const int>(L);
^
What is this? Isn't the 'const' required in the above context?
What about this warning?
"ComeauTest.c", line 7: error: constant value is not known
int arr[T];
^
Why is that?

In order for T to be a compile-time constant, it has to have an
initializer that's a compile-time constant. Floating-point values aren't.
I didn't know that. Thanks.
Jan 20 '07 #6

"Erik Wikström 写道:
"
On 2007-01-20 17:08, hn********@gmail.com wrote:
Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]){

const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

But I get the error message shown in title. Why doesn't my program
work? Thanks for help!

Because T is not constant at compile-time, which it needs to be for the
compiler to know how much space to allocate on the stack. That, of
course, is not the correct explanation according to the standard but it
quite nicely describes what is going on. Consider the following code in
which T is also constant but can wary with every run of the application:

#include<iostream>

int main()
{
double L;
std::cin >L;
const int T = static_cast<const int>(L);
return 0;
}

--
Erik Wikström
Thanks for help, and here I've made some modification to the program.

#include<iostream>

int main()
{
#define L 1.234
#define T static_cast<const int>(L)
int arr[T];
return 0;
}

Does it mean that now T is a "compile-time determined" variable?
If it does, then could I suppose that "#define" is expanded and
calculated at complie-time?
Does all "#define" perform in a same way?
Thanks a lot for helping me.

Jan 21 '07 #7
Daniel T. wrote:
Pete Becker <pe**@versatilecoding.comwrote:
>Daniel T. wrote:
>>hn********@gmail.com wrote:

Hi:
I have the following simple program:

#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}

Why doesn't my program work?
Good question. The code compiled fine for my g++ compiler, but not for
http://www.comeaucomputing.com/tryitout I have some questions about
comeau's output:

"ComeauTest.c", line 6: warning: type qualifier is meaningless on cast type
const int T = static_cast<const int>(L);
^
What is this? Isn't the 'const' required in the above context?

What about this warning?
For built-in types, there is no difference between a const rvalue and a
non-const rvalue. That means that there is no difference between the
following casts (they both produce an rvalue of type int):

static_cast<int>(1.234)
static_cast<const int>(1.234)

So the const is meaningless in this context.
--
Clark S. Cox III
cl*******@gmail.com
Jan 21 '07 #8
On Jan 20, 8:10 pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
Erik Wikström wrote:
On 2007-01-20 17:08, hn.ft.p...@gmail.com wrote:
Hi:
I have the following simple program:
#include<iostream>
using namespace std;
int main(int argc, char* argv[]){
const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}
But I get the error message shown in title. Why doesn't my program
work? Thanks for help!
Because T is not constant at compile-time,

Huh? How is that?
Because the program have to execute the static_cast before the value of
T can be determined. And to declare an array on the stack you need to
know the size of the array at compile-time. Perhaps I was a bit
unclear, what I meant was that T was not a constant value at
compile-time.
which it needs to be for the
compiler to know how much space to allocate on the stack. That, of
course, is not the correct explanation according to the standard but it
quite nicely describes what is going on. Consider the following code in
which T is also constant but can wary with every run of the application:
#include<iostream>
int main()
{
double L;

You are cheating in the line above. The OP had:

const double L = 1.234;
^^^^^
Yes, but it's the value (and constness) of T that is of interest in
this problem.

--
Erik Wikström

Jan 22 '07 #9
On Jan 21, 10:51 am, hn.ft.p...@gmail.com wrote:
Thanks for help, and here I've made some modification to the program.

#include<iostream>

int main()
{
#define L 1.234
#define T static_cast<const int>(L)
int arr[T];
return 0;

}

Does it mean that now T is a "compile-time determined" variable?
No, what you have done is to use macros to restructure your code a bit,
after this has been through the pre-processor this is what you'll get:

#include<iostream>

int main()
{
int arr[static_cast<const int>(1.234)];
return 0;
}
If it does, then could I suppose that "#define" is expanded and
calculated at compile-time?
They are expanded, yes, but not calculated. Or rather the static_cast
is not evaluated until runtime, which is to late since the size of the
array needs to be known at compile-time.
Does all "#define" perform in a same way?
All defines are expanded by the pre-processor, but that is all, if you
want code evaluated at compile-time you can do some things with
templates, but I don't think that's what you want.

What you can do is to allocate the array on the heap:

int main()
{
int* arr = new int[static_cast<const int>(1.234)];
delete[] arr; // don't forget this when you are done
return 0;
}

--
Erik Wikström

Jan 22 '07 #10
"Erik Wikström 写道:
"
On Jan 21, 10:51 am, hn.ft.p...@gmail.com wrote:
Thanks for help, and here I've made some modification to the program.

#include<iostream>

int main()
{
#define L 1.234
#define T static_cast<const int>(L)
int arr[T];
return 0;

}

Does it mean that now T is a "compile-time determined" variable?

No, what you have done is to use macros to restructure your code a bit,
after this has been through the pre-processor this is what you'll get:

#include<iostream>

int main()
{
int arr[static_cast<const int>(1.234)];
return 0;
}
Yes, I get it.
But how to explain the following odd behavior of MS VS8:

int main(int argc, char** argv){
#define L 1.234
#define T static_cast<int>(L)
int arr[T];
arr[0] = 1;
cout << arr[0] << endl;
return 0;
}
Fine, without any warnings or errors.

int main(int argc, char** argv){
double L = 1.234;
int T = static_cast<int>(L);
int arr[T];
arr[0] = 1;
cout << arr[0] << endl;
return 0;
}
error C2057: expected constant expression; error C2466: cannot allocate
an array of constant size 0, on MS VS8
while gcc 3.4.2 approve it.
If it does, then could I suppose that "#define" is expanded and
calculated at compile-time?

They are expanded, yes, but not calculated. Or rather the static_cast
is not evaluated until runtime, which is to late since the size of the
array needs to be known at compile-time.
Does all "#define" perform in a same way?

All defines are expanded by the pre-processor, but that is all, if you
want code evaluated at compile-time you can do some things with
templates, but I don't think that's what you want.

What you can do is to allocate the array on the heap:

int main()
{
int* arr = new int[static_cast<const int>(1.234)];
delete[] arr; // don't forget this when you are done
return 0;
}

--
Erik Wikström
Jan 22 '07 #11
Erik Wikström wrote:
On Jan 20, 8:10 pm, Kai-Uwe Bux <jkherci...@gmx.netwrote:
>Erik Wikström wrote:
On 2007-01-20 17:08, hn.ft.p...@gmail.com wrote:
Hi:
I have the following simple program:
> #include<iostream>
using namespace std;
int main(int argc, char* argv[]){
>const double L = 1.234;
const int T = static_cast<const int>(L);
int arr[T];
return 0;
}
>But I get the error message shown in title. Why doesn't my program
work? Thanks for help!
Because T is not constant at compile-time,

Huh? How is that?

Because the program have to execute the static_cast before the value of
T can be determined. And to declare an array on the stack you need to
know the size of the array at compile-time. Perhaps I was a bit
unclear, what I meant was that T was not a constant value at
compile-time.
The static_cast explanation is wanting:

unsigned char const c = 'c';
unsigned int const i = static_cast<int>( c );

typedef char array [i];

int main ( void ) {
array A;
}

The above compiles fine and is, as far as I can tell standard conforming
even though it uses a static cast. The crux of the matter seems to be that
non-integer arithmetic expressions do not qualify as compile time constants
(allowing the compiler and the target processor to differ in their opinion
on how to approximate pi properly).
>
which it needs to be for the
compiler to know how much space to allocate on the stack.
[non-disputed facts snipped]
Best

Kai-Uwe Bux
Jan 22 '07 #12

Kai-Uwe Bux wrote:
>
unsigned char const c = 'c';
unsigned int const i = static_cast<int>( c );

typedef char array [i];

int main ( void ) {
array A;
}

The above compiles fine and is, as far as I can tell standard conforming
even though it uses a static cast. The crux of the matter seems to be that
non-integer arithmetic expressions do not qualify as compile time constants
(allowing the compiler and the target processor to differ in their opinion
on how to approximate pi properly).
Although this program is legal:

unsigned int const i = 3.14159;

typedef char array[i];

int main()
{
array A;
}

Greg

Jan 22 '07 #13
Greg wrote:
>
Kai-Uwe Bux wrote:
>>
unsigned char const c = 'c';
unsigned int const i = static_cast<int>( c );

typedef char array [i];

int main ( void ) {
array A;
}

The above compiles fine and is, as far as I can tell standard conforming
even though it uses a static cast. The crux of the matter seems to be
that non-integer arithmetic expressions do not qualify as compile time
constants (allowing the compiler and the target processor to differ in
their opinion on how to approximate pi properly).

Although this program is legal:

unsigned int const i = 3.14159;

typedef char array[i];

int main()
{
array A;
}
This is making me dizzy. Here is what the standard has to say [5.19/1]:

[...] An integral constant-expression can involve only literals (2.13),
enumerators, const variables or static data members of integral or
enumeration types initialized with constant expressions (8.5), non-type
template parameters of integral or enumeration types, and sizeof
expressions. Floating literals (2.13.3) can appear only if they are cast
to integral or enumeration types. Only type conversions to integral or
enumeration types can be used. In particular, except in sizeof
expressions, functions, class objects, pointers, or references shall not
be used, and assignment, increment, decrement, function-call, or comma
operators shall not be used.

So, it appears that the only legal way that a float can make it into an
integral constant-expression is as a floating literal converted to an
integral or enumeration type. In particular, const variables of floating
point types do not qualify even if they are initialized with a (floating
point) constant-expression.

Makes you wonder what the rational might be.
Best

Kai-Uwe Bux
Jan 22 '07 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: hvaisane | last post by:
Valgrind says ==11604== Invalid read of size 4 ==11604== at 0x8048ABB: main (foo.cc:36) ==11604== Address 0x1B92415C is 4 bytes inside a...
3
by: mrwoopey | last post by:
Hi, I am using the example "Authenticate against the Active Directory by Using Forms Authentication and Visual Basic .NET": ...
26
by: drako | last post by:
Hi, I'm a bit stumped as I am getting a "Notice: Array to String Conversion" error when trying to do something that on the surface should be a...
4
by: jaime | last post by:
Hi again all. Given the line: const int x=5; Can I then use "x" as a constant expression? (By "constant expression", I mean "constant...
6
by: Lawrence Spector | last post by:
I ran into a problem using g++. Visual Studio 2005 never complained about this, but with g++ I ran into this error. I can't figure out if I've...
56
by: Adem | last post by:
C/C++ language proposal: Change the 'case expression' from "integral constant-expression" to "integral expression" The C++ Standard (ISO/IEC...
1
by: Godlove Mathew | last post by:
Hi, I installed a Borland C++ in my laptop a 32-bit operating system with windows vista. I wrote i very simple program to display "Hello world"...
1
by: Kemmylinns12 | last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and...
0
by: Naresh1 | last post by:
What is WebLogic Admin Training? WebLogic Admin Training is a specialized program designed to equip individuals with the skills and knowledge...
0
jalbright99669
by: jalbright99669 | last post by:
Am having a bit of a time with URL Rewrite. I need to incorporate http to https redirect with a reverse proxy. I have the URL Rewrite rules made...
0
by: Matthew3360 | last post by:
Hi there. I have been struggling to find out how to use a variable as my location in my header redirect function. Here is my code. ...
2
by: Matthew3360 | last post by:
Hi, I have a python app that i want to be able to get variables from a php page on my webserver. My python app is on my computer. How would I make it...
0
by: Arjunsri | last post by:
I have a Redshift database that I need to use as an import data source. I have configured the DSN connection using the server, port, database, and...
0
by: Matthew3360 | last post by:
Hi, I have been trying to connect to a local host using php curl. But I am finding it hard to do this. I am doing the curl get request from my web...
0
by: Carina712 | last post by:
Setting background colors for Excel documents can help to improve the visual appeal of the document and make it easier to read and understand....
0
BLUEPANDA
by: BLUEPANDA | last post by:
At BluePanda Dev, we're passionate about building high-quality software and sharing our knowledge with the community. That's why we've created a SaaS...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.