diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2008-01-25 18:32:14 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2008-01-25 18:32:14 +0000 |
commit | 7e33f2e3ade221f34809b809c34f1d0dc9ca6181 (patch) | |
tree | b3c8605f32f51fa5c7bab37edfb1fd1c8ee39fd7 /numpy/f2py/src/fortranobject.c | |
parent | a1394fa0cd060ffc2b880e724273afd32c592d5f (diff) | |
download | numpy-7e33f2e3ade221f34809b809c34f1d0dc9ca6181.tar.gz |
Catch wrong array sizes when the length of an array is 1.
Diffstat (limited to 'numpy/f2py/src/fortranobject.c')
-rw-r--r-- | numpy/f2py/src/fortranobject.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/numpy/f2py/src/fortranobject.c b/numpy/f2py/src/fortranobject.c index ff1eb6252..f6679665e 100644 --- a/numpy/f2py/src/fortranobject.c +++ b/numpy/f2py/src/fortranobject.c @@ -694,18 +694,20 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,npy_intp *d npy_intp new_size = 1; int free_axe = -1; int i; + npy_intp d; /* Fill dims where -1 or 0; check dimensions; calc new_size; */ for(i=0;i<arr->nd;++i) { + d = arr->dimensions[i]; if (dims[i] >= 0) { - if (dims[i]!=arr->dimensions[i]) { + if (d>1 && dims[i]!=d) { fprintf(stderr,"%d-th dimension must be fixed to %" NPY_INTP_FMT " but got %" NPY_INTP_FMT "\n", - i,dims[i], arr->dimensions[i]); + i,dims[i], d); return 1; } if (!dims[i]) dims[i] = 1; } else { - dims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1; + dims[i] = d ? d : 1; } new_size *= dims[i]; } @@ -724,16 +726,17 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,npy_intp *d new_size *= dims[free_axe]; } if (new_size != arr_size) { - fprintf(stderr,"confused: new_size=%" NPY_INTP_FMT - ", arr_size=%" NPY_INTP_FMT " (maybe too many free" + fprintf(stderr,"unexpected array size: new_size=%" NPY_INTP_FMT + ", got array with arr_size=%" NPY_INTP_FMT " (maybe too many free" " indices)\n", new_size,arr_size); return 1; } } else if (rank==arr->nd) { + npy_intp new_size = 1; int i; npy_intp d; for (i=0; i<rank; ++i) { - d = arr->dimensions[i]; + d = arr->dimensions[i]; if (dims[i]>=0) { if (d > 1 && d!=dims[i]) { fprintf(stderr,"%d-th dimension must be fixed to %" NPY_INTP_FMT @@ -743,6 +746,12 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,npy_intp *d } if (!dims[i]) dims[i] = 1; } else dims[i] = d; + new_size *= dims[i]; + } + if (new_size != arr_size) { + fprintf(stderr,"unexpected array size: new_size=%" NPY_INTP_FMT + ", got array with arr_size=%" NPY_INTP_FMT "\n", new_size,arr_size); + return 1; } } else { /* [[1,2]] -> [[1],[2]] */ int i,j; @@ -782,7 +791,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,npy_intp *d } for (i=0,size=1;i<rank;++i) size *= dims[i]; if (size != arr_size) { - fprintf(stderr,"confused: size=%" NPY_INTP_FMT ", arr_size=%" NPY_INTP_FMT + fprintf(stderr,"unexpected array size: size=%" NPY_INTP_FMT ", arr_size=%" NPY_INTP_FMT ", rank=%d, effrank=%d, arr.nd=%d, dims=[", size,arr_size,rank,effrank,arr->nd); for (i=0;i<rank;++i) fprintf(stderr," %" NPY_INTP_FMT,dims[i]); |