By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,709 Members | 1,650 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,709 IT Pros & Developers. It's quick & easy.

Declaring a valarray, then initialising it later

P: n/a
Jim
Hi,
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.

int main(int argc, char * argv[])
{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}

}

Problem is when the code leaves the for loop data is of size 0, as
what it's pointed to has been deleted by passing out of scope. I've
tried all sorts of combinations data as extern, defining it outside
the main block, replacing *** with data(init,ax1*ax2); but no success.
If anyone's got any ideas I would be very grateful!
Thanks

Mar 4 '07 #1
Share this Question
Share on Google+
9 Replies


P: n/a
Jim wrote:
Hi,
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.

int main(int argc, char * argv[])
{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}

}

Problem is when the code leaves the for loop data is of size 0, as
what it's pointed to has been deleted by passing out of scope. I've
tried all sorts of combinations data as extern, defining it outside
the main block, replacing *** with data(init,ax1*ax2); but no success.
If anyone's got any ideas I would be very grateful!
Thanks
Well I don't quite follow your code (the loop seems misplaced to me) but
why can't you just do this?

int main()
{
float init = 0;
int ax1, ax2;
for (int i = 0; i < argc; ++i)
{
// read in parameters
}
valarray<floatdata(init, ax*ay);
...
}

john
Mar 4 '07 #2

P: n/a
Jim
On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.comwrote:
Jim wrote:
Hi,
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
int main(int argc, char * argv[])
{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}
}
Problem is when the code leaves the for loop data is of size 0, as
what it's pointed to has been deleted by passing out of scope. I've
tried all sorts of combinations data as extern, defining it outside
the main block, replacing *** with data(init,ax1*ax2); but no success.
If anyone's got any ideas I would be very grateful!
Thanks

Well I don't quite follow your code (the loop seems misplaced to me) but
why can't you just do this?

int main()
{
float init = 0;
int ax1, ax2;
for (int i = 0; i < argc; ++i)
{
// read in parameters
}
valarray<floatdata(init, ax*ay);
...

}

john
This is just an example of one kind of problem I've been having with C+
+. If you know you want a complex variable (class or an array for
instance), you declare it at the start, but then initialise it when
you've got the information to do it. How do you then tie these two
together?

Mar 5 '07 #3

P: n/a
"Jim" ,comp.lang.c++:
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
valarray<floatdata;
<snip>
valarray<float d(init,ax1*ax2); //***
data=d;
It is undefined behaviou to use in an assignment a valarray of a
different size (here, data is a valarray of size 0, while d has size
ax1*ax2). Try use the resize method instead:

data.resize(ax1*ax2,init)
Mar 5 '07 #4

P: n/a
"Jim" ,comp.lang.c++:
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
valarray<floatdata;
<snip>
valarray<float d(init,ax1*ax2); //***
data=d;
It is undefined behaviour to use in an assignment a valarray of a
different size (here, data is a valarray of size 0, while d has size
ax1*ax2). Try using the resize method instead:

data.resize(ax1*ax2,init)

Mar 5 '07 #5

P: n/a
Jim wrote:
On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.comwrote:
>>Jim wrote:
>>>Hi,
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
>>>int main(int argc, char * argv[])
{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}
>>>}
>>>Problem is when the code leaves the for loop data is of size 0, as
what it's pointed to has been deleted by passing out of scope. I've
tried all sorts of combinations data as extern, defining it outside
the main block, replacing *** with data(init,ax1*ax2); but no success.
If anyone's got any ideas I would be very grateful!
Thanks

Well I don't quite follow your code (the loop seems misplaced to me) but
why can't you just do this?

int main()
{
float init = 0;
int ax1, ax2;
for (int i = 0; i < argc; ++i)
{
// read in parameters
}
valarray<floatdata(init, ax*ay);
...

}

john


This is just an example of one kind of problem I've been having with C+
+. If you know you want a complex variable (class or an array for
instance), you declare it at the start, but then initialise it when
you've got the information to do it. How do you then tie these two
together?
Don't declare it at the start, declare it only when you have the
necessary information to initialise it. I feel I must be missing something.

john
Mar 5 '07 #6

P: n/a
Jim
On Mar 5, 5:59 pm, John Harrison <john_androni...@hotmail.comwrote:
Jim wrote:
On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.comwrote:
>Jim wrote:
>>Hi,
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
>>int main(int argc, char * argv[])
{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}
>>}
>>Problem is when the code leaves the for loop data is of size 0, as
what it's pointed to has been deleted by passing out of scope. I've
tried all sorts of combinations data as extern, defining it outside
the main block, replacing *** with data(init,ax1*ax2); but no success.
If anyone's got any ideas I would be very grateful!
Thanks
>Well I don't quite follow your code (the loop seems misplaced to me) but
why can't you just do this?
>int main()
{
float init = 0;
int ax1, ax2;
for (int i = 0; i < argc; ++i)
{
// read in parameters
}
valarray<floatdata(init, ax*ay);
...
>}
>john
This is just an example of one kind of problem I've been having with C+
+. If you know you want a complex variable (class or an array for
instance), you declare it at the start, but then initialise it when
you've got the information to do it. How do you then tie these two
together?

