[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
changing octfiles to be ready for 3.4
From: 
John W. Eaton 
Subject: 
changing octfiles to be ready for 3.4 
Date: 
Wed, 19 Jan 2011 14:49:47 0500 
On 19Jan2011, Carlo de Falco wrote:
 Hi all,

 Some time ago I sent this post which remained unanswered:

"http://octave.1599824.n4.nabble.com/OctavepackagesforIsoGeometricanalysisandmovingto34tp3091510p3091510.html";

 Probably the question was not specific enough, so I'll try again reducing the
problem to a minimal function that
 shows the same issue

 The attached DLD function works as follows in octave 3.2.4:

 >> nel = 5; ndof = 10; nsh = 4; nqn = 9;
 >> in = ones (nqn, nsh, nel);
 >> connectivity = [1 2 3 4; 2 3 4 5; 6 7 8 9; 10 1 2 3; 1 2 3 4; 2 3 4 5; 3 4
5 6; 1 2 3 4; 2 3 4 5; 6 7 8 9]';
 >> A = test_ndarray_sparse (in, nel, nsh, nqn, ndof, connectivity);
 >> full (A)
 ans =

 27 27 27 18 0 0 0 0 0 9
 27 36 36 27 9 0 0 0 0 9
 27 36 36 27 9 0 0 0 0 9
 18 27 27 27 9 0 0 0 0 0
 0 9 9 9 9 0 0 0 0 0
 0 0 0 0 0 9 9 9 9 0
 0 0 0 0 0 9 9 9 9 0
 0 0 0 0 0 9 9 9 9 0
 0 0 0 0 0 9 9 9 9 0
 9 9 9 0 0 0 0 0 0 9

 >>

 while in version 3.3.54+ (built just before the Xmas break) I get

 >> nel = 5; ndof = 10; nsh = 4; nqn = 9;
 >> in = ones (nqn, nsh, nel);
 >> connectivity = [1 2 3 4; 2 3 4 5; 6 7 8 9; 10 1 2 3; 1 2 3 4; 2 3 4 5; 3 4
5 6; 1 2 3 4; 2 3 4 5; 6 7 8 9]';
 >> A = test_ndarray_sparse (in, nel, nsh, nqn, ndof, connectivity);
 octave(1870,0xa01e8540) malloc: *** error for object 0x5a353f4: incorrect
checksum for freed object  object was probably modified after being freed.
 *** set a breakpoint in malloc_error_break to debug
 panic: Segmentation fault  stopping myself...
 Segmentation fault

 Can someone please help me find out (or give me some pointers) what has
changed between versions that might be causing this problem?
Taking a guess, I added
#define BOUNDS_CHECKING
to the top of your file. This caused the call to test_ndarray_sparse
to generate the error
Then ran with gdb to isolate where this was happening.
You need to write
Array <octave_idx_type> I (nel * nsh * nsh, 1, octave_idx_type (0));
Array <octave_idx_type> J (nel * nsh * nsh, 1, octave_idx_type (0));
Array <double> V (nel * nsh * nsh, 1, 0.0);
instead of
Array <octave_idx_type> I (nel * nsh * nsh, 0);
Array <octave_idx_type> J (nel * nsh * nsh, 0);
Array <double> V (nel * nsh * nsh, 0.0);
You can't define a 1d array with an initialization value because we
also have an Array constructor that takes two dimensions. How would
we distinguish between the second dimension and the initial value
arguments?
We currently have Array constructors like this:
// Empty ctor (0x0).
Array (void)
// Obsolete 1D ctor (there are no 1D arrays).
explicit Array (octave_idx_type n) GCC_ATTR_DEPRECATED
// 2D uninitialized ctor.
explicit Array (octave_idx_type m, octave_idx_type n)
// 2D initialized ctor.
explicit Array (octave_idx_type m, octave_idx_type n, const T& val)
// nD uninitialized ctor.
explicit Array (const dim_vector& dv)
// nD initialized ctor.
explicit Array (const dim_vector& dv, const T& val)
// Reshape constructor.
Array (const Array<T>& a, const dim_vector& dv);
Array (const Array<T>& a, octave_idx_type nr, octave_idx_type nc);
// Type conversion case.
template <class U>
Array (const Array<U>& a)
// No type conversion case.
Array (const Array<T>& a)
To avoid confusion, maybe we should deprecate and eventually drop
// 2D uninitialized ctor.
explicit Array (octave_idx_type m, octave_idx_type n)
// 2D initialized ctor.
explicit Array (octave_idx_type m, octave_idx_type n, const T& val)
Array (const Array<T>& a, octave_idx_type nr, octave_idx_type nc);
and require dim_vectors to be created explicitly?
Note that this would not affect constructors for the NDArray or Matrix
classes.
jwe