help-octave
[Top][All Lists]
Advanced

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

Re: structures in oct files


From: jacques.beilin
Subject: Re: structures in oct files
Date: Fri, 21 Jan 2011 09:28:52 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7

Hi,

I want to write a package based on oct files in order to manage GPS time (GPS week number, day of week, day of year, second of day, second of week, mjd...). I have already written such a package but it was based on m-files.

In the package, I have several initialization functions. For example mjd_t takes a modified julian date as input and gives back a structure with all the date fields. I also wrote a add_s function. It takes a structure and a number of second to add. The function gives back the structure with the new date.

I have a problem when I write yyyyddds_t2.oct function. It take year, day of year and second of day as arguments. I want to initialize first a structure for yyyy, january 1st and then add 86400 seconds per day plus the seconds of day.


Here is the code :

#include <octave/oct.h>
#include <octave/ov-struct.h>
#include <octave/parse.h>


DEFUN_DLD (yyyyddds_t2, args, , "Struct demo.")
{
    int nargin = args.length ();
    octave_value retval;
    octave_map ymdhms0;
    octave_value_list rr;

    if (nargin <2)
        print_usage ();
    else
    {
        Octave_map tgps;
        double yyyy = args(0).double_value();

        // 2 or 4 digits year management
        if (yyyy<80) {
            yyyy=yyyy+2000;
        } else if (yyyy<100) {
            yyyy=yyyy+1900;
        }

        const double ddd = args(1).double_value(); // ddd : Day of year

        double s = 0.0;
        if (nargin==2) {
            s=0.0000;
        } else {
            s = args(2).double_value(); // s : seconds of day
        }


        // calculating gpstime structure for yyyy, january, 1st,, 0h:00
        std::string fcn = "ymdhms_t";
        int nargout;
        octave_value_list newargs;
        newargs(0) = yyyy;
        newargs(1) = 1;
        newargs(2) = 1;
        newargs(3) = 0;
        newargs(4) = 0;
        newargs(5) = 0;
        rr = feval (fcn, newargs, nargout);
        retval=rr(0);

        // adding (ddd-1.0)*86400+s seconds to gpstime structure
        std::string fcn2 = "add_s";
        int nargout2;
        octave_value_list newargs2;
        newargs2(0) = retval;
        newargs2(1) = s;
        rr = feval (fcn2, newargs2, nargout2);
        retval=rr(0);

    }

    return retval;
}

This code is successfully compiled but it crashes (octave terminal closed) on the line " rr = feval (fcn2, newargs2, nargout2);". I suppose that the problem comes from retval which is an octave_value whereas add_s takes an octave_map for the first argument.

I do not understand how (and when) to use octave_value and/or octave_map.

Best regards,

Jacques



Le 20/01/2011 18:42, Andy Buckle a écrit :
On Thu, Jan 20, 2011 at 3:25 PM, jacques.beilin<address@hidden>  wrote:
Hi,

I do not know whether this question has already been sent to the list. In
this case I am sorry to ask again.

I would like to know if there is somewhere a tutorial and/or examples about
oct files.

I found  this :
http://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles

I wrote some sample programs but I have parameter problems when I try to
call other oct files from an oct file. I try to send structures as input and
output.
When I have done similar, I have made a c++ function that actually
does the job I want. To make this available from Octave I have then
written a DEFUN_DLD that does extra parameter checking and then calls
the actual function. If I want to call the function from other c++,
then I call it directly. I pass by reference, to keep things quick.

If you want more helpful comments, you may have to provide the list
with more details of your approach, and the problems you had.


--
___________________________________________

Beilin Jacques

Département Positionnement Terrestre et Spatial
Ecole Nationale des Sciences Géographiques
Institut Géographique National

Cité Descartes
6,8 avenue Blaise Pascal - Champs Sur Marne
77455 Marne La Vallée Cedex

tel : 01 64 15 31 09

http://www.ensg.ign.fr/Positionnement-Terrestre-et-Spatial-geodesie




reply via email to

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