我正在使用以下 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/