Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Declaring a valarray, then initialising it later

Reply
Thread Tools

Declaring a valarray, then initialising it later

 
 
Jim
Guest
Posts: n/a
 
      03-04-2007
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<float> data;
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

 
Reply With Quote
 
 
 
 
John Harrison
Guest
Posts: n/a
 
      03-04-2007
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<float> data;
> 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<float> data(init, ax*ay);
...
}

john
 
Reply With Quote
 
 
 
 
Jim
Guest
Posts: n/a
 
      03-05-2007
On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.com> wrote:
> 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<float> data;
> > 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<float> data(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?

 
Reply With Quote
 
Pierre Senellart
Guest
Posts: n/a
 
      03-05-2007
"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<float> data;

<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)
 
Reply With Quote
 
Pierre Senellart
Guest
Posts: n/a
 
      03-05-2007
"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<float> data;

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

 
Reply With Quote
 
John Harrison
Guest
Posts: n/a
 
      03-05-2007
Jim wrote:
> On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.com> wrote:
>
>>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<float> data;
>>> 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<float> data(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
 
Reply With Quote
 
Jim
Guest
Posts: n/a
 
      03-05-2007
On Mar 5, 5:59 pm, John Harrison <john_androni...@hotmail.com> wrote:
> Jim wrote:
> > On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.com> wrote:

>
> >>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<float> data;
> >>> 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<float> data(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<float> d 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.

 
Reply With Quote
 
Jim
Guest
Posts: n/a
 
      03-05-2007
On Mar 5, 3:47 pm, Pierre Senellart <inva...@invalid.invalid> wrote:
> "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<float> data;

> <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.

 
Reply With Quote
 
John Harrison
Guest
Posts: n/a
 
      03-05-2007
Jim wrote:
> On Mar 5, 5:59 pm, John Harrison <john_androni...@hotmail.com> wrote:
>
>>Jim wrote:
>>
>>>On Mar 4, 11:08 pm, John Harrison <john_androni...@hotmail.com> wrote:

>>
>>>>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<float> data;
>>>>> 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<float> data(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<float> d 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
 
Reply With Quote
 
John Harrison
Guest
Posts: n/a
 
      03-05-2007
>>
>>
>> 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<float> d 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<float> data;
};

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

int main()
{
A a;
std::cout << a.data.size() << '\n';
}
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Declaring a static object, but using ctor later? Markus Pitha C++ 5 06-23-2007 03:48 PM
declaring variable and then also in function prototype -- seems weird vlsidesign C Programming 2 01-11-2007 12:14 PM
Check if one date is later then first date user Javascript 41 12-02-2006 10:10 PM
if hyperlink has onclick overridden, then how do I later reset default behavior Jake Barnes Javascript 1 10-16-2006 08:26 PM
Help. SessionID is x then y then x then y BodiKlamph@gmail.com ASP General 0 09-03-2005 03:02 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57