[Numpy-svn] r4756 - trunk/numpy/f2py/src
numpy-svn at scipy.org
numpy-svn at scipy.org
Fri Jan 25 13:32:26 EST 2008
Author: pearu
Date: 2008-01-25 12:32:14 -0600 (Fri, 25 Jan 2008)
New Revision: 4756
Modified:
trunk/numpy/f2py/src/fortranobject.c
Log:
Catch wrong array sizes when the length of an array is 1.
Modified: trunk/numpy/f2py/src/fortranobject.c
===================================================================
--- trunk/numpy/f2py/src/fortranobject.c 2008-01-25 07:08:41 UTC (rev 4755)
+++ trunk/numpy/f2py/src/fortranobject.c 2008-01-25 18:32:14 UTC (rev 4756)
@@ -694,18 +694,20 @@
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 @@
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,7 +746,13 @@
}
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;
npy_intp d;
@@ -782,7 +791,7 @@
}
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]);
More information about the Numpy-svn
mailing list