---------- Forwarded message ----------
From: Mostafa Alizadeh <m.alizade...@gmail.com>
Date: Mon, Jul 28, 2014 at 7:21 PM
Subject: Re: [Discuss-gnuradio] Problem with large number of inputs.
To: Activecat <active...@gmail.com>


Dear Activecat,

I run the whole GNURadio C++ codes in Qtcreator without any problem by
adding these lines to its .pro file:

LIBS += /usr/lib/libboost_signals.so\

/usr/lib/libboost_signals.so.1.48.0\

/usr/lib/libboost_system-mt.so\

/usr/lib/libboost_system.so\

/usr/lib/libboost_system.so.1.48.0\

/usr/lib/libboost_thread-mt.so\

/usr/lib/libboost_thread.so\

/usr/lib/libboost_thread.so.1.48.0\

/usr/lib/libboost_timer-mt.so\

/usr/lib/libboost_timer.so\

-L/usr/local/lib -lgnuradio-audio -lgnuradio-runtime -lgnuradio-pmt
-lgnuradio-blocks -lgnuradio-filter

LIBS+= -L/usr/local/lib -lgnuradio-analog -lgnuradio-runtime
-lgnuradio-pmt -lgnuradio-audio -lgnuradio-blocks -lgnuradio-filter

LIBS+=-lboost_system -lboost_thread-mt -lboost_thread
-lboost_filesystem-mt -lboost_filesystem -lgnuradio-qtgui
-lgnuradio-fft


LIBS += -lfftw3f -lfftw3   \




I didn't reveal the big picture because I thought I doesn't help to
figure out the problem :)


I finally found the problem! That was so hard to me to do so! I
suddenly recognized that the proceeding block which is connected to
input ports of this block , have a problem and that is, I set the item
sizes of the previous blocks output as gr_complex  but in its work
function I set the pointer to the ouput_items  as  "byte" instead of
gr_complex!!!


Anyway, I have to thank all of you following my questions sincerely.


Best,

Mostafa




On Mon, Jul 28, 2014 at 8:46 AM, Activecat <active...@gmail.com> wrote:

> Mostafa,
>
> I do not think you have truly run the complete codes using Qtcreator,
> because that doesn't have a gnuradio runtime (the scheduler).
> At the other hand, your problem sounds more like a c++ coding error rather
> than gnuradio-specific.
> The helpful approach is
>
> 1).  Put up the OOT into github.
>       This should be the simplest but complete OOT.
>
> 2).  Provide a big picture of what you try to accomplish.
>       From experience many amateur programmers write codes wrong from the
> ground up, and yet expect others to troubleshoot.
>       When this happens, the only way to help is to start with the big
> picture of what you wish to accomplish.
>
> From previous experience you refused to reveal the big picture but
> emphasize others to look at your existing buggy codes.
> Please be reminded that this is an open forum and nobody get paid for
> helping you.
>
>
> On Mon, Jul 28, 2014 at 7:39 AM, Mostafa Alizadeh <m.alizade...@gmail.com>
> wrote:
>
>> I forgot to say, I'm using Qtcreator to debug my GNURadio codes I do not
>> need any others!
>>
>>  The prgram is terminated at line in which I read from the input for the
>> first time i.e. :
>>
>> 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];
>>                     }
>>
>> Best,
>>
>>
>> On Mon, Jul 28, 2014 at 4:05 AM, Mostafa Alizadeh <m.alizade...@gmail.com
>> > wrote:
>>
>>> 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
>>
>>
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to