funkey Posted March 15, 2013 Share 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. Link to comment Share on other sites More sharing options...
UEZ Posted March 15, 2013 Share 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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
funkey Posted March 18, 2013 Author Share 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. Link to comment Share on other sites More sharing options...
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