help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: global variables in .oct-files


From: Stef Pillaert
Subject: Re: global variables in .oct-files
Date: Mon, 06 Oct 1997 12:22:54 +0200

At 01:02 2/10/97 -0500, you wrote:
>On 27-Sep-1997, Stef Pillaert BK <address@hidden> wrote:
>
>| I'm trying to translate some of my octave-functions (.m-files) into C++
>| (.oct-files) to speed up things. I use a lot of global variables though,
>| otherwise I have to pass a lot of parameters to each function. Is there a
>| way to "see" those global variables in my C++-code?
>
>Yes, it's possible.  Here is an example of how you can get and set
>global values in .oct files:
>
>  #include <octave/oct.h>
>  #include <octave/symtab.h>
>
>  octave_value
>  get_global_value (const string& nm)
>  {
>    octave_value retval;
>
>    symbol_record *sr = global_sym_tab->lookup (nm);
>
>    if (sr)
>      {
>       octave_value val = sr->variable_value ();
>
>       if (val.is_undefined ())
>         error ("get_global_value: undefined symbol `%s'", nm.c_str ());
>       else
>         retval = val;
>      }
>    else
>      error ("get_global_value: unknown symbol `%s'", nm.c_str ());
>
>    return retval;
>  }
>
>  void
>  set_global_value (const string& nm, const octave_value& val)
>  {
>    symbol_record *sr = global_sym_tab->lookup (nm, true);
>
>    if (sr)
>      sr->define (val);
>    else
>      panic_impossible ();
>  }
>
>
>  DEFUN_DLD (foo, args, ,
>    "foo (global_variable_name [, val])")
>  {
>    octave_value_list retval;
>
>    int nargin = args.length ();
>
>    if (nargin == 1 || nargin == 2)
>      {
>       string var = args(0).string_value ();
>
>       if (! error_state)
>         {
>           if (nargin == 2)
>             set_global_value (var, args(1));
>           else
>             retval(0) = get_global_value (var);
>         }
>      }
>
>    return retval;
>  }
>
>If the function defined above is called with two values, it sets the
>value of the named global variable to the value of the second
>argument.  If called with just one argument, it finds the value of the
>named global variable:
>

This works great, but what I want to do now is: just changing a few
elements in a large (global) variable. So I'm really looking for a
translation of what in a .m-file would be:

function f1()
global matrixa
matrixa(1,1)=10000;
end

(yes, I actually use a function as if it was a "procedure").

I tried to translate this into C++ with something like:

   octave_value val=get_global_value("matrixa");
   Matrix matrixb = val.matrix_value();
   matrixb(1,1) = 10000;      
   octave_value val2=octave_value(matrixb);
   set_global_value("matrixa",val2);

This doesn't work (octave crashes on it), and even if it would work, I
presume there is an unnecessary copy of the  global variable. I tried to
write a C++ function "change_global_value" (or should it be
"change_some_elements_in_global_value" ?), but I'm affraid my knowledge of
C++ is to limited and I get into trouble with pointers and stuff... Anyone
with a few minutes of time to help me out?
Thanks,

Stef. 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]