2014-03-01 109 views
0

我正在使用下面的scala代码,尝试使用虚拟方法表(动态分配)将此代码转换为C语言。动态分配,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' 

我不知道如果我要使用结构设置或我的查找方法是错误的一般!

这里是我的虚函数表:

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

你有没有在任何地方实际声明'Set'? – rightfold

+0

@rightfold你的意思是像在typedef节点?我应该把结构集集? –

+1

如果'set'是一个结构体,那么它的类型名称是'struct set',除非您使用'typedef'为该类型创建了一个昵称。不要忘记,你必须实际设计并声明'struct'! – keshlam

回答

1

正如评论说,看来你忘了你的声明结构:

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

而且,我真的不知道斯卡拉但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; 
    } 
}