Hi experts,
In my project, all of our data are dealt with C#. So, i built the process of calling Gauss procedure with C++ into a dll, and this dll will be called by C#. Now, i got a problem. When using C++ to call my Gauss Procedure with C APIs, there is no problem when executing. But if building the same code with C++ into a dll, using C# to call this dll, the GAUSS_Execute() will return a 493 error.
(I create 2 solutions in Visual Studio, one is CLR dll library which call Gauss Code with C++, and other is C# solution to call the CLR dll.)
The Gauss code:
format /m1 /rd 8,4; declare inflnm, flnm; FF=xlsreadm(inflnm, "", 1, ""); erow=rows(FF); brow=erow-500+1; {DD,ID} = selectItem(FF[1,.]|FF[brow:erow,.]); dt=DD[.,1]; YY=ln(DD[.,cols(DD)-1]); XX=ln(DD[.,2:cols(DD)-2]); Rt=XX-YY; ret=xlsWrite(Rt,flnm,"A2",1,""); proc(2) = selectItem(FF); local i,j,n,m,dd,id,flag; dd=FF[.,1]; n=rows(FF); m=cols(FF); for j (2,m,1); flag=0; for i (1,n,1); if FF[i,j]==-99 or FF[i,j]==-1; flag=1; break; endif; endfor; if flag==0; dd=dd~FF[.,j]; endif; endfor; retp(dd[2:n,.],dd[1,2:cols(dd)]); endp;
Thanks a lot.
2 Answers
0
Colin,
Additional error information for compiling/running programs can be obtained by setting a hook to a custom defined function in C++. In your case, you're going to need to store this information in a way that can be referenced by C#. A second file logging example is also presented if you wish to go that route.
Example:
// This can also be a static class method. void internalHookError(char *output) { // output contains error information from the engine // store this in a variable retrievable by C# } // This must be ran repeatedly if a new thread is created // when calling GAUSS_Execute. GAUSS_HookProgramErrorOutput(internalHookError);
With the above code in place, all error information will be routed to the assigned function pointer.
If logging to a file for diagnostics is more desirable, this can easily be achieved:
// 'a' is for appending to existing file. // 'w' can be used to overwrite an existing file GAUSS_SetLogFile("filename", "a");
Aptech has, for the purpose of multi-language integration with the GAUSS Engine, already created a C++ wrapper.
You may find some helpful information in this repository. The C++ specific code is located at:
https://github.com/aptech/gsoop/tree/master/src
Please let us know if we can be of further assistance.
0
Thank you for your help, let me have an investigation firstly.
Your Answer
2 Answers
Colin,
Additional error information for compiling/running programs can be obtained by setting a hook to a custom defined function in C++. In your case, you're going to need to store this information in a way that can be referenced by C#. A second file logging example is also presented if you wish to go that route.
Example:
// This can also be a static class method. void internalHookError(char *output) { // output contains error information from the engine // store this in a variable retrievable by C# } // This must be ran repeatedly if a new thread is created // when calling GAUSS_Execute. GAUSS_HookProgramErrorOutput(internalHookError);
With the above code in place, all error information will be routed to the assigned function pointer.
If logging to a file for diagnostics is more desirable, this can easily be achieved:
// 'a' is for appending to existing file. // 'w' can be used to overwrite an existing file GAUSS_SetLogFile("filename", "a");
Aptech has, for the purpose of multi-language integration with the GAUSS Engine, already created a C++ wrapper.
You may find some helpful information in this repository. The C++ specific code is located at:
https://github.com/aptech/gsoop/tree/master/src
Please let us know if we can be of further assistance.
Thank you for your help, let me have an investigation firstly.