2011-06-26 20 views
1

我創建了一個C擴展,其目的是確定一系列卡是否會導致筆直或不筆直。這個例子可能比展示這個問題所需的更復雜一點,但是本質上foo應該在其內部存儲所有評估過的卡片(每個卡片都有一個指定的索引)。所以酒吧應該有一套完全獨立的牌和索引。但是,似乎當我開始將卡分配給酒吧時,它正在覆蓋foo。我會在下面列出我的代碼,以防我使用指針做錯了事情。爲什麼我的C擴展沒有創建唯一的實例?

>> require 'ext/straight_count' #=> true                        

>> foo = EV::StraightCount.new; 
>> foo.evaluate(6,0); 
>> foo.evaluate(5,1); 
>> foo.evaluate(4,2); 
>> foo.evaluate(3,3); 
>> foo.evaluate(3,4); 
>> foo.evaluate(3,5); 
>> foo.evaluate(3,6); 
>> foo.straight_cards 
=> [] 

>> bar = EV::StraightCount.new; 
>> bar.evaluate(11,0); 
>> bar.evaluate(10,1); 
>> bar.evaluate(9,2); 
>> bar.evaluate(8,3); 
>> bar.evaluate(7,4); 
>> bar.evaluate(2,5); 
>> bar.evaluate(2,6); 
>> bar.straight_cards 
=> [11, 10, 9, 8, 7] 

>> foo.evaluate(3,6); 
>> foo.straight_cards 
=> [11, 10, 9, 8, 7] 

.h文件中

static int *pCards; 
static int *pSortedCards[NUM_CARDS]; 
static int i, rMadeHandIndex, cCards[NUM_CARDS], begin_straight, end_straight; 

VALUE rIsFound = Qfalse; 

static VALUE EV, StraightCount; 

static void reset_score(); 
static VALUE found(); 
static VALUE score(); 
static VALUE straight_cards(); 

回答

4

pSortedCards似乎是一個全球性的。因此,你有共享狀態的原因。

+0

我不明白,我包括我的.h文件,這些變量是如何全局的? –

+0

因爲這就是它們。 :) – Arafangion

+0

好吧,我做了一些閱讀,發現在.h文件中聲明的任何內容都是全局的。不知道這一點。謝謝。 –

相關問題