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