64-Bit dll aus vorhandenem C-Code erstellen

  • Hallo,

    im nachfolgenden Forumsbeitrag hat Bernd eine superschnelle
    LevenshteinDistance.dll kompiliert die allerdings nur im 32-Bit Modus läuft.
    Den C-Code hat Bernd auch angegeben, ich habe Bernd auch schon eine Mail
    geschrieben, kann ihn aber nicht erreichen.


    [ gelöst ] Strings vergleichen

    Wer kann mir daraus eine 64-Bit dll machen ?
    Bitte mit Preisvorstellung.

    Danke.

    Stefan

    Einmal editiert, zuletzt von Cybercommander (17. Dezember 2012 um 17:24)

  • Habs mal kompiliert - findest du im Anhang.

    Den Code musste ich allerdings bisschen anpassen.
    Keine Ahnung was Bernd für einen Compiler verwendet hatte aber folgende dynamische Deklarierung eines 2D-Arrays ist meiner Meinung nach nicht in Standard-C/C++ vorgesehen:

    Code
    int d[n+1][m+1];

    Teste die Ergebnisse auch mal auf Richtigkeit/Plausibilität.
    Ich hab lediglich den Code umgesetzt und keine Ahnung ob das so stimmt.

    Einmal editiert, zuletzt von AspirinJunkie (1. November 2012 um 09:16)

  • Hallo AspirinJunkie und Greenhorn,

    danke für eure schnelle Antwort, ich habe die DLL gerade getestet, aber es kommt
    immer ein anderes Ergebnis als bei der dll von Bernd und der Autoit-Code Version heraus,
    wobei das Ergebnis von Bernds dll und das vom Autoit-Code gleich sind.

    Wenn ich z.B. "hallo test" mit "hulla test" vergleiche kommt das gleiche Ergebnis raus.
    Bei "hallo test" mit "test hallo" kommt bei Bernds dll 0 und bei der dll von AspirinJunkie 0,9 heraus,
    was sich ja erst ganz toll anghört hat, da die beiden Wörter ja nur verdreht sind, er die falsche
    Reihenfolge aber scheinbar trotzdem erkannt hat.
    Allerdings ist das Ergebnis bei "hallo test" mit "ganz anders" auch 0,9 was nicht sein darf, da die Worte fast nichts gemeinsam haben.

  • Hallo AspirinJunkie,

    vielen Dank, funktioniert super, deine erste Version funktioniert auch, mein Fehler war nur, das ich sie nicht
    mit deinem Autoit Programm aufgerufen habe, sondern die dll wie in dem Beispiel von Bernd aufgerufen habe.
    Tut mir leid, war mein Fehler.
    Alles weitere per Mail.

    Gruß
    Stefan

  • Hab jetzt rausgefunden wie auf der Seite der Similarity-Wert berechnet wird.
    Wenn es wirklich gleich sein soll wie auf der Seite dann wäre dieses Skript die Anpassung:

    Spoiler anzeigen
    [autoit]

    #region
    #AutoIt3Wrapper_UseX64=n ; x64-Code oder x86-Code erstellen
    #endregion

    [/autoit] [autoit][/autoit] [autoit]

    #include "Misc.au3"
    ; Je nach dem ob AutoIt als x64 oder x86-Code ausgeführt wird die entsprechende Dll laden:
    Global Const $h_DLL = DllOpen(_Iif(@AutoItX64, "String-DLL_x64.dll", "String-DLL_x86.dll"))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $s_1 = "Test"
    Global Const $s_2 = "Text"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $a_CompareResult = CompTstr($s_1, $s_2)
    If @error Then
    MsgBox(48,"Fehler", "Fehler beim Ausführen von CompTstr" & @CRLF & @CRLF & "Fehlercode: " & @error & @CRLF & "Extended: " & @extended)
    Else
    MsgBox(0,"Levenshtein-Distanz", StringFormat("String 1:\t%20s\nString 2:\t%20s\n\nLevenshtein-Distanz:\t%3d\nÄhnlichkeit:\t%5.3f", $s_1, $s_2, $a_CompareResult[0], $a_CompareResult[1]))
    EndIf
    DllClose($h_DLL)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Gibt die Levenshtein-Distanz zwischen zwei Strings zurück
    Func CompTstr(Const $s, Const $t)
    Local Const $a_RetDll = DllCall($h_DLL, "int:cdecl", "LevenshteinDistance", "str", $s, "str", $t)
    If @error Then Return SetError(1, @error, -1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_Ret[2] = [$a_RetDll[0], 1 / ($a_RetDll[0] + 1)]
    Return $a_Ret
    EndFunc

    [/autoit]


    Obwohl ich finde das die Aussagekraft dieses Wertes ziemlich begrenzt ist da er nur von der Levenshtein-Distanz abhängig ist und nicht von den Stringlängen.

  • Keine Ahnung was Bernd für einen Compiler verwendet hatte aber folgende dynamische Deklarierung eines 2D-Arrays ist meiner Meinung nach nicht in Standard-C/C++ vorgesehen:

    Code
    int d[n+1][m+1];


    Jo, da habe ich mich auch sehr gewundert.
    Dynamische Arrays kann man in dieser Form eigentlich nur mit konstanten Werten erzeugen.
    (EDIT: und damit sind sie dann per Definition nicht dynamisch.)

    Naja, dann hat es sich wohl erledigt ...


    Gruß
    Greenhorn

  • Hi Stefan,

    ich habe die Datei(en) nur noch einmal angehängt, weil ich sie gestern schon fertig hatte, als ich den Post schrieb.
    Einfach so in den Müll wollte ich es dann auch wieder nicht verschieben.

    Wie auch immer, Quelltext liegt bei. ;)


    Gruß
    Greenhorn