summaryrefslogtreecommitdiff
path: root/numpy/f2py/src/fortranobject.c
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2008-01-25 18:32:14 +0000
committerPearu Peterson <pearu.peterson@gmail.com>2008-01-25 18:32:14 +0000
commit7e33f2e3ade221f34809b809c34f1d0dc9ca6181 (patch)
treeb3c8605f32f51fa5c7bab37edfb1fd1c8ee39fd7 /numpy/f2py/src/fortranobject.c
parenta1394fa0cd060ffc2b880e724273afd32c592d5f (diff)
downloadnumpy-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.c23
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]);