Boost logo

Boost :

Subject: Re: [boost] [parameter] Boost.Graph program not responding at run-time
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-12-03 17:06:07


On Sat, Dec 3, 2011 at 4:14 PM, Jeremiah Willcock <jewillco_at_[hidden]> wrote:
> On Sat, 3 Dec 2011, Lorenzo Caminiti wrote:
>
>> On Sat, Dec 3, 2011 at 3:16 PM, Jeremiah Willcock <jewillco_at_[hidden]>
>> wrote:
>>>
>>> On Sat, 3 Dec 2011, Lorenzo Caminiti wrote:
>>>
>>>> On Sat, Dec 3, 2011 at 2:28 PM, Jeremiah Willcock <jewillco_at_[hidden]>
>>>> wrote:
>>>>>
>>>>>
>>>>> On Sat, 3 Dec 2011, Lorenzo Caminiti wrote:
>>>>>>
>>>>>>
>>>>>> If I move the call to boost::depth_first_search into a template
>>>>>> depth_first_search_impl and out of the Boost.Parameter function body,
>>>>>> the code compiles (both MSVC and GCC with latest Boost from trunk) but
>>>>>> the executable runs forever and prints nothing to cout... What am I
>>>>>> doing wrong?
>>>>>
>>>>>
>>>>>
>>>>> I tried your code with GCC 4.6.0 and it worked just fine as you pasted
>>>>> it
>>>>> below.  I get:
>>>>>
>>>>> order of discovery: u v y x w z
>>>>> order of finish: x y v u z w
>>>>>
>>>>> as the result.  You are returning an invalid pointer from
>>>>> default_color_map(), though; &colors[0] becomes invalid when colors is
>>>>> destroyed at the end of the function.
>>>>
>>>>
>>>>
>>>> Oops... thanks, that was actually the issue, after I fixed the invalid
>>>> pointer the code runs fine.
>>>>
>>>> BTW, what's the best way to generate a default_color_map for
>>>> Boost.Graph like the one below?
>>>
>>>
>>>
>>> Probably the simplest is to use shared_array_property_map; you can return
>>> those from functions as shallow copies.  If you write the default code in
>>
>>
>> Something like this? But this gives me again the run-time error...
>>
>> template< typename Size, typename IndexMap >
>> boost::iterator_property_map<boost::default_color_type*, IndexMap,
>>       boost::default_color_type, boost::default_color_type&>
>> default_color_map ( Size const& num_vertices, IndexMap const& index_map )
>> {
>>   boost::shared_array_property_map<boost::default_color_type,
>>           IndexMap> colors(num_vertices, index_map);
>>   return &colors[0];
>> }
>
>
> You don't return the iterator_property_map here; you return the
> shared_array_property_map itself as the result of the function.

Yes, this works:

template< typename Size, typename IndexMap >
boost::shared_array_property_map<boost::default_color_type, IndexMap>
default_color_map ( Size const& num_vertices, IndexMap const& index_map )
{
    return boost::make_shared_array_property_map(num_vertices,
            boost::default_color_type(), index_map);
}

Thanks a lot.
--Lorenzo


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk