2014-03-01 70 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; 
    } 
}