2017-07-09 7 views
0

Ich habe diese Funktion in C#:Konvertieren von C# Hash-Funktion auf C++

public static unsafe int GetMonoHash(string str) { 
    unsafe { 
     fixed (char* src = str) { 
      char* chPtr2 = src; // + offset; 
      char* chPtr3 = (chPtr2 + str.Length) - 1; 
      int num = 0; 
      while (chPtr2 < chPtr3) { 
       num = ((num << 5) - num) + chPtr2[0]; 
       num = ((num << 5) - num) + chPtr2[1]; 
       chPtr2 += 2; 
      } 
      chPtr3++; 
      if (chPtr2 < chPtr3) { 
       num = ((num << 5) - num) + chPtr2[0]; 
      } 
      return num; 
     } 
    } 
} 

Ich versuchte es in C neu zu schreiben ++ und ich habe so weit:

int Utils::getMonoHash(std::string str) 
{ 
    char* src = &str[0]; 
    char* chPtr2 = src; // + offset; 
-> char* chPtr3 = (chPtr2 + str.length) - 1; 
    int num = 0; 
    while (chPtr2 < chPtr3) { 
     num = ((num << 5) - num) + chPtr2[0]; 
     num = ((num << 5) - num) + chPtr2[1]; 
     chPtr2 += 2; 
    } 
    chPtr3++; 
    if (chPtr2 < chPtr3) { 
     num = ((num << 5) - num) + chPtr2[0]; 
    } 
    return num; 
} 

Diese eine Kompilierungsfehlern wirft:

C3867 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::length': non-standard syntax; use '&' to create a pointer to member 
C2297 '+': illegal, right operand has type 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::*)(void) noexcept const' 

Also änderte ich die angegebene (->) Linie zu

char* chPtr3 = (chPtr2 + (char *)str.length) - 1; 

, die mir einen neuen Übersetzungsfehler gab (nur eine diesmal, yay!):

C2440 'type cast': cannot convert from 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::*)(void) noexcept const' to 'char *' 

Ich habe keine Ahnung, was jetzt zu tun. Ich brauche die C++ - Funktion, um die gleiche Ausgabe wie die C# eine zu haben, wenn dieselbe Eingabe wie die C# eine gegeben wird.

Was mache ich hier?

+3

die kurze Antwort ist: C++ ist nicht C#. –

Antwort

3

str.length keine Eigenschaft ist, es ist eine Funktion und Bedürfnisse()

In meiner Erfahrung als C# -Programmierer, ist dies einer der häufigsten Fehler, C# Programmierer machen, wenn C++ zu schreiben.

1

Was machen Sie? Sie hören auf zu "übersetzen", als ob C++ und C# etwas gemeinsam haben, und schreiben Sie von Grund auf mit Ihren Basisanforderungen — und Ihrem C++ Buch — als Leitfaden.

In diesem Fall ist Ihr Problem, dass Sie eine Member-Funktion falsch verwenden. Es ist str.length(). Die Beschwerden des Compilers lauten, einen Funktionsnamen falsch zu verwenden, ohne ihn tatsächlich aufzurufen.

+0

Nun, diese besondere Methode ist sehr C++ y wie es ist. Ich habe gerade diese Klammer durcheinander gebracht - obwohl IntelliSense mich darüber informieren würde. – Karlovsky120

+0

@ Karlovsky120: Es ist eigentlich nicht. Und du wurdest davon benachrichtigt; Du hast die Nachricht einfach nicht verstanden :) –

2

Vergessen Sie nicht, Klammern nach Str.length. Korrekter Typ sollte so sein

char* chPtr3 = (chPtr2 + str.length()) - 1; 
Verwandte Themen