On Sun, 30 Oct 2005, Travis Oliphant wrote:
Pearu Peterson wrote:
By the definition of can_cast, no bitwise information is lost, but it is not meaningful to pass (double*)(<pointer to long array>) to a numeric function, for example.
But, that's never been what CanCastSafely has been used to represent. Perhaps we need a different function that distinguishes between different kinds. Again, what are you trying to do, specifically?
Or may be I should use some different function than PyArray_CanCastSafely in this situation?
I suspect so...
PyArray_CanCastSafely has been used in array_from_pyobj function (see fortranobject.c) to decide whether the data pointer of an input array can be directly passed on to the Fortran or C function: if ((! (intent & F2PY_INTENT_COPY)) && PyArray_ITEMSIZE(arr)==descr->elsize && PyArray_CanCastSafely(arr->descr->type_num,type_num) ) { if ((intent&F2PY_INTENT_C)?PyArray_ISCARRAY(arr):PyArray_ISFARRAY(arr)) { if ((intent & F2PY_INTENT_OUT)) { Py_INCREF(arr); } /* Returning input array */ return arr; } } /* else apply arr.astype(<type_num>) */ But I now realize that this is a incorrect usage of PyArray_CanCastSafely. The above codelet should probably then read as if ((! (intent & F2PY_INTENT_COPY)) && PyArray_ITEMSIZE(arr)==descr->elsize && ( (PyArray_ISINTEGER(arr) && PyTypeNum_ISINTEGER(type_num)) || (PyArray_ISFLOAT(arr) && PyTypeNum_ISFLOAT(type_num)) || (PyArray_ISCOMPLEX(arr) && PyTypeNum_ISCOMPLEX(type_num)) || (PyArray_ISSTRING(arr) && PyTypeNum_ISSTRING(type_num)) ) ) { ... though I am not sure about the STRING case, e.g. what happens when passing unicode arr->data to fortran character*(*) argument, for instance. Thanks, Pearu