2009-03-27 2 views
3

Мне нужна помощь в перезаписи следующей строки более безопасным способом и переписывании ее как функции, однако тот факт, что этот код определен внутри функции, затрудняет мне работу думать о умном способе делать это, потому что, по-видимому, это связано с объявлением нескольких аргументов.Нужна помощь в перезаписи макроса C как функции

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

, где table является struct и isgood является int.

+0

Будьте осторожны с «умным» программированием; если отладка в четыре раза сложнее кодирования, тогда вам следует избегать написания умного кода: отладка становится чрезвычайно сложной. (Кстати, почему вы помечены как C * и * C++?) – ojrac

+0

Почему это макрос в первую очередь? Это происходит несколько раз в коде? – Arkadiy

+0

isgood - это int? Или это int []? –

ответ

2

Почему не просто функция, которая принимает table и id и делает это?

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

по-видимому, это означало бы объявить несколько аргументов

Что не так с этим?

2

Если вы работаете в C++, я бы рассмотреть возможность проверить функцию-член таблицы, что кажется хорошим кандидатом для класса:

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

Я предполагаю, что ячейки [id] являются «ссылкой» на какой элемент _is_good. – xtofl

+0

Или, может быть, ячейки [id] - это куча указателей на клеточные структуры, а пустые - пустые? Я вроде подозрительный чек (id) должен вернуть this-> cells [id], и он будет использоваться в цикле для инициализации массива isGood ... но в моем ответе я попытался придерживаться того, что его макрос был делает. – ojrac

1

Я думаю, что C99 может претендовать функции, inline, поэтому вы получаете ускорение вызова без функции без использования макросов. Кроме того, большинство компиляторов C поддерживают такие расширения, как __inline для этой цели.

Смежные вопросы