BaselAla Ответов: 2

Почему ошибка sagemention в этом коде ?


int test_polygon(struct Polygon* poly, struct Pointf target)    //  mathematical algorithm to know whether the point is inside the polygon.
{
    int  i, j, c=0;           // new variables will be used in the next for loop.


    for (i =0,j=poly->nvert-1 ; i < poly->nvert ; j = i++)       // for (i=0,j=Number of vertices-1 ; i < Number of vertices ; j=i++)
    {
        if ((( poly->p[i].y > target.y) != (poly->p[j].y > target.y)) &&            //poly.p[i].y is y-coordinate of the polygon's vertices.
                (target.x < (poly->p[j].x - poly->p[i].x) * (target.y - poly->p[i].y) /     //poly.p[i].x is x-coordinate of the polygon's vertices.
                 (poly->p[j].y - poly->p[i].y) + poly->p[i].x))
            c = !c;
    }
    return c;
}


Что я уже пробовал:

я изменил структуру на указатели , но у меня есть та же ошибка sagemention.

2 Ответов

Рейтинг:
16

Jochen Arndt

На этот вопрос нельзя ответить, не зная самого главного. Polygon структура и способ инициализации переданной структуры.

Возможными источниками могут быть


  • То poly параметр-это недопустимый указатель
  • poly->p является недопустимым указателем
  • poly->nvert is <= 0
  • poly->p это массив, размер которого меньше, чем poly->nvert

Вы можете добавить проверки отладки сборки для проверки нулевых указателей и параметров вне диапазона:
/* NOTE: NDEBUG must not be defined to execute assert statements */
#include <assert.h>

int test_polygon(struct Polygon* poly, struct Pointf target)
{
    assert(poly != NULL);
    assert(poly->p != NULL);
    assert(poly->nvert > 0);
    /* EDIT: After knowing the struct Polygon uses a fixed size p array */
    assert(poly->nvert < sizeof(poly->p) / sizeof(poly->p[0]));
    
    /* ... */
}


Рейтинг:
0

sompost

Индексы i и j по-видимому, остаются в пределах, заданных poly->nvert Следовательно, единственная возможная причина ошибки, которую я вижу, заключается в этом...

любой poly не указывает на допустимый полигональный объект (неинициализированная переменная, удаленный объект, ...)

или точечный массив p неправильно распределяется (слишком коротко, т. е. меньше, чем nvert утварь).

Возможно, вы разместите какой-то код, показывающий, как это сделать test_polygon вызывается, в частности, какие параметры передаются-предпочтительно вызов, который завершается ошибкой сегментации.