定义&;使用代理数组 哇,这在C或C++中是如此简单。我正试图用C#编写一个工具来解析已编译的C代码(即汇编程序输出),以便计算嵌入式系统应用程序中每个函数的堆栈使用情况。但这并不重要。我如何创建一个“函数指针”数组并遍历它们,调用它们指向的函数

定义&;使用代理数组 哇,这在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

我已经尝试了大约1000种不同的
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;
     }
  };