Passing Arrays (maybe lists) from Python to C

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Fizzics
    New Member
    • Nov 2008
    • 5

    Passing Arrays (maybe lists) from Python to C

    This is my first post here at Bytes. I have been trolling it, mostly with the help of Google searches, for some time now. I have done about all of the searching and reading that I really know how to do, but because I can't seem to locate something that is even close... I am posting... I would like to thank this community, I have received a great deal of help already.

    Background: I have a pre-existing C code, that I have written, which works. The only problem with it is it is slow. I have decided to rewrite the two control functions from C to python. I have succeeded in getting most everything set up, but I am having trouble with, what seems to me, very simple things.

    In my C code I declare all of my arrays, I do most everything in arrays, up front, and I have preserved that in my Python. I am using c_types and numpy.

    Here are some of my array declarations:
    Code:
    pop_size = gens = ... = c_int
    rank = (c_int * 500)()
    ...
    p1_chromo = p2_chromo = ... = (c_float * 500)()
    population = []
    The "population " array needs to be a 2D array and is initialized like this:
    Code:
    for i in range(pop_size)
         population.append([])
         for j in range(n)
             population[i].append(0.0)
    I am initializing it this way, because if I used the numpy function "zeros" to return a 2D array full of zeros I had trouble passing it.

    Then I go on down and I do various things to the population and all seems to work well. Then i need to pass PART of my 2D population array to a C function.
    it looks like this:
    Code:
    encode(n,population[x1], population[x2], p1_chromo, p2_chromo)
    The C function prototype is:
    Code:
    void encode(int n, float pop1[], float pop2[], float p1_chromo[], float p2_chromo[])
    The error that I get, all the time it seems, is ctypes.Argument Error: argument 2: <type 'exceptions.Typ eError'>: Don't know how to convert parameter 2

    I understand what the error is telling me. I am trying to put a list into an array of floats. I over came this problem in previous function calls, when I was passing 1D arrays, by using the byref(...) tag, flag or whatever it is called.

    I cannot understand a good way to create indexible arrays in python and then pass them to ANSI C funtions to be worked on. Thats my question... A mountain of text for that little line. But I wanted to show what I was doing and where I was coming from. I have read most of numpy's documentation, and pretty much all of the forum posts I could find... Any suggestions would be greatly appreciated... THANKS!!!
    Last edited by Fizzics; Nov 12 '08, 08:27 PM. Reason: typos
  • Fizzics
    New Member
    • Nov 2008
    • 5

    #2
    I have fixed it.... yay!

    Comment

    Working...