Yes you're right about casting between "in" and "input_items", however, I
think this problem is somehow related to the large number input ports! I
don't why!

Here is the whole block:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "phich_grouping_impl.h"

int N_FS_phich(bool normal_cp){
    if(normal_cp)
        return 8;
    else
        return 4;
}

namespace gr {
  namespace my {

    phich_grouping::sptr
    phich_grouping::make(bool normal_cp, int N_phich_group)
    {
      return gnuradio::get_initial_sptr
        (new phich_grouping_impl(normal_cp, N_phich_group));
    }

    /*
     * The private constructor
     */
    phich_grouping_impl::phich_grouping_impl(bool normal_cp, int
N_phich_group)
      : gr::block("phich_grouping",
                  gr::io_signature::make(N_phich_group *
N_FS_phich(normal_cp), N_phich_group * N_FS_phich(normal_cp) ,
sizeof(gr_complex)),
              gr::io_signature::make(1, 1, sizeof(gr_complex))),
      d_normal_cp(normal_cp),
      d_N_phich_group(N_phich_group)
    {
        set_tag_propagation_policy(TPP_DONT);

    }

    /*
     * Our virtual destructor.
     */
    phich_grouping_impl::~phich_grouping_impl()
    {
    }

    void
    phich_grouping_impl::forecast (int noutput_items, gr_vector_int
&ninput_items_required)
    {
        for (int i=0; i<d_N_phich_group * N_FS_phich(d_normal_cp); i++)
        {
            ninput_items_required[i] = 12;
        }
    }

    int
    phich_grouping_impl::general_work (int noutput_items,
                       gr_vector_int &ninput_items,
                       gr_vector_const_void_star &input_items,
                       gr_vector_void_star &output_items)
    {
        const gr_complex *in[d_N_phich_group * N_FS_phich(d_normal_cp)];
        gr_complex *out = (gr_complex *) output_items[0];
//        in = (const gr_complex *) input_items;

        cout << "n input   " << input_items.size() << endl;
        int phich_in_len[d_N_phich_group];

        int x = 0;
        for (int i=0; i<d_N_phich_group * N_FS_phich(d_normal_cp); i++)
        {
            in[i] = (const gr_complex *) input_items[i];

            // reading tags
            vector<tag_t> tag_len;
            get_tags_in_window(tag_len,
                               0,
                               0,
                               ninput_items[0],
                               pmt::string_to_symbol("length"));
            if(tag_len.size()>0)
            {
                phich_in_len[i] = pmt::to_long(tag_len[0].value);
                x++;
            }

        }

        gr_complex y_p[d_N_phich_group][12];
        gr_complex y__p_tilt[d_N_phich_group/2][12];

//        cout << "\tin[0][0]  "<<in[0][0] << endl;

        if (x == d_N_phich_group * N_FS_phich(d_normal_cp)) // x ==
d_N_phich_group) is for checking all the input tags are read
        {
            // grouping ...
            for (int i=0; i<d_N_phich_group ;i++)
            {
                for (int k=0; k<phich_in_len[i]; k++)
                {
                    y_p[i][k] = 0;
                    for (int j=0; j<N_FS_phich(d_normal_cp); j++)
                    {
                        y_p[i][k] = y_p[i][k] + in[i*8+j][k];
                    }
                }

            }

            ........
.......
...........


            // adding tag
            add_item_tag(0,
                         nitems_written(0),
                         pmt::string_to_symbol("length"),
                         pmt::from_long(12));

            cout << "PHICH grouping" << endl;

            consume_each(12);

        }
        else
        {   // if tags didn't read
            produce(0, 0);
            consume_each(0);
        }


        return WORK_CALLED_PRODUCE;
    }

  } /* namespace my */
} /* namespace gr */


Input to this block is a random source and its output is a file sink. I
would be glad to see the comments on the code to improve it also finding
the problem.

Best,
Mostafa Alizadeh



On Sun, Jul 27, 2014 at 10:10 PM, Marcus Müller <marcus.muel...@ettus.com>
wrote:

