thenoob94 Posted April 24, 2023 Report Share Posted April 24, 2023 I want to pass a struct to the library function. this is the code from the function: EXTERN_C SV_GEN_SDK_API SV_RETURN SVLibSystemGetInfo(uint32_t uiIndex, SV_TL_INFO *pInfoOut); /** SVLibSystemOpen * Opens the System module and puts the instance in the phSystem handle. This allocates all system wide * resources. A System module can only be opened once. * @param [in] uiIndex Zero-based index of loaded GenTLProducers. * @param [out] phSystemOut System module handle. * @return success or error code */ this is the struct I want to pass to the function: typedef struct _SV_TL_INFO { char id[SV_STRING_SIZE]; char vendor[SV_STRING_SIZE]; char model[SV_STRING_SIZE]; char version[SV_STRING_SIZE]; char tlType[SV_STRING_SIZE]; char name[SV_STRING_SIZE]; char pathName[SV_STRING_SIZE]; char displayName[SV_STRING_SIZE]; uint32_t gentlVersionMajor; uint32_t gentlVersionMinor; int32_t encoding; }SV_TL_INFO, *PSV_TL_INFO; 1.png shows my labview architecture 2.png show how I call this function I tried almost all of the parameter permutations to call this function but my program keeps on crashing. I'm on debian. Quote Link to comment
dadreamer Posted April 24, 2023 Report Share Posted April 24, 2023 (edited) 1 hour ago, thenoob94 said: I tried almost all of the parameter permutations to call this function but my program keeps on crashing. No, don't pass LabVIEW arrays straight to the cluster! They are different entity than those in C/C++. In order to match your struct definition, you have to turn each array into a separate cluster. Use Array To Cluster primitive for that. RMB click -> Cluster size on it allows you to specify the output cluster size. Then bundle all the clusters into one (plus three int parameters), then pass that resulting cluster to your CLFN. I assume, you know your .so's calling convention. Oh, I forgot to add, that Array To Cluster node doesn't accept more than 256 elements. So, if SV_STRING_SIZE is 512, you need to make a pairs of 256+256 elements (e.g., two "id" clusters, two "vendor" clusters etc.). There's another way with DSNewPtr+MoveBlock, but it's a bit more advanced. Edited April 24, 2023 by dadreamer added more info 1 Quote Link to comment
Rolf Kalbermatter Posted June 17, 2023 Report Share Posted June 17, 2023 On 4/24/2023 at 5:23 PM, dadreamer said: No, don't pass LabVIEW arrays straight to the cluster! They are different entity than those in C/C++. In order to match your struct definition, you have to turn each array into a separate cluster. Use Array To Cluster primitive for that. RMB click -> Cluster size on it allows you to specify the output cluster size. Then bundle all the clusters into one (plus three int parameters), then pass that resulting cluster to your CLFN. I assume, you know your .so's calling convention. Oh, I forgot to add, that Array To Cluster node doesn't accept more than 256 elements. So, if SV_STRING_SIZE is 512, you need to make a pairs of 256+256 elements (e.g., two "id" clusters, two "vendor" clusters etc.). There's another way with DSNewPtr+MoveBlock, but it's a bit more advanced. Actually DSNewPtr is not really needed. You can very well provide the necessary memory space by a simple Initialize Array node, datatype U8, size 8 * 512 + 3 * 4 and pass that as C array pointer to the shared library. Then do some indexing into the resulting array after the function executed and some Unflattening for the 3 integers and all should be well. 1 Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.