returned vector of function is zeroized

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Huibuh

    returned vector of function is zeroized

    The following code is a function called from the main. Sence is to
    initialize a vector of the dimension of "a". "b" is the according value (all
    the same in a vector).

    The problem is that the initialization is done the right way (controled by
    the output) but the returned vector is empty - meaning the pointer is
    showing zero.



    vector<int>* initialize (int a, vector<int>* vec, int b)

    {

    vector<int> ve;



    vec=&ve;

    ve.reserve(a);

    for (int i=0; i<=a-1; i++)

    ve[i]=b;

    for (i=0; i<=a-1; i++)

    cout << i << ". value : "

    << ve[i] << endl;

    return vec;

    ve.clear();

    }





    What is wrong???

    I have tried it before without using a pointer - same result!


  • Pete

    #2
    Re: returned vector of function is zeroized

    Huibuh wrote:[color=blue]
    > The following code is a function called from the main. Sence is to
    > initialize a vector of the dimension of "a". "b" is the according
    > value (all the same in a vector).
    >
    > The problem is that the initialization is done the right way
    > (controled by the output) but the returned vector is empty - meaning
    > the pointer is showing zero.
    >
    >
    >
    > vector<int>* initialize (int a, vector<int>* vec, int b)
    >
    > {
    >
    > vector<int> ve;
    >
    >
    >
    > vec=&ve;
    >
    > ve.reserve(a);
    >
    > for (int i=0; i<=a-1; i++)
    >
    > ve[i]=b;
    >
    > for (i=0; i<=a-1; i++)
    >
    > cout << i << ". value : "
    >
    > << ve[i] << endl;
    >
    > return vec;
    >
    > ve.clear();
    >
    > }
    >
    >
    >
    >
    >
    > What is wrong???
    >
    > I have tried it before without using a pointer - same result![/color]

    First, you're returning a address of a local. Also, I'm not sure what you're
    trying to do with "vec", but I'm almost sure it isn't what you want.

    What are you trying to do?

    - Pete


    Comment

    • Pete

      #3
      Re: returned vector of function is zeroized

      Huibuh wrote:[color=blue]
      > The following code is a function called from the main. Sence is to
      > initialize a vector of the dimension of "a". "b" is the according
      > value (all the same in a vector).
      >
      > The problem is that the initialization is done the right way
      > (controled by the output) but the returned vector is empty - meaning
      > the pointer is showing zero.
      >
      >
      >
      > vector<int>* initialize (int a, vector<int>* vec, int b)
      >
      > {
      >
      > vector<int> ve;
      >
      >
      >
      > vec=&ve;
      >
      > ve.reserve(a);
      >
      > for (int i=0; i<=a-1; i++)
      >
      > ve[i]=b;
      >
      > for (i=0; i<=a-1; i++)
      >
      > cout << i << ". value : "
      >
      > << ve[i] << endl;
      >
      > return vec;
      >
      > ve.clear();
      >
      > }
      >
      >
      >
      >
      >
      > What is wrong???
      >
      > I have tried it before without using a pointer - same result![/color]

      First, you're returning a address of a local. Also, I'm not sure what you're
      trying to do with "vec", but I'm almost sure it isn't what you want.

      What are you trying to do?

      - Pete


      Comment

      • Leor Zolman

        #4
        Re: returned vector of function is zeroized

        On Mon, 5 Apr 2004 23:07:44 +0200, "Huibuh" <no.spam@t-online.de> wrote:
        [color=blue]
        >The following code is a function called from the main. Sence is to
        >initialize a vector of the dimension of "a". "b" is the according value (all
        >the same in a vector).
        >
        >The problem is that the initialization is done the right way (controled by
        >the output) but the returned vector is empty - meaning the pointer is
        >showing zero.
        >
        >
        >
        >vector<int>* initialize (int a, vector<int>* vec, int b)
        >
        >{
        >
        > vector<int> ve;
        >
        >
        >
        > vec=&ve;
        >
        > ve.reserve(a);
        >
        > for (int i=0; i<=a-1; i++)
        >
        > ve[i]=b;
        >
        > for (i=0; i<=a-1; i++)
        >
        > cout << i << ". value : "
        >
        > << ve[i] << endl;
        >
        > return vec;
        >
        > ve.clear();
        >
        >}
        >
        >
        >
        >
        >
        >What is wrong???[/color]

        You're creating an entire local vector in your function, setting it up, and
        then it gets destroyed upon exit from the function. How about just
        dispensing with the local vector and using the pointer your function is
        given:

        #include <iostream>
        #include <vector>
        using namespace std;


        vector<int>* initialize (int a, vector<int>* vec, int b)

        {

        //vector<int> ve;

        // vec=&ve;

        vec->reserve(a);

        for (int i=0; i<=a-1; i++)

        (*vec)[i]=b;

        for (i=0; i<=a-1; i++)

        cout << i << ". value : "

        << (*vec)[i] << endl;

        return vec;
        }




        int main()
        {
        vector<int> x;

        vector<int> *vecp = initialize(10, &x, 1000);
        cout << x[0] << " " << x[1] << " " << x[2] << endl;
        return 0;
        }
        [color=blue]
        >
        >I have tried it before without using a pointer - same result![/color]

        Not sure what you mean, but not sure it matters. You /could/ have the
        vector be returned by value, but that would be rather inefficient.
        -leor
        [color=blue]
        >[/color]

        --
        Leor Zolman --- BD Software --- www.bdsoft.com
        On-Site Training in C/C++, Java, Perl and Unix
        C++ users: Download BD Software's free STL Error Message Decryptor at:
        An STL Error Decryptor for C++ by Leor Zolman of BD Software - available to download here

        Comment

        • Leor Zolman

          #5
          Re: returned vector of function is zeroized

          On Mon, 5 Apr 2004 23:07:44 +0200, "Huibuh" <no.spam@t-online.de> wrote:
          [color=blue]
          >The following code is a function called from the main. Sence is to
          >initialize a vector of the dimension of "a". "b" is the according value (all
          >the same in a vector).
          >
          >The problem is that the initialization is done the right way (controled by
          >the output) but the returned vector is empty - meaning the pointer is
          >showing zero.
          >
          >
          >
          >vector<int>* initialize (int a, vector<int>* vec, int b)
          >
          >{
          >
          > vector<int> ve;
          >
          >
          >
          > vec=&ve;
          >
          > ve.reserve(a);
          >
          > for (int i=0; i<=a-1; i++)
          >
          > ve[i]=b;
          >
          > for (i=0; i<=a-1; i++)
          >
          > cout << i << ". value : "
          >
          > << ve[i] << endl;
          >
          > return vec;
          >
          > ve.clear();
          >
          >}
          >
          >
          >
          >
          >
          >What is wrong???[/color]

          You're creating an entire local vector in your function, setting it up, and
          then it gets destroyed upon exit from the function. How about just
          dispensing with the local vector and using the pointer your function is
          given:

          #include <iostream>
          #include <vector>
          using namespace std;


          vector<int>* initialize (int a, vector<int>* vec, int b)

          {

          //vector<int> ve;

          // vec=&ve;

          vec->reserve(a);

          for (int i=0; i<=a-1; i++)

          (*vec)[i]=b;

          for (i=0; i<=a-1; i++)

          cout << i << ". value : "

          << (*vec)[i] << endl;

          return vec;
          }




          int main()
          {
          vector<int> x;

          vector<int> *vecp = initialize(10, &x, 1000);
          cout << x[0] << " " << x[1] << " " << x[2] << endl;
          return 0;
          }
          [color=blue]
          >
          >I have tried it before without using a pointer - same result![/color]

          Not sure what you mean, but not sure it matters. You /could/ have the
          vector be returned by value, but that would be rather inefficient.
          -leor
          [color=blue]
          >[/color]

          --
          Leor Zolman --- BD Software --- www.bdsoft.com
          On-Site Training in C/C++, Java, Perl and Unix
          C++ users: Download BD Software's free STL Error Message Decryptor at:
          An STL Error Decryptor for C++ by Leor Zolman of BD Software - available to download here

          Comment

          • Bill Seurer

            #6
            Re: returned vector of function is zeroized

            Huibuh wrote:
            [color=blue]
            > vector<int> ve;
            > vec=&ve;[/color]

            Ugh! Never return the address of a local variable from a function. You
            should be passing the address of where you want the results (or a
            reference to them) into the function for something like this or
            returning the actual vector if you want a copy of it.
            [color=blue]
            > return vec;
            > ve.clear();[/color]

            Do you ever expect that clear function to be called? If so, how?

            Comment

            • Bill Seurer

              #7
              Re: returned vector of function is zeroized

              Huibuh wrote:
              [color=blue]
              > vector<int> ve;
              > vec=&ve;[/color]

              Ugh! Never return the address of a local variable from a function. You
              should be passing the address of where you want the results (or a
              reference to them) into the function for something like this or
              returning the actual vector if you want a copy of it.
              [color=blue]
              > return vec;
              > ve.clear();[/color]

              Do you ever expect that clear function to be called? If so, how?

              Comment

              • John Harrison

                #8
                Re: returned vector of function is zeroized


                "Huibuh" <no.spam@t-online.de> wrote in message
                news:c4shr0$1mb $06$1@news.t-online.com...[color=blue]
                > The following code is a function called from the main. Sence is to
                > initialize a vector of the dimension of "a". "b" is the according value[/color]
                (all[color=blue]
                > the same in a vector).
                >
                > The problem is that the initialization is done the right way (controled by
                > the output) but the returned vector is empty - meaning the pointer is
                > showing zero.
                >
                >
                >
                > vector<int>* initialize (int a, vector<int>* vec, int b)
                >
                > {
                >
                > vector<int> ve;
                >
                >
                >
                > vec=&ve;
                >
                > ve.reserve(a);
                >
                > for (int i=0; i<=a-1; i++)
                >
                > ve[i]=b;
                >
                > for (i=0; i<=a-1; i++)
                >
                > cout << i << ". value : "
                >
                > << ve[i] << endl;
                >
                > return vec;
                >
                > ve.clear();
                >
                > }
                >
                >
                >
                >
                >
                > What is wrong???
                >
                > I have tried it before without using a pointer - same result!
                >[/color]

                Don't use a pointer, why did you think a pointer would help? They make
                things more complicated not less.

                Also you use reserve wrongly, reserve does NOT change the size of a vector,
                so your code is putting values in a vector with zero size.

                Do it like this

                vector<int> initialize (int a, int b)
                {
                vector<int> ve(a);
                for (int i=0; i<=a-1; i++)
                ve[i]=b;
                return ve;
                }

                Simple really.

                john


                Comment

                • John Harrison

                  #9
                  Re: returned vector of function is zeroized


                  "Huibuh" <no.spam@t-online.de> wrote in message
                  news:c4shr0$1mb $06$1@news.t-online.com...[color=blue]
                  > The following code is a function called from the main. Sence is to
                  > initialize a vector of the dimension of "a". "b" is the according value[/color]
                  (all[color=blue]
                  > the same in a vector).
                  >
                  > The problem is that the initialization is done the right way (controled by
                  > the output) but the returned vector is empty - meaning the pointer is
                  > showing zero.
                  >
                  >
                  >
                  > vector<int>* initialize (int a, vector<int>* vec, int b)
                  >
                  > {
                  >
                  > vector<int> ve;
                  >
                  >
                  >
                  > vec=&ve;
                  >
                  > ve.reserve(a);
                  >
                  > for (int i=0; i<=a-1; i++)
                  >
                  > ve[i]=b;
                  >
                  > for (i=0; i<=a-1; i++)
                  >
                  > cout << i << ". value : "
                  >
                  > << ve[i] << endl;
                  >
                  > return vec;
                  >
                  > ve.clear();
                  >
                  > }
                  >
                  >
                  >
                  >
                  >
                  > What is wrong???
                  >
                  > I have tried it before without using a pointer - same result!
                  >[/color]

                  Don't use a pointer, why did you think a pointer would help? They make
                  things more complicated not less.

                  Also you use reserve wrongly, reserve does NOT change the size of a vector,
                  so your code is putting values in a vector with zero size.

                  Do it like this

                  vector<int> initialize (int a, int b)
                  {
                  vector<int> ve(a);
                  for (int i=0; i<=a-1; i++)
                  ve[i]=b;
                  return ve;
                  }

                  Simple really.

                  john


                  Comment

                  • Huibuh

                    #10
                    Re: returned vector of function is zeroized

                    Thanks to all of you, your help was very appreciated and I finally was
                    successful. But now I have a similar problem with RETURN correlated with a
                    pointer. If you are interested please see my threat

                    pointer return: address correct / value nonesense

                    Happy eastern



                    Comment

                    • Huibuh

                      #11
                      Re: returned vector of function is zeroized

                      Thanks to all of you, your help was very appreciated and I finally was
                      successful. But now I have a similar problem with RETURN correlated with a
                      pointer. If you are interested please see my threat

                      pointer return: address correct / value nonesense

                      Happy eastern



                      Comment

                      Working...