Как C утверждает, что эта структура не равна нулю? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь понять (с моим C# фоном), как работает следующее утверждение для msf_s:

https://github.com/ShiftMediaProject/libcdio/blob/master/lib/driver/sector.c#L66

cdio_assert (msf != 0);

https://github.com/ShiftMediaProject/libcdio/blob/master/lib/driver/cdio_assert.h#L50

#define cdio_assert(expr) \
 assert(expr)

https://github.com/ShiftMediaProject/libcdio/blob/master/include/cdio/types.h#L217

  PRAGMA_BEGIN_PACKED
  struct msf_s {
    uint8_t m, s, f; /* BCD encoded! */
  } GNUC_PACKED;
  PRAGMA_END_PACKED

Используется в следующем фрагменте :

lba_t
cdio_msf_to_lba (const msf_t *msf)
{
  uint32_t lba = 0;

  cdio_assert (msf != 0);

  lba = cdio_from_bcd8 (msf->m);
  lba *= CDIO_CD_SECS_PER_MIN;

  lba += cdio_from_bcd8 (msf->s);
  lba *= CDIO_CD_FRAMES_PER_SEC;

  lba += cdio_from_bcd8 (msf->f);

  return lba;
}

По сути, мне нужно повторить то же поведение, но в C#.

Вопрос:

Имеет ли cdio_assert суммы до каждого поля msf_s и утверждать, что они не равны нулю?

Ответы [ 2 ]

5 голосов
/ 31 января 2020

Если вы внимательно посмотрите на код, который вы связали:

void
cdio_lsn_to_msf (lsn_t lsn, msf_t *msf) // <===== here
{
  int m, s, f;

  cdio_assert (msf != 0);

  // ...

Вы увидите, что переменная msf это указатель на переменную типа msf_t. Хотя для структуры не имеет смысла быть 0, указатель вполне может быть 0, он же NULL. Эта строка просто проверяет правильность msf перед ее использованием. В большинстве случаев это делается с помощью if, но эта функция, очевидно, ожидает, что значение будет действительным.

Эквивалентом в C# будет утверждение msf != null.

1 голос
/ 31 января 2020

... и, чтобы уточнить точку Марко, код (ИМХО) должен использовать NULL, а не ноль.

Если вы видите "ноль", вы автоматически принимаете " проверяемая переменная - это число. " Если вы видите NULL, вы автоматически знаете, что это указатель. Хотя два способа сказать, что это может быть эквивалентно и хотя оба могут быть действительными, путаницы, которая привела к этому вопросу, можно было бы избежать, написав исходный код, который clear.

Когда мы читаем исходный код других людей, мы очень сильно руководствуемся этими «последствиями». По этой причине можно смотреть непосредственно на ошибку и не видеть ее.

...