Как я могу указать на начало функции в C? - PullRequest
3 голосов
/ 28 февраля 2011

Я пишу программу для своего класса, которая ОЧЕНЬ упрощенно имитирует способ, которым операционная система будет обрабатывать прерывание.

В C у меня есть массив INTERRUPT_TABLE[], с которым я объявил:

typedef void (*FN_TYPE)();

extern FN_TYPE INTERRUPT_TABLE[];

Я хочу установить его так, чтобы каждая позиция в массиве указывала на начало другой функции, которая содержится в другом месте моей программы - например, INTERRUPT_TABLE[0] должна указывать на начало функции handle_trap().

Я думал, что могу просто сказать: INTERRUPT_TABLE[0] = handle_trap; но это не работает. Я получаю сообщение об ошибке компилятора: «kernel.c: 134: error: подписанное значение не является ни массивом, ни указателем». Кто-нибудь знает, что я делаю не так?

Спасибо за помощь.

редактировать: разобрался! У меня был INTERRUPT_TABLE выше функций, которые я пытался вызвать, поэтому они автоматически объявлялись как целые числа

Ответы [ 3 ]

4 голосов
/ 28 февраля 2011

Определить «не работает». Это должно работать. Я подозреваю, что нам не хватает некоторого контекста. Вы пытаетесь инициализировать INTERRUPT_TABLE, говоря «1001» где-то на верхнем уровне? Этот конкретный синтаксис не будет работать там, но будет работать в теле функции. В качестве альтернативы вы можете использовать синтаксис инициализатора:

  FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };
1 голос
/ 28 февраля 2011

Чтобы уточнить ответ Логана:

Только (функция и объект) объявления могут появляться во "внешнем" или файловом контексте.

Пока FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };определение с инициализацией, следующее имеет одно определение и одну операцию присваивания:

FN_TYPE INTERRUPT_TABLE[];
INTERRUPT_TABLE[0] = handle_trap;

Это присваивание не может появляться на верхнем уровне и интерпретируется как переопределение INTERRUPT_TABLE.

Однако это не совпадает с сообщением об ошибке, которое вы вернули.Для чего это стоит, эта простая программа успешно компилируется:

typedef void (*FN_TYPE) ();

extern FN_TYPE INTERRUPT_TABLE[];

void handle_trap() {
}

int main() {
    INTERRUPT_TABLE[0] = handle_trap;
}
0 голосов
/ 28 февраля 2011

Когда вы говорите в другом месте, я предполагаю, что это не в том же файле.Поэтому вам либо нужен заголовочный файл, который объявляет handler_trap (), либо вы должны объявить его вручную в вашем C-файле перед его использованием:

extern void handler_trap();

В противном случае компилятор не знает, что handler_trap () является функцией, котораяВозвращаемое значение или ожидаемые параметры.

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