Welcome to the Linux Foundation Forum!

c++ , python -- seg fault , I miss something

using Swig - getting segmentation fault.

but not all the time. I thought i had it working until i change my list.

my c++ version works fine. so must have to do with python api ,

something i misunderstood or forgot.

my Qsort.cpp

// QuickSort
// written in c++

#include <iostream>
#include "/usr/include/python2.5/Python.h"
#include "Qsort.hpp"

int count = 0;

void Swap( PyObject *array , int a , int b )
{
count++;
PyObject *c = PyList_GetItem(array , a);
PyObject *d = PyList_GetItem(array , b);

if (PyList_SetItem(array , a , d ))
{ std::cout << "Failed" << std::endl; }
if (PyList_SetItem(array , b , c ))
{ std::cout << "Failed" << std::endl; }

}


int Partition( PyObject *array , int left , int right , int pivot)
{
PyObject *checkvalue , *pivotvalue;
pivotvalue = PyList_GetItem(array , pivot);
Swap ( array , pivot , right );
int storeindex = left;
for ( int i = left; i < right; i++ )
{
checkvalue = PyList_GetItem(array , i);
if ( PyObject_RichCompareBool( checkvalue , pivotvalue , Py_LE ) )
{
Swap ( array , i , storeindex );
storeindex++;
}
}
Swap ( array , storeindex , right );
return storeindex;
}

void Quicksort ( PyObject *array , int left , int right )
{
int pivot;
if ( right > left )
{
pivot = (left + right) / 2;
pivot = Partition( array , left , right , pivot );
Quicksort( array , left , pivot - 1 );
Quicksort( array , pivot + 1 , right );
}
}

PyObject *Qsort ( PyObject *List )
{
int List_size;
List_size = PyList_Size( List );
Quicksort( List , 0 , List_size-1 );
std::cout << count << std::endl;
return List;
}

my Qsort.hpp

#ifndef QSORT_PY
#define QSORT_PY

PyObject *Qsort ( PyObject *List );

#endif


my Qsort.i

/* Qsort C++ , Python */

%module Qsort

%{
#define SWIG_FILE_WITH_INIT
#include "Qsort.hpp"
%}

PyObject *Qsort ( PyObject *List );


my python make file

import commands

print commands.getstatusoutput( 'swig -c++ -python Qsort.i' )
print commands.getstatusoutput( 'g++ -O2 -fPIC -c Qsort.cpp' )
print commands.getstatusoutput( 'g++ -O2 -fPIC -c Qsort_wrap.cxx -I/usr/include/python2.5' )
print commands.getstatusoutput( 'g++ -shared Qsort.o Qsort_wrap.o -o _Qsort.so' )

Comments

  • Posts: 43
    figure my segmentation fault is from reference in python.
    Now i trying to figure out how to use them.
    1. void Swap( PyObject *array , int a , int b )
    2. {
    3. count++;
    4. PyObject *c = PyList_GetItem(array , a);
    5. PyObject *d = PyList_GetItem(array , b);
    6. Py_XINCREF(c); Py_XINCREF(d); // had to made them there own reference ?
    7. if (PyList_SetItem(array , a , d ))
    8. { std::cout << "Failed" << std::endl; }
    9. if (PyList_SetItem(array , b , c ))
    10. { std::cout << "Failed" << std::endl; }
    11. }

    Trying to figure out which one to use and where and why ?
    Py_DECREF , Py_INCREF , Py_XDECREF , Py_XINCREF

    Seems like i fix it. But not 100% sure.

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Categories

Upcoming Training