python获取分段错误:在OS 10.13上为11

时间:2018-10-26 02:38:57

标签: python-3.x macos segmentation-fault virtualenv

我的Mac 10.13.6出现public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); IList<CapturedResultModel> CapturedResults = new List< CapturedResultModel >{ new CapturedResultModel { ResultImagePath = "Images1" }, new CapturedResultModel { ResultImagePath = "Images2"}, new CapturedResultModel { ResultImagePath = "Images1" } }; CaptureResultScrollView CapturedResultScrollView = new CaptureResultScrollView(); CapturedResultScrollView.Frame = new CGRect(15, 40, View.Frame.Size.Width - 30, View.Frame.Size.Height-80); CapturedResultScrollView.Setup(CapturedResults); Add(CapturedResultScrollView); } 错误

我正在使用Python 3.6.5 Anaconda运行virtualenv

我正在运行像素填充脚本

Segmentation fault: 11

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我认为问题在于您的代码正在递归地调用自身而没有上一个函数结束,从而导致函数的副本数量越来越多地停留在堆栈上,直到内存用完(这会触发分段错误)。每次Python调用一个新函数并将其放置在堆栈上时,都会创建一个堆栈框架,该堆栈框架会占用一些内存,即使您没有在该函数调用中创建任何新对象也是如此。当函数返回时,python中的垃圾回收器释放了内存,但是如果图像中有很多值为0的值,那么您可以得到很多{{1}的副本一次运行。这有点古老,而且非常深入和技术性,但是如果您想了解更多,请this is a good discussion

要查看使用活动节点列表解决问题的替代方法,请在此处查看:

https://rosettacode.org/wiki/Bitmap/Flood_fill#Python

顺便说一句,您还有另一个可能是故意的问题,因为您的代码将图像视为球形,即当它碰到边界时,它将跳到图像的另一侧并在那里填充。这是因为python支持负索引,所以当floodfill跳到x=0时,您正在查看的索引x-1是数组中的最后一个索引。要解决此问题,您可以添加一些检查:

-1

尽管如此,您的代码通常可以正常工作。如果您以一个小的玩具示例进行尝试,则可以看到它的实际效果(这是上述修复方法):

if x > 0:  # left
    floodfill(x - 1, y, oldColor, newColor)  # left

if y > 0:  # up
    floodfill(x, y - 1, oldColor, newColor)  # up

if x < surface.shape[0] - 1:  # right
    floodfill(x + 1, y, oldColor, newColor)  # right

if y < surface.shape[1] - 1:  # down
    floodfill(x, y + 1, oldColor, newColor)  # down

enter image description here

答案 1 :(得分:2)

这里有一个选项,可供有兴趣的人在不递归的情况下执行相同的操作。来自http://inventwithpython.com/blog/2011/08/11/recursion-explained-with-the-flood-fill-algorithm-and-zombies-and-cats/

 DB::transaction(function() use ($patient, $scales) {
   $patient = $patient->save(); //Patient Exists First
   Patient::find($patient->id)->scales()->save($scales)
 });