定义&;使用代理数组 哇,这在C或C++中是如此简单。我正试图用C#编写一个工具来解析已编译的C代码(即汇编程序输出),以便计算嵌入式系统应用程序中每个函数的堆栈使用情况。但这并不重要。我如何创建一个“函数指针”数组并遍历它们,调用它们指向的函数
我已经尝试了大约1000种不同的定义&;使用代理数组 哇,这在C或C++中是如此简单。我正试图用C#编写一个工具来解析已编译的C代码(即汇编程序输出),以便计算嵌入式系统应用程序中每个函数的堆栈使用情况。但这并不重要。我如何创建一个“函数指针”数组并遍历它们,调用它们指向的函数,c#,C#,我已经尝试了大约1000种不同的delegate和delegate和Func以及参数化构造函数,但我不知道如何在我的VS2013编辑器中消除所有讨厌的红色扭曲线条: public struct Parser { public string platformName; public Delegate d_isThisPlatform; public Delegate d_parseAsm; public Parser(string platform
delegate
和delegate
和Func
以及参数化构造函数,但我不知道如何在我的VS2013编辑器中消除所有讨厌的红色扭曲线条:
public struct Parser
{
public string platformName;
public Delegate d_isThisPlatform;
public Delegate d_parseAsm;
public Parser(string platformName, Delegate isThisPlatform, Delegate parseAsm)
{
this.platformName = platformName;
this.d_isThisPlatform = isThisPlatform;
this.d_parseAsm = parseAsm;
}
};
public static bool PIC32MX_GCC_isThisPlatform(string asmFileContents)
{
return false; // stub
}
public static bool PIC32MX_GCC_parseAsm(string asmFileContents)
{
return false; // stub
}
public static bool M16C_IAR_isThisPlatform(string asmFileContents)
{
return true; // stub
}
public static bool M16C_IAR_parseAsm(string asmFileContents)
{
return false; // stub
}
const Parser[] parsers =
{
new Parser("PIC32MX_GCC", PIC32MX_GCC_isThisPlatform, PIC32MX_GCC_parseAsm),
new Parser("M16C_IAR", M16C_IAR_isThisPlatform, M16C_IAR_parseAsm)
};
public Parser findTheRightParser(string asmFileContents)
{
foreach(Parser parser in parsers)
{
if (parser.d_isThisPlatform(asmFileContents))
{
Console.WriteLine("Using parser: ", parser.platformName);
return parser;
}
}
}
我当前的错误(对于上面列出的代码)是“
与‘staticAnalysis.Program.Parser.Parser(string,System.Delegate,System.Delegate)’最匹配的重载方法”有一些无效参数。
“我不赞成使用System.Delegate
;如果我可以简单地使用delegate
,那将是我的首选,但更重要的是,我对一些简单的东西感兴趣。delegate
对于您试图做的事情来说,是一个太宽泛的类。您需要指定委托可以预期的输入和将生成的输出(如果有)。您可以将它们指定为接受字符串并返回布尔值的函数:
public struct Parser
{
public string platformName;
public Func<string, bool> d_isThisPlatform;
public Func<string, bool> d_parseAsm;
public Parser(string platformName,Func<string, bool> isThisPlatform, Func<string, bool> parseAsm)
{
this.platformName = platformName;
this.d_isThisPlatform = isThisPlatform;
this.d_parseAsm = parseAsm;
}
};
修复该问题后,您将遇到另外两个编译器错误。这些修正是留给你的学习经验……<哇,这在C或C++中是如此简单。“我第一次听说:-为什么不使用几个用一个字符串属性实现相同接口的类(<代码>平台名< /COD>)和两个函数?”AndrewShepherd -是的。对于来自EE背景的人来说,C“有意义”。它的基本数据类型,包括任何类型的指针,只不过是所有数据类型中最基本的CPU寄存器上的装饰器:在大多数硬件上,整数和指针之间实际上没有区别。C++依赖于所使用的特征,只是略微从“意义上”中删除,而就原始指针而言,它与C.java和C“完全没有意义”是相同的。嗯,还不算太糟,但它们与硬件的距离更远,而且从直觉上看不出引擎盖下发生了什么。@phonetagger但这就是高级语言的意义所在-您将代码从原始硬件中抽象出来。这样,应用程序就不需要完全独立的代码库就可以在Intel、PowerPC上运行,更不用说现在移动设备中的各种硬件了。如果你想直接对硬件进行编码,C++仍然是你的选择。我只是回应安德鲁斯赫普德的评论。C语言当然比C语言简单。要做一些简单的事情,比如创建一个函数指针表并向下扫描该表,从表的每一行调用一个函数,在C语言中是很简单的。如果你理解了这个概念、行话和语法,我想在C语言中可能也很简单。那还不是我现在的位置。但是谢谢你的回答。在你回答之前,我很确定我尝试了你两个选项的变体,可能已经得到了你提到的“另外两个编译器错误”。
public struct Parser
{
public delegate bool ParseDelegate(string content);
public string platformName;
public ParseDelegate d_isThisPlatform;
public ParseDelegate d_parseAsm;
public Parser(string platformName,ParseDelegate isThisPlatform, ParseDelegate parseAsm)
{
this.platformName = platformName;
this.d_isThisPlatform = isThisPlatform;
this.d_parseAsm = parseAsm;
}
};