funkey Posted March 15, 2013 Posted March 15, 2013 I am always looking for the fastest way to put a lot of data into DLLs. My new try is with a small DLL to split a data string and get a pointer to the new data array. I hope this could be useful for someone else. Please tell me if there is a faster way to do this! Thanks! expandcollapse popup#AutoIt3Wrapper_UseX64=n ; Set the data Global $sData, $sDelim = ";" For $i = 1 To 43200 $sData &= Random(0, 100) & $sDelim Next $sData &= Random(0, 100) #region Float array to struct: Version 1 without DLL Global $iStart = TimerInit() Global $aData = StringSplit($sData, $sDelim, 2) Global $tData = DllStructCreate("float[" & UBound($aData) & "]") For $i = 0 To UBound($aData) - 1 DllStructSetData($tData, 1, $aData[$i], $i + 1) Next ConsoleWrite("Version 1 lasts: " & TimerDiff($iStart) & " ms" & @CRLF) ConsoleWrite("First: " & DllStructGetData($tData, 1, 1) & @CRLF) ConsoleWrite("Last : " & DllStructGetData($tData, 1, UBound($aData)) & @CRLF) $tData = 0 #endregion Float array to struct: Version 1 without DLL ConsoleWrite(@CRLF) #region Float array to struct: Version 2 with DLL Global $sDLL_StringSplit = "StringSplitToStruct.dll" Global $hDLL_StringSplit = DllOpen($sDLL_StringSplit) Global $iStart = TimerInit() Global $iCount = 0 Global $tData2 = _StringSplitToStruct($sData, $sDelim, "float", $iCount) ConsoleWrite("Version 2 lasts: " & TimerDiff($iStart) & " ms" & @CRLF) ConsoleWrite("First: " & DllStructGetData($tData2, 1, 1) & @CRLF) ConsoleWrite("Last : " & DllStructGetData($tData2, 1, $iCount) & @CRLF) _StringSplitFree($tData2) DllClose($hDLL_StringSplit) #endregion Float array to struct: Version 2 with DLL Func _StringSplitToStruct($sString, $sDelim, $sType, ByRef $iCount) Local $aRet = DllCall($hDLL_StringSplit, "ptr:cdecl", "StringSplitToStruct", "str", $sString, "str", $sDelim, "str", $sType, "int*", $iCount) $iCount = $aRet[4] Local $tStruct = DllStructCreate($sType & "[" & $iCount & "]", $aRet[0]) Return $tStruct EndFunc ;==>_StringSplitToStruct Func _StringSplitFree(ByRef $tStruct) DllCall("msvcrt.dll", "none:cdecl", "free", "ptr", DllStructGetPtr($tStruct)) $tStruct = 0 EndFunc ;==>_StringSplitFree expandcollapse popupPVOID DLL_EXPORT StringSplitToStruct(LPSTR datastring, LPCSTR delim, LPCSTR type, int* iCount) { char* p; int i; if(*iCount == 0) { *iCount = 0; for(i = 0; datastring[i]; i++) { if(datastring[i] == delim[0]) { (*iCount)++; } } (*iCount)++; } i = 0; p = strtok(datastring, delim); if(stricmp(type, "float") == 0) { float* buffer = (float*)malloc(*iCount * sizeof(float)); while ((p != NULL) && (i < *iCount)) { buffer[i] = atof(p); p = strtok (NULL, delim); i++; } return buffer; } else if(stricmp(type, "int") == 0) { int* buffer = (int*)malloc(*iCount * sizeof(int)); while ((p != NULL) && (i < *iCount)) { buffer[i] = atoi(p); p = strtok (NULL, delim); i++; } return buffer; } return NULL; }StringSplitToStruct.rar pixelsearch 1 Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning.
UEZ Posted March 15, 2013 Posted March 15, 2013 Great stuff! I wish I could code in C++... Br, UEZ funkey 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
funkey Posted March 18, 2013 Author Posted March 18, 2013 Thanks, but this is C, not C++ and the code should be easy to understand. Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now