John Doe
John Doe

Reputation: 149

Equivalent expression in Python

I am a Python n00b and at the risk of asking an elementary question, here I go.

I am porting some code from C to Python for various reasons that I don't want to go into.

In the C code, I have some code that I reproduce below.

float table[3][101][4];
int kx[6] = {0,1,0,2,1,0};
int kz[6] = {0,0,1,0,1,2};

I want an equivalent Python expression for the C code below:

float *px, *pz;
int lx = LX; /* constant defined somewhere else */
int lz = LZ; /* constant defined somewhere else */
px = &(table[kx[i]][0][0])+lx;
pz = &(table[kz[i]][0][0])+lz;

Can someone please help me by giving me the equivalent expression in Python?

Upvotes: 2

Views: 298

Answers (2)

user2357112
user2357112

Reputation: 281476

There is no direct equivalent for your C code, since Python has no pointers or pointer arithmetic. Instead, refactor your code to index into the table with bracket notation.

table[kx[i]][0][lx] = 3

would be a rough equivalent of the C

px = &(table[kx[i]][0][0])+lx;
*px = 3;

Note that in Python, your table would not be contiguous. In particular, while this might work in C:

px[10] = 3; // Bounds violation!

This will IndexError in Python:

table[kx[i]][0][lx + 10] = 3

Upvotes: 0

Mike
Mike

Reputation: 49463

Here's the thing... you can't do pointers in python, so what you're showing here is not "portable" in the sense that:

float *px, *pz;    <-- this doesn't exist
int lx = LX; /* constant defined somewhere else */
int lz = LZ; /* constant defined somewhere else */
px = &(table[kx[i]][0][0])+lx;
pz = &(table[kz[i]][0][0])+lz;
^    ^                      ^
|    |                      |
+----+----------------------+---- Therefore none of this makes any sense...

What you're trying to do is have a pointer to some offset in your multidimensional array table, because you can't do that in python, you don't want to "port" this code verbatim.

Follow the logic beyond this, what are you doing with px and pz? That is the code you need to understand to try and port.

Upvotes: 3

Related Questions