On 2014-10-16, Volker Braun <[email protected]> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.