2016-11-03 3 views
0

В struct my_struct имеется указатель на функцию, называемый compute(). Он объявлен как таковой:Ошибка указателя функции Struct

struct my_struct 
{ 
    double (*compute) (double input); 
} 

В отдельном файле, я инициализацию, что структура, так что я могу указать эту функцию в другую.

static const struct my_struct data; 
data.compute = ...... 

Проблема не в том, что бы я ни установить указатель на функцию, я получаю следующее сообщение об ошибке для data.compute:

error: expected '=', ',', ';', 'asm', or '__attribute__' before '.' token 

я использовал элементы данных структур много раз, используя '.' оператора, но я никогда не использовал указатели на функции. Здесь что-то другое нужно?

+1

Он должен работать нотационно, но поскольку вы определили структуру как 'const', вы можете ее инициализировать и не назначать ей после инициализации. Однако, это другая ошибка от той, которую вы получаете.Он ведет себя так, как будто 'data' - это не простое слово - как будто это макрос расширяется в нечто странное или что-то в этом роде. Тип структуры объявляется в заголовке, не так ли? И у него есть точка с запятой после '}', не так ли? –

+0

Да, const не проблема. Я попытался удалить его, только чтобы получить ту же ошибку. Любая идея, как решить эту последнюю часть, о которой вы говорите? – Bob

+0

Недостаточно кода - вы не предоставили MCVE ([MCVE]) - у нас нет кода, который мы можем скомпилировать и увидеть ошибку, которую вы видите (или что-то подобное). Нам нужен ваш заголовок и минимальный набор кода, который показывает проблему. Вы пишете 'data.compute = ...' внутри функции, не так ли? (_Hmmm: Я не подозреваю, что вы не должны использовать инициализацию '... data = {...};' или переместить назначение внутри функции.) –

ответ

1

Он должен работать нотационно, хотя, поскольку вы определили структуру как const, ее можно инициализировать и не назначать после инициализации.

Однако, это отличная ошибка от той, которую вы получаете. Он ведет себя немного, как если бы data не простое слово - как будто это макрос расширился в нечто странное или что-то в этом роде. Тип структуры объявляется в заголовке, не так ли? И после запятой у нее есть точка с запятой, не так ли?

Да, const не проблема. Я попытался удалить его, только чтобы получить ту же ошибку. Любая идея, как решить эту последнюю часть, о которой вы говорите?

На одном уровне, там не хватает кода - вы не предоставили MCVE (Minimal, Complete, and Verifiable Example) - у нас нет никакого кода, который мы можем скомпилировать и увидеть ошибки, вы видите (или нечто подобное). Нам нужен ваш заголовок и минимальный набор кода, который показывает проблему.

Вы пишете data.compute = … внутри функции, не так ли? (Хммм: Я подозреваю, что не - вы должны либо использовать инициализацию … data = { … }; или переместить присваивание внутри функции.)

Нет, это не в функции. Не могли бы вы подробнее рассказать о … data = { … };? Я не понимаю этот синтаксис; что представляет первый ?

Первый является static const struct my_struct, но я чувствовал себя слишком ленив, чтобы copy'n'paste. Итак, вам нужно:

static const struct my_struct data = { .compute = sin }; 

или что-то подобное (если вы включаете <math.h> предоставить декларацию для sin - или использовать некоторые другие функции, которые вы уже объявлены или определены). Если вы застряли без C99 или более поздней версии компилятора):

static const struct my_struct data = { sin }; 

Вы не можете писать задания вне функций - это ваша проблема. Вы должны использовать инициализатор или написать назначение внутри функции и удалить const.

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