动态调度,C

时间:2014-03-01 12:16:03

标签: 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);
}

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

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

我不确定是否必须使用struct Set或者我的find方法一般都是错误的!

这是我的视力表:

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

1 个答案:

答案 0 :(得分:1)

如评论中所述,您似乎忘记了申报结构:

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

此外,我真的不知道Scala,但在find()看起来如果找不到匹配,该函数实际上会创建一个新的Set,所以我想应该有一个{ {1}}在您的函数中。 你能告诉我们scala Set结构吗?

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

Set