c - 动态调度,C

标签 c scala dispatch

我正在使用以下 scala 代码,尝试使用虚拟方法表(动态调度)将此代码转换为 C。

这是scala中的代码:

abstract class Node(n: String) {
  val id = Node.next
  var name: String = n
  def size: Int
  def nrNodes: Int = 1
  def find(q: String): Set[Node] = 
    if(name.contains(q)) Set(this) else Set()
}

我的问题是这部分代码:

def find(q: String): Set[Node] = 
        if(name.contains(q)) Set(this) else Set()

我正在尝试将其翻译成 C 语言,这是我目前所拥有的:

Set find(Node *n, char * s){
 if(strstr(s,n->name)!=0){
   return (Set) n->name;
 }
 return ((Set (*)(Node *))  n->vtable[FIND])(n);
}

因此,如果 find 包含节点,则返回一组节点,否则返回空集。当我运行它时,它给出以下错误:

error: unknown type name 'Set' 
use of undeclared identifier 'Set'

我不确定是否必须使用 struct Set 或者我的 find 方法总体上是错误的!

这是我的虚函数表:

enum Node_vtablekeys{
  SIZE=0,
  NRNODERS=1,
  FIND=2
};

最佳答案

正如评论中所说,您似乎忘记声明您的结构:

typedef struct _set
{
    // Whatever Set must contains
} Set;

此外,我不太了解 Scala,但在 find() 中,如果找不到匹配项,该函数实际上会创建一个新的 Set所以我想你的函数中应该有一个malloc。 你能给我们展示一下 scala Set 结构吗?

根据您使用 find() 的方式,返回引用可能比返回 Set 结构本身更有用。

Set * find(Node *n, char * s)
{
    if(strstr(s,n->name)!=0)
    {
       return (Set) &(n->name);
    }
    else
    {
        Set * new_set = malloc(sizof(Set));
        // Copy attributes from n->vtable[FIND])(n) to new_set
        return new_set; 
    }
}

关于c - 动态调度,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22114217/

相关文章:

c++ - Znwm和ZdlPv在汇编中是什么意思?

java - 如何调用重载方法的最具体版本?

c - fgets溢出后如何清除输入缓冲区?

java - 斯卡拉 2.12 : What is the equivalent of Java 8 method reference for universally quantified SAM trait?

c - 如何在没有终端的情况下启动 gvim?

scala - Spark 连接数组

scala - 如何针对可变和不可变映射进行编程?

swift - 将函数重新格式化为 swift 3.0 语法

c++ - 递归宏传播的结果是什么?

cURL 获取响应