Question about GAUSS C support

Hi,

I'm doing a bit of C programming to speed up some of my function evaluations. I'm a bit confused about how arrays are passed to C function. In the dllcall help file it says:

In C syntax, func should take one of the following forms:

  1. int func(void);
  2. int func(double *arg1 [, arg2...argN]);
  3. int func(double *arg[]);

I usually use form 2, but each *arg can only be a vector. I was wondering if there is any way to pass a matrix as a multidimensional array into the C function? Also, how does form 3 work? For example, in this C program:

__declspec(dllexport) int copyAtoB(double *A, double *B, double *ele)
{
   int i, j, n;
   n=(int)ele[0];
   for (i = 0; i < n; i++)
   {
       for (j = 0; j < n; j++)
       {
           B[i] = A[i];
       }
   }
   return 0;
}

Can I somehow stack all my inputs to a ele-by-3 matrix M = { A; B; ele 0 0 0... } and pass it to a C function using form 3?

Many thanks. Fred

2 Answers



0



Sry about a mistake in the example program above.. The example should be:

__declspec(dllexport) int copyAtoB(double *A, double *B, double *ele)
{
    int i, j, n;
    n=(int)ele[0]
    for (i = 0; i < n; i++)
    {
        B[i] = A[i];
    }
    return 0;
}



0



The 3rd form requires the '-v' flag passed to dllcall which will pass the arguments as a vector of double pointers.

The double pointer after the last valid argument will be set to NULL so the number of arguments can be attained. (instead of passing it in directly)

__declspec(dllexport) int copyAtoB(double *vars[])
{
    int n, i;
    n=(int)(vars[0][0]);
    for (i = 0; i < n; i++)
    {
        vars[2][i] = vars[1][i]; // B[i] = A[i];
    }
    return 0;
}

and called by GAUSS

A = seqa(5,1,5);
B = seqa(1,1,5);
n = rows(A);
dllcall -v copyAtoB(n, A, B);

aptech

1,773

Your Answer

2 Answers

0

Sry about a mistake in the example program above.. The example should be:

__declspec(dllexport) int copyAtoB(double *A, double *B, double *ele)
{
    int i, j, n;
    n=(int)ele[0]
    for (i = 0; i < n; i++)
    {
        B[i] = A[i];
    }
    return 0;
}

0

The 3rd form requires the '-v' flag passed to dllcall which will pass the arguments as a vector of double pointers.

The double pointer after the last valid argument will be set to NULL so the number of arguments can be attained. (instead of passing it in directly)

__declspec(dllexport) int copyAtoB(double *vars[])
{
    int n, i;
    n=(int)(vars[0][0]);
    for (i = 0; i < n; i++)
    {
        vars[2][i] = vars[1][i]; // B[i] = A[i];
    }
    return 0;
}

and called by GAUSS

A = seqa(5,1,5);
B = seqa(1,1,5);
n = rows(A);
dllcall -v copyAtoB(n, A, B);


You must login to post answers.

Have a Specific Question?

Get a real answer from a real person

Need Support?

Get help from our friendly experts.