Ich versuche eine AU3-Funktion in C++ Nachzuschreiben, nur kriege ich das so gar nich hin.... Mir fehlt einfach der C++ Skill dazu
Nun ja, diese Funktion ist für mein Projekt: SciTEexecuter, und die AU3 Variante benötigt (auf meinem Schrotti) glatte 29 Minuten!! Und diese will ich mit der Cpp-UDF jetzt eben in C++ nachbauen und mal schauen wieviel Performance-Plus es gegenüber normalen AU3 gibt.
Au3-Code
; Das Erweiterte Syntax-Highlighting erstellen
Else
$keywordclass_functions = StringTrimRight($keywordclass_functions, 2)
$keywordclass_functions &= " \ " & @CRLF & _
chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
$keywordclass_defines &= " \ " & @CRLF & _
chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
$JustUnknown_functions &= "" & _
chr(9) & " cppapiunknown: \" & @CRLF & chr(9) & " "
_FileReadToArray($FileCppApi, $AllIncludeFiles)
GUICtrlSetData($Progress1, 0)
While $i <= $AllIncludeFiles[0] ; Eine Funktion aus der Liste laden
$tempA = StringLeft($AllIncludeFiles[$i],3)
$temp = StringTrimLeft($tempA, 2)
$tempA = StringLeft($AllIncludeFiles[$i],2)
$tempA = StringTrimLeft($tempA, 1)
$tempB = StringLeft($AllIncludeFiles[$i],1)
If StringInStr($AllIncludeFiles[$i], "(") then
; Eine Funktion gefunden
$temp = StringSplit($AllIncludeFiles[$i], "(", 1)
$AllIncludeFiles[$i] = $temp[1]
If not StringInStr($IncludeLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
$IncludeLine &= $AllIncludeFiles[$i] & " "
if StringLen($IncludeLine) > 600 Then ; Zeile verkürzen
$IncludeLine &= "\ " & @CRLF
$keywordclass_functions &= $IncludeLine
dim $IncludeLine = chr(9) & " "
EndIf
EndIf
ElseIf StringIsUpper($AllIncludeFiles[$i]) Or StringIsUpper($temp) Or ($temp = "_" and StringIsUpper($tempA) and StringIsUpper($tempB)) then
; Eine Define gefunden
If not StringInStr($DefineLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
$DefineLine &= $AllIncludeFiles[$i] & " "
if StringLen($DefineLine) > 600 Then ; Zeile verkürzen
$DefineLine &= "\ " & @CRLF
$keywordclass_defines &= $DefineLine
dim $DefineLine = chr(9) & " "
EndIf
EndIf
Else
; Eine weitere Funktion gefunden
If not StringInStr($DefineLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($IncludeLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
$JustUnknownLine &= $AllIncludeFiles[$i] & " "
if StringLen($JustUnknownLine) > 600 Then ; Zeile verkürzen
$JustUnknownLine &= "\ " & @CRLF
$JustUnknown_functions &= $JustUnknownLine
dim $JustUnknownLine = chr(9) & " "
EndIf
EndIf
EndIf
GUICtrlSetData($Progress1, (100/$AllIncludeFiles[0])*$i)
GUICtrlSetData($StatusLabel, $AllIncludeFiles[$i])
$i+=1
WEnd
Meine jetzige C++ Funktion
#include <stdio.h>
#include <windows.h>
//~ AutoIt Variablen-Übergabe
char Keywordclass_Keywords[] = "keywordclass.keywords= standart: and and_eq asm auto bitand bitor bool break byte callback case casting_comparison catch cdecl char class continue const const_cast default define delete dword dwordlong do double dynamic_cast And And_Eq Asm Auto Bitand Bitor Bool Break Byte Callback Case Casting_Comparison Catch Cdecl Char Class Continue Const Const_Cast Default Define Delete Dword DwordLong Do Double Dynamic_Cast AND AND_EQ ASM AUTO BITAND BITOR BOOL BREAK BYTE";
char Keywordclass_Functions[] = "keywordclass.functions= standart: asctime clock ctime datime difftime gmtime localtime mktime setlocale start strftime time clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen fprintf fpurge fputc fputs fread freopen fscanf AscTime Clock CTime DaTime DiffTime cppapi: ";
char Keywordclass_Defines[] = "keywordclass.defines= standart: HGLRC MSG HDC HWND HWND_DESKTOP WM_SIZE WM_PAINT WM_CREATE WM_DESTROY WM_CLOSE WM_QUIT WM_TIMER WM_COMMAND CLIENTCREATESTRUCT WPARAM LPARAM WPARAM GPTR HINSTANCE WNDCLASSEX WM_CREATE IDI_APPLICATION IDC_ARROW MB_ICONEXCLAMATION MB_OK WS_EX_APPWINDOW WS_OVERLAPPEDWINDOW WS_CLIPCHILDREN CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT HMENU WS_CHILD WS_VISIBLE BS_PUSHBUTTON WS_EX_CLIENTEDGE cppapi: ";
char JustUnknown_Functions[] = "cppapiunknown: ";
char FileCppApi[] = "C:/Program Files/AutoIt3/SciTE/api/cpp.api"; // Muß im Unix-Style angegeben werden!
//~ Load "cpp.api" File
CHAR* LoadFile(LPSTR pszFileName)
{
HANDLE hFile;
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize = GetFileSize(hFile, NULL);
LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
DWORD dwRead;
ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);
return pszFileText;
}
else
{
return 0;
}
}
//~ Hauptprogramm
int main()
{
char* AllIncludeFiles = LoadFile(FileCppApi);
//~ Die AllIncludeFiles ist eigentlich ein Array welches den Inhalt der 'cpp.api' enthält
//~ und dieses Array wird ausgelesen und Stück für Stück mit den Keywords-Einträgen verglichen:
//~ Keywordclass_Keywords, Keywordclass_Functions, Keywordclass_Defines, JustUnknown_Functions
//~ Ist der Eintrag aus dem Array NICHT in den Keywords vorhanden, soll es nach Regeln sortiert und angehängt werden:
//~ Wenn alles Großgeschrieben ist ist es eine 'Keywordclass_Defines' (Auch wenn es Groß ist und '_' enthält)
//~ Wenn ein Eintrag eine '(' enthält ist es eine 'Keywordclass_Functions'
//~ Sollten die ersten beiden Regeln nicht greifen ist es eine 'JustUnknown_Functions'
//~ Anschliessend werden die Werte mit den StdOut Stream zurückgegeben:
printf("%s", AllIncludeFiles);
}
Ich habe einen Teil der Funktion aus dem SciTEexecuter zur !Einsicht beigefügt, sie Funktioniert so nicht; ist aber zur veranschauung wie es bisher Funktionierte.
So richtig weit bin ich mit dem C++ nicht gekommen, hab´s grad mal geschafft die 'cpp.api' in ein komisches Array-Format zu laden. Nur jetzt beginnt das Sortieren der Array-Einträgen, und das krieg ich gar net hin :pinch:
Ich habe bereits fast 3 Tage für die C++ Funktion gebraucht, wegen mangelnder Helpfiles und schlechten Tut´s; und binn schon kurz davor die Sache in den Wind zu schiessen...
Cpp-UDF Funktion
; Das Erweiterte Syntax-Highlighting erstellen
$keywordclass_functions = StringTrimRight($keywordclass_functions, 2)
$keywordclass_functions &= " \ " & @CRLF & _
chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
$keywordclass_defines &= " \ " & @CRLF & _
chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
$JustUnknown_functions &= "" & _
chr(9) & " cppapiunknown: \" & @CRLF & chr(9) & " "
; Start der C++ Funktion
$TimerCpp = TimerInit()
; Die AU3 Variablen in ein besseres Format bringen
Local $TempKeywordclass_keywords
$TempKeywordclass_keywords = StringReplace($keywordclass_keywords, "\" & @CRLF, "")
$TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, chr(9) & " ", "")
$TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, " \ " & @CRLF, "")
$TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, @CRLF, "")
Local $TempKeywordclass_functions
$TempKeywordclass_functions = StringReplace($keywordclass_functions, "\" & @CRLF, "")
$TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, chr(9) & " ", "")
$TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, " \ " & @CRLF, "")
$TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, @CRLF, "")
Local $TempKeywordclass_defines
$TempKeywordclass_defines = StringReplace($keywordclass_defines, "\" & @CRLF, "")
$TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, chr(9) & " ", "")
$TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, " \ " & @CRLF, "")
$TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, @CRLF, "")
Local $TempJustUnknown_functions
$TempJustUnknown_functions = StringReplace($JustUnknown_functions, "\" & @CRLF, "")
$TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, chr(9) & " ", "")
$TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, " \ " & @CRLF, "")
$TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, @CRLF, "")
Local $TempFileCppApi
$TempFileCppApi = StringReplace($FileCppApi, "\", "/") ; Den Path im UNIX-style übergeben
Local $Cpp = CppInit("cpp") ; Das C++ 'Objekt' erstellen
CppAdd($Cpp, '' & _ ; Programmcode hinzufügen
'#include <stdio.h>' & @CRLF & _
'#include <windows.h>' & @CRLF & _
'' & @CRLF & _
'' & @CRLF & _
'//~ AutoIt Variablen-Übergabe' & @CRLF & _
'char Keywordclass_Keywords[] = "' & $TempKeywordclass_keywords & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
'char Keywordclass_Functions[] = "' & $TempKeywordclass_functions & '";' & @CRLF & _; Eine AutoIt Variable übergeben
'char Keywordclass_Defines[] = "' & $TempKeywordclass_defines & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
'char JustUnknown_Functions[] = "' & $TempJustUnknown_functions & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
'char FileCppApi[] = "' & $TempFileCppApi & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
'' & @CRLF & _
'' & @CRLF & _
'//~ Load "cpp.api" File' & @CRLF & _ ; abgeänderte '_FileReadToArray($FileCppApi, $AllIncludeFiles)' Funktion
'CHAR* LoadFile(LPSTR pszFileName)' & @CRLF & _
'{' & @CRLF & _
' HANDLE hFile;' & @CRLF & _
' hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);' & @CRLF & _
' if(hFile != INVALID_HANDLE_VALUE)' & @CRLF & _
' {' & @CRLF & _
' DWORD dwFileSize = GetFileSize(hFile, NULL);' & @CRLF & _
' LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);' & @CRLF & _
' DWORD dwRead;' & @CRLF & _
' ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);' & @CRLF & _
' return pszFileText;' & @CRLF & _
' }' & @CRLF & _
' else' & @CRLF & _
' {' & @CRLF & _
' return 0;' & @CRLF & _
' }' & @CRLF & _
'}' & @CRLF & _
'' & @CRLF & _
'' & @CRLF & _
'//~ Hauptprogramm' & @CRLF & _ ; Hauptschleife
'int main()' & @CRLF & _
'{' & @CRLF & _
' char* AllIncludeFiles = LoadFile(FileCppApi);' & @CRLF & _
' printf("%s", AllIncludeFiles);' & @CRLF & _
'}' )
CppCompile($Cpp) ; Programmcode Kompilieren
CppStdOut($Cpp) ; Einen Rückgabewert über den Stdout Stream abfangen
$TimerCpp = TimerDiff($TimerCpp) / 1000
Local $return = CppExecute($Cpp) ; Programmcode ausführen und den Rückgabewert auffangen - stdout char
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,"Benötigte Zeit : " & $TimerCpp & " Sekunden" & @lf & @lf & 'Selection:' & @lf & '$return' & @lf & @lf & 'Return:' & @lf & $return & @CRLF) ;### Debug MSGBOX
CppExit($Cpp) ; C++ Objekt wieder freigeben
Exit
Die 'Cpp-UDF' Funktion ist auch nur zur Veranschauung, und Funzt so nicht (da Fehlt eben der Rest des Programmes). Ich wollt nur mal Zeigen, das ich nicht nur Schlafe! Aber ich Peil nicht so richtig mit dem C++
Ich hoffe das mir jemand Helfen kann bei meinem Problem
Grüsse von Techmix!