Don't declare it at the start, declare it only when you have the
necessary information to initialise it. I feel I must be missing something.

john

Ok, if you have a class, all of the member variables are declared in
the class definition, and are then available to all of the methods in
that class. I want to have an object with a valarray in it, it's got
to be a valarray as unfortunately the code written by someone else
supplies a valarray. Copying it to a different type would be
inefficient. In the constructor I read in the file using a supplied
method which when given an uninitialised valarray (i.e.
valarray<floatd;) gets given a set of values and a confirmed length
etc. Even if I declare a valarray in the method, or use the one in the
class definition the size of the valarray is what it should be whilst
in the method, but as soon as you leave the scope of that method the
array reverts to zero, meaning it's useless to the rest of the class.
I can't find any way of initialising a declared valarray.

Mar 5 '07 #7

P: n/a
Jim
On Mar 5, 3:47 pm, Pierre Senellart <inva...@invalid.invalidwrote:
"Jim" ,comp.lang.c++:
I want to declare that that a valarray of a certain name exist at the
beginning of some code, but I can't instatiate it until I've read in
some parameters later on in a for loop i.e.
valarray<floatdata;
<snip>
valarray<float d(init,ax1*ax2); //***
data=d;

It is undefined behaviour to use in an assignment a valarray of a
different size (here, data is a valarray of size 0, while d has size
ax1*ax2). Try using the resize method instead:

data.resize(ax1*ax2,init)
I've just tried that and unfortunately it failed, data went back to
it's original size.

Mar 5 '07 #8

P: n/a
Jim wrote:
On Mar 5, 5:59 pm, John Harrison <john_androni...@hotmail.comwrote:
>>Jim wrote:
>>>On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.comwrote:
>>>>Jim wrote:
>>>>>Hi,
>I want to declare that that a valarray of a certain name exist at the
>beginning of some code, but I can't instatiate it until I've read in
>some parameters later on in a for loop i.e.
>>>>>int main(int argc, char * argv[])
>{
valarray<floatdata;
float init=0;
for(int i=0; i<argc; i++)
{
//read in parameters, ax1,ax2
valarray<float d(init,ax1*ax2); //***
data=d;
}
>>>>>}
>>>>>Problem is when the code leaves the for loop data is of size 0, as
>what it's pointed to has been deleted by passing out of scope. I've
>tried all sorts of combinations data as extern, defining it outside
>the main block, replacing *** with data(init,ax1*ax2); but no success.
>If anyone's got any ideas I would be very grateful!
>Thanks
>>>>Well I don't quite follow your code (the loop seems misplaced to me) but
why can't you just do this?
>>>>int main()
{
float init = 0;
int ax1, ax2;
for (int i = 0; i < argc; ++i)
{
// read in parameters
}
valarray<floatdata(init, ax*ay);
...
>>>>}
>>>>john
>>>This is just an example of one kind of problem I've been having with C+
+. If you know you want a complex variable (class or an array for
instance), you declare it at the start, but then initialise it when
you've got the information to do it. How do you then tie these two
together?

Don't declare it at the start, declare it only when you have the
necessary information to initialise it. I feel I must be missing something.

john

Ok, if you have a class, all of the member variables are declared in
the class definition, and are then available to all of the methods in
that class. I want to have an object with a valarray in it, it's got
to be a valarray as unfortunately the code written by someone else
supplies a valarray. Copying it to a different type would be
inefficient. In the constructor I read in the file using a supplied
method which when given an uninitialised valarray (i.e.
valarray<floatd;) gets given a set of values and a confirmed length
etc. Even if I declare a valarray in the method, or use the one in the
class definition the size of the valarray is what it should be whilst
in the method, but as soon as you leave the scope of that method the
array reverts to zero, meaning it's useless to the rest of the class.
I can't find any way of initialising a declared valarray.
Well I feel you must be making a mistake somewhere in your code. This
shouldn't difficult. Why not post the actual code?

john
Mar 5 '07 #9

P: n/a
>>
>>
Ok, if you have a class, all of the member variables are declared in
the class definition, and are then available to all of the methods in
that class. I want to have an object with a valarray in it, it's got
to be a valarray as unfortunately the code written by someone else
supplies a valarray. Copying it to a different type would be
inefficient. In the constructor I read in the file using a supplied
method which when given an uninitialised valarray (i.e.
valarray<floatd;) gets given a set of values and a confirmed length
etc. Even if I declare a valarray in the method, or use the one in the
class definition the size of the valarray is what it should be whilst
in the method, but as soon as you leave the scope of that method the
array reverts to zero, meaning it's useless to the rest of the class.
I can't find any way of initialising a declared valarray.

Well I feel you must be making a mistake somewhere in your code. This
shouldn't difficult. Why not post the actual code?

john
For instance this program print 0, 100, 100. The size of data has been
sucessfully changed.

#include <iostream>
#include <valarray>

class A
{
public:
A();
std::valarray<floatdata;
};

A::A()
{
std::cout << data.size() << '\n';
std::valarray<floatd(1.0, 100);
data.resize(100);
data = d;
std::cout << data.size() << '\n';
}

int main()
{
A a;
std::cout << a.data.size() << '\n';
}
Mar 5 '07 #10

This discussion thread is closed

Replies have been disabled for this discussion.