Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: At end of source: error: expected a "}"
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
10199
всем привет
писал программку в композере, один заголовочный файл и один с кодом.
потихоньку отлаживаю, и тут он мне выдает такую ошибку - At end of source: error: expected a "}".
т.е. намекает на то, что не хватает фигурной скобки, как я понимаю. просмотрел - все функции закрыты скобочками.
проверил встроенным поиском этих скобок - тоже все в порядке. закомменитировал весь код в функциях - все равно ошибка.
нарочно убрал скобку/поставил лишнюю в заголовке - он это замечает и выдает кипу ошибок.

самое странное, что если поставить эту ЛИШНЮЮ скобку, то все компилится и работает :D
что за чудеса?
xemul
Проверьте макросы со {} и условную компиляцию.
10199
макросов и директив условной компиляции не использовал.
добавил return; в последнюю void функцию - все заработало. странно, выше есть несколько void функций без return в конце, и все хорошо.
Dima_G
Проверьте include , подключенные к вашему исходнику
10199
мда, чтото я окончательно перемудрил:

typedef struct
{
///
void (*performAction)();
///
}dataFlash;

typedef struct
{
///
dataFlash* _dataFlash;
char (*writeDataFlashBuffer)(); ///
}_flash;

void performAction(dataFlash* dF , char doErase);
char writeDataFlashBufferFunction(_flash *flash, unsigned char *buf);

extern dataFlash mem;
extern _flash flash;

соответственно - mem.performAction = (void (*)(long))performAction;
flash.writeDataFlashBuffer = (char (*)(long))writeDataFlashBufferFunction;
и flash._dataFlash = &mem;

теперь, когда я вызываю flash.writeDataFlashBuffer(&flash, &arr) , мне надо вызвать performAction по указателям
но это работает правильно только вот так -
///
flash->_dataFlash->performAction(*(&(flash->_dataFlash)),0);
///
flash->_dataFlash->performAction(*&(flash->_dataFlash),0);
///
если написать строчки одинаково, или поменять местами - я имею в виду разницу в (*(& и (*& - то нифига не работает.
а в таком написании - превосходно.

точно чудеса :/
demiurg_spb
зачем засорять код?
Код
*(&(flash->_dataFlash))
эквивалентно
Код
flash->_dataFlash

пользовательские типы данных в СИ общепринято называть так:
Код
typedef struct
{
...
} data_flash_t;

typedef struct
{
...
} flash_t;

и ещё функция performAction:
Код
void (*performAction)();
лучше и грамотнее с точки зрения СИ так
Код
void (*performAction)(void);

получает и возвращает void, а Вы ей аргументы передавать пытаетесь.

То, что Вы тут продемонстрировали - говнокод редкостный и никаких чудес.
Вам стоит почитать букварь по СИ прежде чем что-либо калякать - сэкономите массу времени.
10199
Цитата
и ещё функция performAction:
Код
void (*performAction)();
лучше и грамотнее с точки зрения СИ так
Код
void (*performAction)(void);

получает и возвращает void, а Вы ей аргументы передавать пытаетесь.

То, что Вы тут продемонстрировали - говнокод редкостный и никаких чудес.
Вам стоит почитать букварь по СИ прежде чем что-либо калякать - сэкономите массу времени.

по поводу функции - не пойму, почему лучше без аргументов? ей тогда придется обращаться к ряду глобальных переменных,
а так - только к собственной структуре.

из букварей читал только керригана, ничего лучше найти не смог. может, посоветуете?
Fry__
Цитата(10199 @ Dec 11 2010, 10:44) *
по поводу функции - не пойму, почему лучше без аргументов? ей тогда придется обращаться к ряду глобальных переменных, а так - только к собственной структуре.


Не поверю что компилятор собирает такое без Warning'ов. В вашем случае на них надо реагировать.

Код
mem.performAction = (void (*)(long))performAction;


при чем тут long?

Код
flash->_dataFlash->performAction(*(&(flash->_dataFlash)),0);


Это бред. Хоть бы типы привели. Так например:

Код
((void (*)(dataFlash *, char)) flash._dataFlash->performAction)(flash._dataFlash, 0);


PS: Программить так не следует, сопровождение подобного - мука. В общем действительно дерьмокод, уж извините.

10199
Цитата(Fry__ @ Dec 11 2010, 11:37) *
Не поверю что компилятор собирает такое без Warning'ов. В вашем случае на них надо реагировать.

Код
mem.performAction = (void (*)(long))performAction;


при чем тут long?

Код
flash->_dataFlash->performAction(*(&(flash->_dataFlash)),0);


Это бред. Хоть бы типы привели. Так например:

Код
((void (*)(dataFlash *, char)) flash._dataFlash->performAction)(flash._dataFlash, 0);


PS: Программить так не следует, сопровождение подобного - мука. В общем действительно дерьмокод, уж извините.


собирает sm.gif могу скинуть лист rebuild'а, если сомневаетесь.

не пойму, зачем типы приводить? если написать flash._dataFlash->performAction(flash._dataFlash, 0); , я же передаю верные типы.

пытаюсь чему-то научится, вы тоже уж извините sm.gif совета спросить, вообщем-то, не у кого.
demiurg_spb
Цитата(10199 @ Dec 11 2010, 10:44) *
по поводу функции - не пойму, почему лучше без аргументов?
Да я Вам и не говорю что без аргументов лучше. Я говорю что тип указателя на функцию должен соответствовать типу функции. А у Вас указатель на функцию имеет тип void foo(void), а инициализируете его функцией void bar(xxx,yyy).
И радоваться тут совершенно нечему. Вы подавили варнинги приведя несоответствующие типы вручную. Такое работать не будет. Постарайтесь переписать программу так, чтобы не было приведения типов пользователем. Это Вам ДЗ так-сказать:-)
XVR
2 ТС: То, что вы тут пытаетесь изобрести, очень очень напоминает (я бы даже сказал - практически один в один совпадает) с таблицей виртуальных функций С++. Может сразу писать на С++, а не пытаться изобразить его на С?
demiurg_spb
До С++ ему пока ещё как до Китая. ИМХО.
XVR
Цитата(demiurg_spb @ Dec 14 2010, 09:54) *
До С++ ему пока ещё как до Китая. ИМХО.
Может быть, но для того, чтобы посмотреть на Великую Китайскую Стену стоит съездить в Китай, а не пытаться построить ее у себя в огороде 1111493779.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.