Pointer clarification needed

Discussion in 'VHDL' started by Tricky, Sep 9, 2009.

  1. Tricky

    Tricky Guest

    the following code works, and Im just making sure that it is garanteed
    to work and Im not just hitting some luck that the pointer address has
    remained constant this time only. Look at the following code:

    process
    type a_p_t is access integer;

    variable ap1 : a_p_t;
    variable ap2 : a_p_t;
    begin
    ap1 := new integer;
    ap1.all := 1;

    ap2 := ap1;

    DEALLOCATE(ap1);

    ap1 := new integer;
    ap1.all := 5;

    echo(integer'image(ap2.all) & LF);
    wait;
    end process;
    ......

    I thought that ap2 would hold be a copy of the origional ap1,
    therefore when new memory was alocated you couldnt garantee that ap2
    would now point to the correct place, and in this case when I run it
    Im just lucky ap1 doesnt change when a new integer is created?. or Is
    it actually the case that the address will hold valid for ever, and
    ap2 will now always point to the value inside ap1.

    am I correct in thinking, that if I assign ap1 to something else, ap2
    then wont work?
     
    Tricky, Sep 9, 2009
    #1
    1. Advertising

  2. Tricky

    Tricky Guest

    On 9 Sep, 09:31, Tricky <> wrote:
    > the following code works, and Im just making sure that it is garanteed
    > to work and Im not just hitting some luck that the pointer address has
    > remained constant this time only. Look at the following code:
    >
    >   process
    >      type a_p_t is access integer;
    >
    >      variable ap1 : a_p_t;
    >      variable ap2 : a_p_t;
    >   begin
    >     ap1 := new integer;
    >     ap1.all := 1;
    >
    >     ap2 := ap1;
    >
    >     DEALLOCATE(ap1);
    >
    >     ap1 := new integer;
    >     ap1.all := 5;
    >
    >     echo(integer'image(ap2.all) & LF);
    >     wait;
    >   end process;
    > .....
    >
    > I thought that ap2 would hold be a copy of the origional ap1,
    > therefore when new memory was alocated you couldnt garantee that ap2
    > would now point to the correct place, and in this case when I run it
    > Im just lucky ap1 doesnt change when a new integer is created?. or Is
    > it actually the case that the address will hold valid for ever, and
    > ap2 will now always point to the value inside ap1.
    >
    > am I correct in thinking, that if I assign ap1 to something else, ap2
    > then wont work?


    I think I may have just answered my own question - slightly modified
    code outputs the value 10, and doesnt give a fatal error:

    ap1 := new integer;
    ap1.all := 1;

    ap2 := ap1;

    DEALLOCATE(ap1);

    ap3 := new integer;
    ap3.all := 10;

    ap1 := ap3;
    --ap1.all := 5;

    echo(integer'image(ap2.all) & LF);
     
    Tricky, Sep 9, 2009
    #2
    1. Advertising

  3. Tricky

    Tricky Guest

    On 9 Sep, 09:47, Alan Fitch <> wrote:
    > Tricky wrote:
    > > the following code works, and Im just making sure that it is garanteed
    > > to work and Im not just hitting some luck that the pointer address has
    > > remained constant this time only. Look at the following code:

    >
    > >   process
    > >      type a_p_t is access integer;

    >
    > >      variable ap1 : a_p_t;
    > >      variable ap2 : a_p_t;
    > >   begin
    > >     ap1 := new integer;
    > >     ap1.all := 1;

    >
    > >     ap2 := ap1;

    >
    > >     DEALLOCATE(ap1);

    >
    > >     ap1 := new integer;
    > >     ap1.all := 5;

    >
    > >     echo(integer'image(ap2.all) & LF);
    > >     wait;
    > >   end process;
    > > ......

    >
    > > I thought that ap2 would hold be a copy of the origional ap1,
    > > therefore when new memory was alocated you couldnt garantee that ap2
    > > would now point to the correct place, and in this case when I run it
    > > Im just lucky ap1 doesnt change when a new integer is created?. or Is
    > > it actually the case that the address will hold valid for ever, and
    > > ap2 will now always point to the value inside ap1.

    >
    > Hi Tricky,
    >    from the VHDL 2002 LRM p47
    >
    > "NOTE—If an access value is copied to a second variable and is then
    > deallocated, the second variable is not set to null
    > and thus references invalid storage."
    >
    > So there is no guarantee that ap2.all will work, as far as I can see.
    > I expect you have just been lucky.
    >
    > > am I correct in thinking, that if I assign ap1 to something else, ap2
    > > then wont work?

    >
    > No I don't think so. I would guess that in your case with your
    > particular simulator it may well carry on working - but that is just
    > luck. You could try it and see!
    >
    > regards
    > Alan
    >
    > --
    > Alan Fitch
    > Senior Consultant
    >
    > Doulos – Developing Design Know-how
    > VHDL * Verilog * SystemVerilog * SystemC * PSL * Perl * Tcl/Tk * Project
    > Services
    >
    > Doulos Ltd. Church Hatch, 22 Marketing Place, Ringwood, Hampshire, BH24
    > 1AW, UK
    > Tel:  + 44 (0)1425 471223               Email:
    > Fax:  +44 (0)1425 471573                http://www.doulos.com
    >
    > ------------------------------------------------------------------------
    >
    > This message may contain personal views which are not the views of
    > Doulos, unless specifically stated.


    Thanks Alan.

    On further messing around, I have seen it break. I have also seen it
    run fine once, and after a restart and run again, the simulator hangs
    (I think because its trying to allocated already leaked memory, and it
    doesnt like it).

    This was all in modelsim. Looks like Im going to have to move into
    pointers to pointers for what I need to do.
     
    Tricky, Sep 9, 2009
    #3
  4. Tricky

    Tricky Guest

    On 9 Sep, 09:57, Tricky <> wrote:
    > On 9 Sep, 09:47, Alan Fitch <> wrote:
    >
    >
    >
    > > Tricky wrote:
    > > > the following code works, and Im just making sure that it is garanteed
    > > > to work and Im not just hitting some luck that the pointer address has
    > > > remained constant this time only. Look at the following code:

    >
    > > >   process
    > > >      type a_p_t is access integer;

    >
    > > >      variable ap1 : a_p_t;
    > > >      variable ap2 : a_p_t;
    > > >   begin
    > > >     ap1 := new integer;
    > > >     ap1.all := 1;

    >
    > > >     ap2 := ap1;

    >
    > > >     DEALLOCATE(ap1);

    >
    > > >     ap1 := new integer;
    > > >     ap1.all := 5;

    >
    > > >     echo(integer'image(ap2.all) & LF);
    > > >     wait;
    > > >   end process;
    > > > ......

    >
    > > > I thought that ap2 would hold be a copy of the origional ap1,
    > > > therefore when new memory was alocated you couldnt garantee that ap2
    > > > would now point to the correct place, and in this case when I run it
    > > > Im just lucky ap1 doesnt change when a new integer is created?. or Is
    > > > it actually the case that the address will hold valid for ever, and
    > > > ap2 will now always point to the value inside ap1.

    >
    > > Hi Tricky,
    > >    from the VHDL 2002 LRM p47

    >
    > > "NOTE—If an access value is copied to a second variable and is then
    > > deallocated, the second variable is not set to null
    > > and thus references invalid storage."

    >
    > > So there is no guarantee that ap2.all will work, as far as I can see.
    > > I expect you have just been lucky.

    >
    > > > am I correct in thinking, that if I assign ap1 to something else, ap2
    > > > then wont work?

    >
    > > No I don't think so. I would guess that in your case with your
    > > particular simulator it may well carry on working - but that is just
    > > luck. You could try it and see!

    >
    > > regards
    > > Alan

    >
    > > --
    > > Alan Fitch
    > > Senior Consultant

    >
    > > Doulos – Developing Design Know-how
    > > VHDL * Verilog * SystemVerilog * SystemC * PSL * Perl * Tcl/Tk * Project
    > > Services

    >
    > > Doulos Ltd. Church Hatch, 22 Marketing Place, Ringwood, Hampshire, BH24
    > > 1AW, UK
    > > Tel:  + 44 (0)1425 471223               Email:
    > > Fax:  +44 (0)1425 471573                http://www.doulos.com

    >
    > > ------------------------------------------------------------------------

    >
    > > This message may contain personal views which are not the views of
    > > Doulos, unless specifically stated.

    >
    > Thanks Alan.
    >
    > On further messing around, I have seen it break. I have also seen it
    > run fine once, and after a restart and run again, the simulator hangs
    > (I think because its trying to allocated already leaked memory, and it
    > doesnt like it).
    >
    > This was all in modelsim. Looks like Im going to have to move into
    > pointers to pointers for what I need to do.


    On this note, am I right in thinking you can only point to new memory,
    not existing memory?
    Therefore, pointers to pointers are impossible?
     
    Tricky, Sep 9, 2009
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Lerp

    Clarification Needed

    Lerp, Aug 17, 2004, in forum: ASP .Net
    Replies:
    3
    Views:
    341
    Edd Connolly
    Aug 18, 2004
  2. =?Utf-8?B?S01aX3N0YXRl?=

    clarification needed: Which layer to validate CSV file?

    =?Utf-8?B?S01aX3N0YXRl?=, Mar 29, 2006, in forum: ASP .Net
    Replies:
    1
    Views:
    398
    sloan
    Mar 29, 2006
  3. Clarification needed

    , May 5, 2006, in forum: HTML
    Replies:
    14
    Views:
    587
    Blinky the Shark
    May 5, 2006
  4. Yao
    Replies:
    1
    Views:
    467
    David N. Welton
    Jun 19, 2006
  5. , India
    Replies:
    2
    Views:
    360
    Andrey Tarasevich
    Feb 21, 2007
Loading...

Share This Page