|
|
  |
At end of source: error: expected a "}", ошибка в CCS.3 |
|
|
|
Dec 10 2010, 09:05
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 10-11-09
Пользователь №: 53 534

|
всем привет писал программку в композере, один заголовочный файл и один с кодом. потихоньку отлаживаю, и тут он мне выдает такую ошибку - At end of source: error: expected a "}". т.е. намекает на то, что не хватает фигурной скобки, как я понимаю. просмотрел - все функции закрыты скобочками. проверил встроенным поиском этих скобок - тоже все в порядке. закомменитировал весь код в функциях - все равно ошибка. нарочно убрал скобку/поставил лишнюю в заголовке - он это замечает и выдает кипу ошибок.
самое странное, что если поставить эту ЛИШНЮЮ скобку, то все компилится и работает :D что за чудеса?
|
|
|
|
|
Dec 10 2010, 10:09
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 10-11-09
Пользователь №: 53 534

|
макросов и директив условной компиляции не использовал. добавил return; в последнюю void функцию - все заработало. странно, выше есть несколько void функций без return в конце, и все хорошо.
|
|
|
|
|
Dec 10 2010, 13:30
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 10-11-09
Пользователь №: 53 534

|
мда, чтото я окончательно перемудрил:
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); /// если написать строчки одинаково, или поменять местами - я имею в виду разницу в (*(& и (*& - то нифига не работает. а в таком написании - превосходно.
точно чудеса :/
Сообщение отредактировал 10199 - Dec 10 2010, 13:32
|
|
|
|
|
Dec 10 2010, 14:44
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
зачем засорять код? Код *(&(flash->_dataFlash)) эквивалентно Код flash->_dataFlash пользовательские типы данных в СИ общепринято называть так: Код typedef struct { ... } data_flash_t;
typedef struct { ... } flash_t; и ещё функция performAction: Код void (*performAction)(); лучше и грамотнее с точки зрения СИ так Код void (*performAction)(void); получает и возвращает void, а Вы ей аргументы передавать пытаетесь. То, что Вы тут продемонстрировали - говнокод редкостный и никаких чудес. Вам стоит почитать букварь по СИ прежде чем что-либо калякать - сэкономите массу времени.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 11 2010, 07:44
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 10-11-09
Пользователь №: 53 534

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

Группа: Участник
Сообщений: 17
Регистрация: 26-03-10
Пользователь №: 56 229

|
Цитата(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: Программить так не следует, сопровождение подобного - мука. В общем действительно дерьмокод, уж извините.
|
|
|
|
|
Dec 11 2010, 09:20
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 10-11-09
Пользователь №: 53 534

|
Цитата(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: Программить так не следует, сопровождение подобного - мука. В общем действительно дерьмокод, уж извините. собирает  могу скинуть лист rebuild'а, если сомневаетесь. не пойму, зачем типы приводить? если написать flash._dataFlash->performAction(flash._dataFlash, 0); , я же передаю верные типы. пытаюсь чему-то научится, вы тоже уж извините  совета спросить, вообщем-то, не у кого.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|