> As I said, you should use the gdb debugging approach to find the mistake.
> gr_complex **in = (gr_complex) input_items; shouldn't compile, because
> the types are incompatible.
>
> I can't help you any further with the information you're offering.
> Please share at least your complete general_work method, and the methods
> that you use to calculate the input numbers. I stand by my opininion
> that beauty lies in simplicity. If you want to make sure you don't do
> more "for" iterations than you have inputs, iterate over the number of
> inputs (input_items.size()) and not something you calculate yourself.
> That's the simple approach of eliminating error sources.
>
> Also, you're using a gr::block. If you play around with the forecast
> method, you might trigger situations where you are asked to produce a
> number of output items on different output streams, and have zero input
> items on some input streams; I don't see you check for that in the code
> excerpt you were sharing.
> Again, it isn't very useful to share only a portion of your block,
> especially when you are very sure yourself that this portion is correct,
> if you want help identifying what goes wrong.
>
> With best regards,
> Marcus Müller
>
> On 27.07.2014 19:21, Mostafa Alizadeh wrote:
> > Thank you for your notes Marcus,
> >
> > As you said this is unnecessary process to point to the input_items in a
> > for loop!!
> > However, this is not the problem because I checked that I have the same
> > number of iteration in the for loop as the number of input ports.
> >
> > The problem is somewhere else. *Again I must mention that if I use, only
> 8
> > input ports, the code runs perfectly,* however, with 24 inputs, it does
> > something wrong! (perhaps pointing to somewhere in the memory which is
> not
> > allocated to the input as it seemed to allocated to the input!). In
> another
> > words, when I want to access the first input of the first input port, I
> can
> > write:
> >
> > gr_complex **in = (gr_complex) input_items;
> >
> > // for example
> > cout << in[0][0] << endl;
> >
> >
> > The program terminated with unexpected error!
> >
> > Please help me, where is the problem?? :(
> >
> >
> >
> >
> > On Sun, Jul 27, 2014 at 4:21 AM, Marcus Müller <marcus.muel...@ettus.com
> >
> > wrote:
> >
> >> Having your complete general_work function wouldn't have hurt my
> >> understanding much...
> >>
> >> I really can't make out what you're trying to do without doubt.
> >>
> >> Anyway, from the code below I think "in" *must at least* have the same
> >> number of entries that your for loop has iterations; did you just try
> using
> >>
> >> d_group * N_FS(d_normal) instead of d_N_phich_group *
> >> N_FS_phich(d_normal_cp) when allocating your array?
> >> It seems to me that having two ways to determine how many inputs there
> is
> >> a likely cause for mistake. Use the size() of the input_items to
> determine
> >> how many inputs you really have, and assert(input_items.size() ==
> >> number_of_inputs_like_I_calculate_it); to make sure things line up.
> >>
> >> Also, the whole process seems unnecessary, since you do nothing more
> than
> >> copying the pointers from input_items to in; the typecast is nothing but
> >> syntactic magic and can be done by having "in = ((const gr_complex*)*)
> >> input_items;"; also, I encourage you to use the C++-style explicit cast
> >> operators (in this case, reinterpret_cast<>) for their clarity, but
> that's
> >> more a question of personal liking :)
> >>
> >> Greetings,
> >> Marcus
> >>
> >> On 26.07.2014 21:55, Mostafa Alizadeh wrote:
> >>> Hi Marcus,
> >>>
> >>> You're right. I didn't clarify the problem.
> >>>
> >>> Actually in C++, I wrote:
> >>>
> >>> block_impl::block_impl(bool normal, int group)
> >>>       : gr::block("phich_grouping",
> >>>                   gr::io_signature::make(1, group * N_FS(normal),
> sizeof
> >>> (gr_complex)),
> >>>               gr::io_signature::make(1, 1, sizeof(gr_complex))),
> >>>
> >>> // N_FS function returns 8 or 4 depends on its input.
> >>> // in the work function :
> >>> // d_normal and d_group are defined in the .h file
> >>>
> >>>
> >>> const gr_complex *in[d_N_phich_group * N_FS_phich(d_normal_cp)];
> >>> for (int i=0; i<d_group * N_FS(d_normal); i++)
> >>>         {
> >>>             in[i] = (const gr_complex *) input_items[i];
> >>> }
> >>>
> >>>
> >>> when I set the "group" value to 3, the number of input ports would be
> 24.
> >>> In this case, I want to access to one element of "in" like this:
> >>>
> >>> cout << " in " << in[0][0] << endl;
> >>>
> >>> I got the aforementioned error!
> >>>
> >>> But when I set "group = 1" which means 8 input ports, all things are
> >> fine.
> >>>
> >>> any idea please,
> >>>
> >>> Best
> >>>
> >>
>
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to