2016-07-25 11 views
0

Ich versuche, den folgenden C++ 11-Code in C# mit Visual Studio 2012 zu konvertieren:C++ 11 bis C# -Code-Konvertierung Problem

typedef enum { _A,_B,_C,_D,_E,_F,_G,_H,_I,_J,_K,_L,_M,_N,_O,_1,_2,_3 } TKeyIdentity; 
typedef std::vector<TKeyIdentity const>  TKeyPath; 
typedef std::vector<TKeyPath const>   TKeyMap; 

const TKeyMap keyPad = 
{ 
    { _H, _L },   // A 
    { _I, _K, _M },  // B 
    { _F, _J, _L, _N }, // C 
    { _G, _M, _O },  // D 
    { _H, _N }   // E 
} 

const TKeyPath keyPadRoot = 
{ 
    _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _1, _2, _3 
}; 

TraverseKeyPaths(TKeyPath const &keyPath, int pressesRemaining, int vowelsAllowed) 
{ 
    for (auto pressedKey: keyPath) 
    { 
      int value = TraverseKeyPaths(keyPad[ pressedKey ],pressesRemaining, vowelsAllowed - isVowel[pressedKey]);  
    } 
} 

Die komplette C++ Code verfügbar ist: http://lucid-motif.blogspot.com/2013/11/coding-puzzle-knight-sequences.html

C# -Code :

enum TKeyIdentity { _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _1, _2, _3 }; 
List<string> keyPadRoot = new List<string> { "_A", "_B", "_C", "_D", "_E", "_F", "_G", "_H", "_I", "_J", "_K", "_L", "_M", "_N", "_O", "_1", "_2", "_3" }; 

string[] A = new string[] { "_H", "_L" }; //A 
string[] B = new string[] { "_I", "_K", "_M" }; //B 
string[] C = new string[] { "_F", "_J", "_L", "_N" }; //C 
string[] D = new string[] { "_G", "_M", "_O" }; //D 

List<string> keyPadMoves = new List<string>(); 
keyPadMoves.AddRange(A); 
keyPadMoves.AddRange(B); 
keyPadMoves.AddRange(C); 
keyPadMoves.AddRange(D); 
. 
. 

int TraverseKeyPaths(List<string> keyPadRoot, int pressesRemaining, int vowelsAllowed) 
{ 
    foreach (TKeyIdentity pressedKey in Enum.GetValues(typeof(TKeyIdentity))) 
    { 
     int value = TraverseKeyPaths(keyPadRoot, pressesRemaining, vowelsAllowed); 
    } 
} 

Der C# -Code funktioniert nicht wie erwartet. Das Problem ist mit der folgenden Zeile:

TraverseKeyPaths(keyPadRoot, pressesRemaining, vowelsAllowed); 

ich ersten Parameter als keyPadMoves geben muß; aber wenn ich keyPadMoves übergebe, geht der rekursive Aufruf in eine Endlosschleife.

+0

wo die Kennung 'vowels' kommen? Es unterscheidet sich auch von Ihrem C++ - Code, der den folgenden Ausdruck übergibt: 'vowelsAllowed - isVowel [pressedKey]' – Jakotheshadows

+1

Es sieht nicht so aus, als hätten Sie einen Basisfall in Ihrer rekursiven Funktion. Soll der pressesRemaining-Parameter irgendwo verwendet werden? Es wird in Ihrer Funktion nicht referenziert oder geändert. – Tofystedeth

+1

Der C++ - Code wird nicht ausgeführt. Der C# -Code wird aus dem gleichen Grund nicht ausgeführt und enthält offensichtliche Tippfehler, die nicht mit Ihrer Frage zusammenhängen. Der C++ - Code, der darüber hinaus nicht ausgeführt wird, ist ebenfalls ein schlecht geformtes Programm aufgrund von Bezeichnern, die mit einem "_" beginnen, gefolgt von einem Großbuchstaben. Darüber hinaus haben Sie nicht beschrieben, was Sie versucht haben, um Ihr Problem zu lösen (haben Sie beispielsweise einen Debugger verwendet?) – Yakk

Antwort

0

Sie haben alle Arten von Code in Ihrem C# Äquivalent versucht, die nicht dem ursprünglichen C++ - Code entsprechen. Hier ist eine direkte Übersetzung übersetzbar, vorausgesetzt, Sie haben ‚isVowel‘ irgendwo definiert:

using System.Collections.Generic; 

public enum TKeyIdentity 
{ 
    _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _1, _2, _3 
} 

public class TraverseKeyPaths 
{ 
    public readonly List<List<TKeyIdentity>> keyPad = new List<List<TKeyIdentity>>() 
    { 
     new List<TKeyIdentity> {TKeyIdentity._H, TKeyIdentity._L}, 
     new List<TKeyIdentity> {TKeyIdentity._I, TKeyIdentity._K, TKeyIdentity._M}, 
     new List<TKeyIdentity> {TKeyIdentity._F, TKeyIdentity._J, TKeyIdentity._L, TKeyIdentity._N}, 
     new List<TKeyIdentity> {TKeyIdentity._G, TKeyIdentity._M, TKeyIdentity._O}, 
     new List<TKeyIdentity> {TKeyIdentity._H, TKeyIdentity._N} 
    }; 

    public readonly List<TKeyIdentity> keyPadRoot = new List<TKeyIdentity>() { TKeyIdentity._A, TKeyIdentity._B, TKeyIdentity._C, TKeyIdentity._D, TKeyIdentity._E, TKeyIdentity._F, TKeyIdentity._G, TKeyIdentity._H, TKeyIdentity._I, TKeyIdentity._J, TKeyIdentity._K, TKeyIdentity._L, TKeyIdentity._M, TKeyIdentity._N, TKeyIdentity._O, TKeyIdentity._1, TKeyIdentity._2, TKeyIdentity._3 }; 

    public TraverseKeyPaths(List<TKeyIdentity> keyPath, int pressesRemaining, int vowelsAllowed) 
    { 
     foreach (var pressedKey in keyPath) 
     { 
      int value = new TraverseKeyPaths(keyPad[(int)pressedKey], pressesRemaining, vowelsAllowed - isVowel[pressedKey]); 
     } 
    } 
} 
+0

Ja - Sie haben recht - ich habe sowohl C++ als auch C# verwendet - vielen Dank – Peti