From: Hoehle, Joerg-C. <Joe...@t-...> - 2005-05-25 07:38:35
|
Hi, Bernard Urban wrote: >> I don't understand what you mean. 2D arrays in CLISP (and >cmucl) are not pointer rows of pointers to doubles, (like >char*argv[]), they are n*m doubles in sequence. >Yes, but in C, non-static 2D arrays are like char*argv[], What's the definition of a non-static 2D array in C? >and you are converting to such a beast. No, I'm not! [cf. Monty Python] >In Fortran, arrays are organized as in Lisp. Row-major first, are your sure? Your code does it the other way round. >> Otherwise, the following would yield garbage: >> (with-c-var (m '(c-array uint8(2 3)) #2a((1 2 3)(4 5 6))) >> (cast m '(c-array uint8 6))) >> -> #(1 2 3 4 5 6) >Are you sure cast does not revert from the char*argv[] representtaion >to the original ? My experiences with such things did not work in my >lapack tests. FFI:CAST does nothing but check that SIZEOF and ALIGNOF match. I'm sure I'm talking about 6 consecutive uint8 in memory. No *argv[]. There's a huge difference between (c-array (c-ptr (c-array x n) m) and (c-array (c-array x n) m). I'm talking solely about the latter (2nd): (with-c-var(m '(c-array uint8 (2 3)) #2a((1 2 3)(4 5 6))) (cast m '(c-array (c-array uint8 3) 2))) -> #(#(1 2 3) #(4 5 6)) And it's an array of this kind that your initial cmucl and clisp code is filling. (with-c-var(m '(c-array uint8 (2 3)) #2a((1 2 3)(4 5 6))) (cast m '(c-array (c-array uint8 2) 3))) -> #(#(1 2) #(3 4) #(5 6)) >By the way, this is a method to coerce the rank of matrices ! It's exactly like the CLHS example on ARRAY-ROW-MAJOR-INDEX, showing off a displaced array using a different rank (giving a linear view on a matrix). Regards, Jorg Hohle |