2011-10-19 15 views
0

私の推測はです。しかし、私が見ているすべての例では、item_typeのインスタンスitem_type_instanceを作成しています。しかし、私の場合は、私は私の配列がちょうど0と1配列を参照する列挙型を追加するにはどうすればいいですか?

enum item_type {weight, cost}; 

を使用して、簡単に定義し、0と1

void algo(int cost_low,int cost_high,int throw_weight, int item_id) 
    { 
    int quantity,remainder; 
    quantity=throw_weight/item_matrix[item_id][0]; 
    remainder=throw_weight%item_matrix[item_id][0]; 
    if(remainder==0) 
    { 
    cost_low=(quantity-1)*item_matrix[item_id][1]; 
    cost_high=quantity*item_matrix[item_id][1]; 
    throw_weight-=(quantity-1)*item_matrix[item_id][0]; 
    } 
    else 
    { 
    cost_low=quantity*item_matrix[item_id][1]; 
    cost_high=(quantity+1)*item_matrix[item_id][1]; 
    throw_weight-=quantity*item_matrix[item_id][0]; 
    } 
    } 
+0

、このアルゴは副作用を持たない、また戻り値...だからそれは、ボイドのfoo 'と同等です(){}'。 'cost_low'、' cost_high'、 'throw_weight'を' algo(int&cost_low etc ...) 'のように参照で渡さない限り、 – xtofl

+0

はい、私はcost_low、cost_high、throw_weight ...の参照として渡したいです。 – user1001776

答えて

1

のために軽量化、低コストを代用しないため、記述何かをしたい...もっと単純です列挙子は0と1であることを:enumintへの標準変換はあなたがインデックスに配列を列挙を使用できるようになります

enum item_type 
{ 
    weight = 0 
    , cost = 1 
}; 

+0

0と1はデフォルトです.. correct ... iはこれを明示的に指定する必要はありません – user1001776

+2

はい、0と1はデフォルト値ですが、これを明示的にしたいとします。さもなければ、誰かが後で来て、列挙子の順序を入れ替えて、あなたのコードが動作しなくなるかもしれません。 –

+1

'weight'と' cost'の値がそれぞれ0と1になっているのであれば、@ K-balloは明示的にその値を明示し、それらの値を持つ必要がある将来のコード管理者へのシグナルとして指定します。それは、列挙の中に新しい項目を挿入することを止め、あなたのコードを壊します。 –

0

私はあなたの質問を正しく理解していれば、enumを配列のインデックスとして使用すると思います。

quantity=throw_weight/item_matrix[item_id][weight]; //weight <=> 0 
cost_low=(quantity-1)*item_matrix[item_id][cost]; //cost <=> 1 

weightの値とcostがそれぞれ01をしているので、上記のコードは完全に罰金です:もしそうなら、あなたはそれを行うことができます。列挙の値が指定されていない場合は、0で始まり、後続の列挙ラベルごとに1をインクリメントします。

+0

だからそれは簡単です。これはうまくいくのでしょうか? – user1001776

+0

@ user1001776:はい。なぜあなたは試してみませんか? – Nawaz

+0

誰かがこれを言うと知っていました...私はちょうど約600行のコードをリファクタリングしました...そして、思考ミスを掘るのにはしばらく時間がかかるでしょう。あなたは正しいです – user1001776

3

もちろんこれは可能です。配列よりも意味のある何かによってのitemを表現するのではないでしょうか?

struct Item { 
    int weight; 
    int cost; 
}; 

この

は、より読みやすく、あなたのアルゴリズムをレンダリングすることがあります。

void algo(int cost_low,int cost_high,int throw_weight, int item_id) 
    { 
    int quantity,remainder; 
    Item& item = item_matrix[item_id]; 
    quantity=throw_weight/item.weight; 
    remainder=throw_weight%item.weight; 
    if(remainder==0) 
    { 
    cost_low=(quantity-1)*item.cost; 
    cost_high=quantity*item.cost; 
    throw_weight-=(quantity-1)*item.weight; 
    } 
    else 
    { 
    cost_low=quantity*item.cost; 
    cost_high=(quantity+1)*item.cost; 
    throw_weight-=quantity*item.cost; 
    } 
    } 

あまりにも、さらにリファクタリングすることが可能になり、そしてItemに計算を委託することがあります。

- 私は抵抗することができませんでしEDIT ...それはすべてitem.xxx表記を取り払う、Item自体に委譲することが可能にです。

struct Item { 
    int weight; 
    int cost; 

    void algo(int& cost_low, int& cost_high, int& throw_weight) { 
     int quantity = throw_weight/weight; 
     int remainder = throw_weight % weight; 

     cost_low=(quantity-1)*cost; 
     cost_high=quantity*cost; 
     throw_weight -= (quantity-1)*weight; 

     if(remainder != 0) { 
     cost_low += cost; 
     cost_high += cost; 
     throw_weight += weight; 
     } 
    } 
}; 

用途:ところで

item_matrix[item_id].algo(cost_low, cost_high, throw_weight); 
+0

しかし、配列で私はメモリがどのようにレイアウトされているか知っています...継続的に...しかし構造体のために私は.. – user1001776

+0

あなたはそれを見ることができます、あまりにも。 – xtofl

+0

どのように私はそれを見て – user1001776

関連する問題