Jump to content

blueshrimp

Members
  • Posts

    2
  • Joined

  • Last visited

    Never

Posts posted by blueshrimp

  1. QUOTE(Neville D @ Aug 21 2007, 05:04 PM)

    I know this doesn't directly address your question, but if you have the LV 8.5 Pro version, there are a lot of built-in VI's to solve Ax=B already. Why re-invent the wheel (and muck around with C in the process)?

    Neville.

    Because I am writing code for an embedded system (you need to tailor-write most embedded systems code so that it uses resouces most efficiently, as embedded systems are typically quite resource-constrained). For historical (and not very good) reasons, my company used LabView to prototype their algorithms. This makes them run very slow on a PC. Now we need to port to an embedded system. Ergo: need to write functions from scratch in C. The current C dll is used to validate our algorithm porting. It runs on a PC in parallel to the labview so that we can confirm that our C code does exactly what the labview does. Once we finish with the validation, we will get rid of the labview and run C native all the time.

    Labview is nice for controlling motors and suchlike in the lab or university, but is not what you want to be running in a complex embedded system that ships out to customers. Too big and slow.

    Anyway, thanks for your replies guys. Looks like I have to "flatten" the array or do lots of formatting tricks and deal with LV handles since C is tricky with matrix handling. Too bad, I was hoping there was a simpler way, oh well. :)

  2. Hi there, newbie here.

    I did a search but could not find good answer to my question.

    I have a simple LabView vi that takes in a 2D Array (user defines it, it is a "control" input) called A, an array b, and an initialized (all zeros) array x that is the same size as b.

    Then I am trying to pass this to a C function in a library I'm writing, which will solve Ax=b.

    I do not know in advance the size of the matrix A, but it is assumed to be square (therefore it is the same size as arrays b and x).

    My problem is passing this matrix A into my function. I can pass b and x successfully, but my execution chokes up on A.

    Here's my C function prototype:

    _declspec(dllexport) unsigned char GaussJordan(double **A, double b[], double x[], unsigned long dim);

    However, when I do to "configure" in the dll vi, it keeps generating the prototype:

    unsigned char GaussJordan(double *A, double *b, double *x, unsigned long dim);

    even when I tell it that A should be a 2D array.

    When I stop my debugger right inside my C function call, I see that A[0] is 0, and then A[0][0] "cannot be evaluated".

    When I change my function prototype to:

    _declspec(dllexport) unsigned char GaussJordan(double A[3][3], double b[], double x[], unsigned long dim);

    for instance, then with my debugger I can see inside my GaussJordan an A matrix that makes sense (i.e. is exactly what I passed in). However, this is then a problem because inside GaussJordan I have a function call to:

    solveeqn(double **A, double b[], double[x], unsigned long size)

    Which dies because A[3][3] is not of type double *[3].

    Since I am using solveeqn on matrices of variable size elsewhere on the code, I cannot lock it to the size that labview desires. Not to mention that having to write a different vi to C interface on the day I decide to solve 4x4 matrices instead of 3x3 matrices is too much work.

    So, the question is: how do I pass a variable-sized (assumed square) 2D array from LabView into a C function, if the size of this array is unknown in advance/unknown at compile time??

    Any help will be greatly appreciated!

    Thanks,

    -Elisa.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.