[vtkusers] Segmentation fault

elena bresciani elena.bresciani87 at gmail.com
Wed Apr 9 05:26:48 EDT 2014


yeah, now it works. I was focusing on pointers and memory management issues
and I really didn't notice what something was missing.

Thank you VERY much guys!

Cheers
Elena


2014-04-08 15:29 GMT+02:00 Goodwin Lawlor <goodwin.lawlor.lists at gmail.com>:

> Hi Elena,
>
> You code worked fine when
>
>  - vtkFloatArray is used to down cast (on win32)
>  - the input has normals. (as Bill asked)
>
> I reproduced your bug when the input dataset didn't have normals... insert
> a vtkPolyDataNormals filter into your code to check this out.
>
> Goodwin
>
>
> On Tue, Apr 8, 2014 at 2:12 PM, Bill Lorensen <bill.lorensen at gmail.com>wrote:
>
>> Are you certain that the input file has Normals?
>> On Apr 8, 2014 8:33 AM, "elena bresciani" <elena.bresciani87 at gmail.com>
>> wrote:
>>
>>> Here it is, I omitted the inclusion of the header files and the output
>>> section
>>>
>>>
>>>
>>> int main ( int argc, char *argv[] )
>>> {
>>>
>>>     std::string filename = argv[1];
>>>
>>>     // Read data from the file
>>>     vtkSmartPointer<vtkXMLPolyDataReader> reader =
>>> vtkSmartPointer<vtkXMLPolyDataReader>::New();
>>>     reader->SetFileName(filename.c_str());
>>>     reader->Update();
>>>
>>>     // polydata object
>>>     vtkSmartPointer<vtkPolyData> polydata = reader->GetOutput();
>>>
>>>     // get normals
>>>     vtkDoubleArray *pointNormalsArray = vtkDoubleArray::SafeDownCast
>>> (polydata->GetPointData()->GetNormals());
>>>
>>>
>>>     vtkSmartPointer<vtkPolyData> newpolydata =
>>> vtkSmartPointer<vtkPolyData>::New();
>>>     vtkSmartPointer<vtkPoints> newPoints =
>>> vtkSmartPointer<vtkPoints>::New();
>>>
>>>     // for every point p1 in the polydata find the point p2 which lies
>>> on the normal at a distance D from p1
>>>
>>>     for(vtkIdType i = 0; i < pointNormalsArray->GetNumberOfTuples();
>>> i++)
>>>
>>>        {
>>>             double p1[3];
>>>             polydata->GetPoint(i,p1); //prendo il punto
>>>
>>>             double pN[3];
>>>             pointNormalsArray->GetTuple(i, pN);
>>>
>>>             double p2[3];
>>>             double D=2*atoi(argv[3]);
>>>             p2[0]=p1[0]-pN[0]*D;
>>>             p2[1]=p1[1]-pN[1]*D;
>>>             p2[2]=p1[2]-pN[2]*D;
>>>
>>>
>>>             vtkIdType pid[1];
>>>             pid[0]=newPoints->InsertNextPoint(p2);
>>>
>>>         }
>>>
>>>         //set points to polydata
>>>         newpolydata->SetPoints(newPoints);
>>>
>>>     return EXIT_SUCCESS;
>>> }
>>>
>>>
>>> 2014-04-08 13:58 GMT+02:00 Bill Lorensen <bill.lorensen at gmail.com>:
>>>
>>>> Please post a small, complete, compilable example that illustrates your
>>>> problem.
>>>>
>>>> On Tue, Apr 8, 2014 at 3:19 AM, elena bresciani
>>>> <elena.bresciani87 at gmail.com> wrote:
>>>> > Thank you guys,
>>>> >
>>>> > I tried changing the type of PointNormalArray in vtkDoubleArray
>>>> >
>>>> > vtkDoubleArray *PointNormalArray = vtkDoubleArray::SafeDownCast(
>>>> > polydata->GetPointData()->GetNormals() ) ;
>>>> >
>>>> > but I still have the segfault.
>>>> >
>>>> > Elena
>>>> >
>>>> >
>>>> > 2014-04-07 19:31 GMT+02:00 Goodwin Lawlor <
>>>> goodwin.lawlor.lists at gmail.com>:
>>>> >
>>>> >> Thanks for that link Shawn and setting me straight (I did day I
>>>> could be
>>>> >> wrong ;-))
>>>> >>
>>>> >> My logic was that if you had to do:
>>>> >>
>>>> >> vtkSmartPointer<vtkPolyData> polydata =
>>>> >> vtkSmartPointer<vtkPolyData>::New();
>>>> >>
>>>> >> then initializing a smart pointer not created with the form on the
>>>> RHS
>>>> >> above wouldn't work...
>>>> >>
>>>> >> Goodwin
>>>> >>
>>>> >>
>>>> >> On Mon, Apr 7, 2014 at 6:17 PM, Shawn Waldon <swaldon at cs.unc.edu>
>>>> wrote:
>>>> >>>
>>>> >>> Hi Goodwin,
>>>> >>>
>>>> >>> It shouldn't be causing the segfault.  That line will create a new
>>>> smart
>>>> >>> pointer and set its internal pointer to the reader's output,
>>>> incrementing
>>>> >>> the reference count.
>>>> >>> See
>>>> >>>
>>>> http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers#Getting_an_Object_with_a_Smart_Pointer
>>>> >>> for details.  If the reference increment is unnecessary, then it is
>>>> still
>>>> >>> only a small performance gain and not a segfault causing bug.
>>>> >>>
>>>> >>> My guess for the segfault is what Bill said: the normals are in a
>>>> >>> vtkDoubleArray not a vtkFloatArray so SafeDownCast is returning
>>>> NULL.
>>>> >>>
>>>> >>> HTH,
>>>> >>>
>>>> >>> Shawn
>>>> >>>
>>>> >>>
>>>> >>> On Mon, Apr 7, 2014 at 1:11 PM, Goodwin Lawlor
>>>> >>> <goodwin.lawlor.lists at gmail.com> wrote:
>>>> >>>>
>>>> >>>> Hi Elena,
>>>> >>>>
>>>> >>>> I coud be wrong but I dont think this is correct:
>>>> >>>>
>>>> >>>>> vtkSmartPointer<vtkPolyData> polydata = reader->GetOutput();
>>>> >>>>
>>>> >>>>
>>>> >>>> reader->GetOutput() returns a regular pointer to a vtkPolydata not
>>>> a
>>>> >>>> smart pointer.
>>>> >>>>
>>>> >>>> Try:
>>>> >>>>
>>>> >>>> vtkPolyData *polydata = reader->GetOutput();
>>>> >>>>
>>>> >>>> instead.
>>>> >>>>
>>>> >>>> hth
>>>> >>>>
>>>> >>>> Goodwin
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> On Mon, Apr 7, 2014 at 4:00 PM, elena bresciani
>>>> >>>> <elena.bresciani87 at gmail.com> wrote:
>>>> >>>>>
>>>> >>>>> Hello everybody!
>>>> >>>>>
>>>> >>>>> I need your help with a segmentation fault error.
>>>> >>>>> Using gdb I understood where it is generated but I don't know how
>>>> to
>>>> >>>>> modify the code to make it run.
>>>> >>>>>
>>>> >>>>> Here's the portion of the code that I'm talking about:
>>>> >>>>>
>>>> >>>>>
>>>> >>>>> vtkSmartPointer<vtkPolyData> polydata = reader->GetOutput();
>>>> >>>>> (the reader is a vtkXMLPolyDataReader)
>>>> >>>>>
>>>> >>>>> vtkFloatArray *PointNormalArray = vtkFloatArray::SafeDownCast(
>>>> >>>>> polydata->GetPointData()->GetNormals() ) ;
>>>> >>>>>
>>>> >>>>> for(vtkIdType i = 0; i < PointNormalArray->GetNumberOfTuples();
>>>> i++)
>>>> >>>>> {....}
>>>> >>>>>
>>>> >>>>> everytime I call GetNumberOfTuples I have this error so I think
>>>> the
>>>> >>>>> problem is on PointNormalArray.
>>>> >>>>>
>>>> >>>>> Can somebody help me?
>>>> >>>>>
>>>> >>>>> Thanks in advance
>>>> >>>>>
>>>> >>>>> Elena
>>>> >>>>>
>>>> >>>>> _______________________________________________
>>>> >>>>> Powered by www.kitware.com
>>>> >>>>>
>>>> >>>>> Visit other Kitware open-source projects at
>>>> >>>>> http://www.kitware.com/opensource/opensource.html
>>>> >>>>>
>>>> >>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>> >>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>> >>>>>
>>>> >>>>> Follow this link to subscribe/unsubscribe:
>>>> >>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>> >>>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> _______________________________________________
>>>> >>>> Powered by www.kitware.com
>>>> >>>>
>>>> >>>> Visit other Kitware open-source projects at
>>>> >>>> http://www.kitware.com/opensource/opensource.html
>>>> >>>>
>>>> >>>> Please keep messages on-topic and check the VTK FAQ at:
>>>> >>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>> >>>>
>>>> >>>> Follow this link to subscribe/unsubscribe:
>>>> >>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>> >>>>
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>> --
>>>> >>> Shawn Waldon
>>>> >>> Graduate Research Assistant
>>>> >>> Department of Computer Science
>>>> >>> University of North Carolina at Chapel Hill
>>>> >>> swaldon at cs.unc.edu
>>>> >>
>>>> >>
>>>> >
>>>> >
>>>> > _______________________________________________
>>>> > Powered by www.kitware.com
>>>> >
>>>> > Visit other Kitware open-source projects at
>>>> > http://www.kitware.com/opensource/opensource.html
>>>> >
>>>> > Please keep messages on-topic and check the VTK FAQ at:
>>>> > http://www.vtk.org/Wiki/VTK_FAQ
>>>> >
>>>> > Follow this link to subscribe/unsubscribe:
>>>> > http://www.vtk.org/mailman/listinfo/vtkusers
>>>> >
>>>>
>>>>
>>>>
>>>> --
>>>> Unpaid intern in BillsBasement at noware dot com
>>>>
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20140409/fd9a0169/attachment.html>


More information about the vtkusers mailing list