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