Page 1 of 1

Arrays, Vectors and Doubles?

Posted: Sat May 24, 2008 7:04 am
by Bill Connelly
Hi,

I'm working through the HOC exercises from the neuron course, and I'm deeply confused by a couple of things. I do the following:

Code: Select all

double x[1]
x[0]=10
So I'm making an array with one element which is a double, and then setting it's value to 10. I'm fine with that. But if I try:

Code: Select all

objref y[1]
y[0]=10
...and I get an error. I though all variables were by default doubles? What's going on here? Is it because the idea behind objref is that is should be used only for declaring variables which will be used to point to objects?

And is that why there are both arrays and vectors... an can potentially be used holding anything, and whether an array is defined with 'double' or 'objref' decides whether it is happy holding a number or an object pointer?

Finally, how do I declare an array without stating how many elements it has and/or adding elements on the fly?

Re: Arrays, Vectors and Doubles?

Posted: Sat May 24, 2008 11:36 am
by ted
Doubles are not objrefs
double x[n]
declares an array of doubles.
objref y[n]
declares n objrefs whose names are y[0]...y[n-1].
I though all variables were by default doubles?
False. To paraphrase Orwell, "the slovenliness of our language makes it easier tor us to
make programming errors."

The type of a user-defined symbol is determined by its first appearance in a program.

Code: Select all

oc>y = sin(0.1)  // first appearance of y
oc>y
        0.099833417 
oc>y[0]
/usr/local/nrn/i686/bin/nrniv: y not an array variable
 near line 9
 y[0]
     ^
So y is a scalar with double precision. The declaration
double y[n]
would make y be an array of n double precision values. Although variables that are
explicitly declared with
double varname
syntax are actually arrays, they are generally called "doubles".

objrefs are objrefs, not scalars or arrays of scalars.

Code: Select all

oc>objref z
oc>z = x[0]
bad stack access: expecting (Object **); really (double)
/usr/local/nrn/i686/bin/nrniv: interpreter stack type error
 near line 14
 z = x[0]
         ^
oc>z = y
bad stack access: expecting (Object **); really (double)
/usr/local/nrn/i686/bin/nrniv: interpreter stack type error
 near line 15
 z = y
      ^
hoc has arrays and Vectors as an accident of history. It started as a toy programming
language with a c-like syntax in the mid 1970s, at which time it had scalars and arrays of
scalars. Objects (which include Vectors) were added later.
Finally, how do I declare an array without stating how many elements it has and/or adding elements on the fly?
To the extent possible, avoid using "doubles" (variables declared with
double varname
syntax). Stick with Vectors. The Vector class has several methods for changing the
size of a Vector--append, insrt, resize. Read about them here
http://www.neuron.yale.edu/neuron/stati ... tml#Vector
For the greatest flexibility in dealing with collections of things, it is best to use the List class--
see http://www.neuron.yale.edu/neuron/stati ... .html#List