2009-03-27 12 views
3

次の行をより安全な方法で書き直し、それを関数として書き直す助けが必要ですが、このコードが関数内で定義されているということは、それは明らかにいくつかの議論を宣言する必要があるため、賢明なやり方を考えることになります。 tablestructisgoodある関数としてCマクロを書き換える手助けが必要

#define CHECK(id) if(table->cells[id]) isgood[table->cells[id]-1] = 0; 

intあります。

+0

"巧妙な"プログラミングには注意してください。デバッグがコーディングの4倍の難しさがある場合は、巧妙なコードを書いてはいけません。デバッグは非常に難しくなります。 (ところで、なぜあなたはC *と* C++としてタグ付けされていますか?) – ojrac

+0

これは最初のマクロですか?コード内で何度も発生しますか? – Arkadiy

+0

isgoodはintですか?それともint []ですか? –

答えて

2

tableidを受け取ってこれを行う関数だけではないのはなぜですか?

void foo(TableType & t, int id) 
{ 
    if (t.cells[id]) 
     isgood[t.cells[id]-1] = 0; 
} 

p.s.

本当に悪いマクロです。名前は非常に誤解を招く。

p.p.s.

全体的には奇妙で、この機能のロジックが私を逃れます。これは正確に何を達成するはずですか?

+0

グローバルでない限り、isgood配列も渡す必要があります。 –

5

ストレート翻訳(卓上>細胞[ID]がint型である場合):と

void check(int id, int*isgood) { if (id) isgood[id-1] = 0; } 

コール:

check(table->cells[id], isgood); 

しかし、私はこれを少し手直し/名前を変更したいです。私は特に名前を変更したいと思います。エラーチェックもありません。つまり、table-> cells [id] == 0の場合、isgood [-1]を設定しようとします。これは悪いことです。

1

一般に、マクロ内の変数を参照しないことをお勧めします。

まず、名前が意味があることを確認します。あなたは何をチェックしていますか?副作用はありますか?

void update_valid_cells(Table& table, int id, BoolArray& validArray) 
{ 
    if(table.cells[id]==NULL) return; 
    validArray[id]-1=false; 
} 
4

どうやらそれはそれで間違っている何 いくつかの引数

を宣言伴うだろうか?あなたがC++で作業している場合

2

、私はクラスのための良い候補のように思えるれ、テーブルのメンバ関数をチェックすることを検討したい:

class Table { 
    //... 
    public bool check(int id) { 
     if (this->cells[id]) { 
      this->isGood[id] = 0; 
      // the line you have, isgood[table->cells[id]-1] = 0 looks buggy: 
      // you treat table->cells[id] as a true/false value one line ago; 
      // probably not a valid array index? I'm taking a stab at what to do. 
     } 
    } 
} 
+0

私はcells [id]がどの要素_is_goodの '参照'であると思いますか。 – xtofl

+0

または、おそらくcells [id]はセル構造体へのポインタの束であり、空のセルは空ですか?私は一種の疑わしいチェック(id)はthis-> cells [id]を返すべきです、そしてそれはisGood配列を初期化するためにループで使われるでしょう...しかし、私の答えでは、彼のマクロがやって – ojrac

1

私はC99がとしての機能を修飾することができると思いますインラインでを実行すると、マクロを使用せずにno-function-callのスピードアップを得ることができます。また、ほとんどのCコンパイラは、この目的のために__inlineのような拡張をサポートしています。

関連する問題