Относительно макросов - PullRequest
       11

Относительно макросов

0 голосов
/ 07 декабря 2009

могу ли я знать, в чем заключается проблема с использованием приведенного ниже кода x-macro

#define FILL_BUFF_1 (int *)(0x01, 0x02)
#define FILL_BUFF_2 (int *)(0x03, 0x04)

#define X(a,b)

#define LOOK_UP \
     X(0x13, FILL_BUFF_1), \
     X(0x14, FILL_BUFF_2)

#undef X

#define X(a,b) a
int pid_table[2] = {LOOK_UP};
#undef X

#define X(a,b) b

int *pid_buff_ptr[2] = {LOOK_UP};

void main(int argc, _TCHAR* argv[])
{
    printf("%d ", (pid_buff_ptr+0));  // displays 0x02

    printf("%d ", (pid_buff_ptr+1));  // displays 0x04

    printf("%d " ,*(pid_buff_ptr[0] + 1)); // doesnt work
}

Как я могу сделать приведенный выше код для доступа к другим элементам в буфере?

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

(Получая дикий удар от этого только потому, что он сидел здесь без ответа.)

В последней строке вы, кажется, разыменовываете значение 0x03 как указатель - я подозреваю, что вы получаете SIGSEGV?

pid_buff_ptr[0] == 0x02

так

(pid_buff_ptr[0] + 1) == 0x03

так

*(pid_buff_ptr[0] + 1)

разыменовывает 0x03 как указатель.

0 голосов
/ 08 декабря 2009

Я не уверен, что именно вы пытаетесь сделать, но если я правильно угадал, вы хотите, чтобы переменная pid_buff_ptr содержала массив значений int, а не массив значений int *. 1004 *

Если это так, вам нужно изменить

#define FILL_BUFF_1 (int *)(0x01, 0x02)
#define FILL_BUFF_2 (int *)(0x03, 0x04)

до

#define FILL_BUFF_1 {0x01, 0x02}
#define FILL_BUFF_2 {0x03, 0x04}

Изменить следующее:

int *pid_buff_ptr[2] = {LOOK_UP};

до

int pid_buff_ptr[][2] = {LOOK_UP};

Для печати вы должны использовать что-то вроде:

printf("%d ", pid_buff_ptr[0][1]);

Конечно, я могу ошибаться.

Теперь, некоторые другие комментарии:

  • Вам необходимо #include <stdio.h> перед использованием printf().
  • main() возвращает int.
  • Поскольку main() возвращает int, вы должны вернуть int из него. Традиционно 0 означает успех.
  • Я не знаю, что такое _TCHAR, но если это не псевдоним или #define для char, у вас могут быть проблемы.

Даже с учетом вышеприведенных изменений я не понимаю необходимости хитрости с препроцессором. Что именно вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...