On 2014-10-16, Volker Braun <vbraun.n...@gmail.com> wrote: > It would be easy enough to use a matrix class instead of VLAs, e.g. slap on > > > #include <boost/numeric/ublas/matrix.hpp> > using namespace boost::numeric::ublas; > > and replace int a[n][n] with matrix<int> a(n, n) and a[i][j] with a(i,j). > > If you just want to pass in an array into your C99 code you can just lie to > Cython, use something like > > void foo(int n, int a[n][n]) > > in your C99 header but declare it as > > cdef extern from ... > void foo(int n, int *a) > > in Cython.
yes, I do the latter, it works, but gives a warning at the stage of compiling the cython-generated C file. Strange that Cython does not allow a proper cast, to (int (*)[])). Dima > > On Thursday, October 16, 2014 2:29:14 PM UTC+1, Dima Pasechnik wrote: >> >> On 2014-10-16, Volker Braun <vbrau...@gmail.com <javascript:>> wrote: >> > C99 VLA are not dynamically allocated, they exhaust the static stack >> rather >> > quickly. If you are writing the C part of the code yourself it is in the >> > long run almost certainly better to put matrices on the heap. If you >> have a >> > maximal size for arrays you could use that as static bound. Or replace >> them >> > with a C++ matrix class that does the dynamic allocation (e.g. >> > boost::numeric::ublas::matrix) >> >> it's something I wrote 20+ years ago, and uses a lot of a[i][j] syntax. >> Allocation was done statically. So I changed it to VLAs, but I wouldn't >> want to spend more time on it. >> >> It's not 100% clear how to use heap instead. >> Apparently I can call a function >> >> void f(int n, int a[][n]){...} >> >> by doing (instead of `int b[n][n]; f(n,b);`) >> >> int *b; >> b=(int *)malloc(n*n*sizeof(int)); >> f(n, b); >> >> but this gives scary warnings about types: >> >> warning: passing argument 2 of ‘f’ from incompatible pointer type >> [enabled by default] >> note: expected ‘int (*)[(sizetype)(n)]’ but argument is of type ‘int *’ >> >> even though the code appears to be working. >> >> >> > >> > >> > >> > >> > On Thursday, October 16, 2014 12:28:21 PM UTC+1, Dima Pasechnik wrote: >> >> >> >> In C99 it's possible to do dynamic allocation of multidimensional >> arrays: >> >> >> >> void blah(int n) { >> >> int a[n][n]; >> >> ...} >> >> >> >> but this does not seem to be supported in Cython. If I try >> >> sage -cython on >> >> >> >> def t(int n): >> >> cdef int a[n][n] >> >> cdef int i, j >> >> for i in range(n): >> >> for j in range(n): >> >> a[i][j]=i+j >> >> return a[0][n-1] >> >> >> >> I get >> >> >> >> Error compiling Cython file: >> >> ------------------------------------------------------------ >> >> ... >> >> def t(int n): >> >> cdef int i, j >> >> cdef int a[n][n] >> >> ^ >> >> ------------------------------------------------------------ >> >> >> >> m.pyx:3:18: Not allowed in a constant expression >> >> >> >> As I have C99 code I'd like to hook up to Sage, I'd really >> >> like to know how to get around this limitation (with as little overhead >> >> as possible) >> >> >> >> Thanks, >> >> Dima >> >> >> >> >> >> >> > >> >> > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.