реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> At end of source: error: expected a "}", ошибка в CCS.3
10199
сообщение Dec 10 2010, 09:05
Сообщение #1


Участник
*

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



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

самое странное, что если поставить эту ЛИШНЮЮ скобку, то все компилится и работает :D
что за чудеса?
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 10 2010, 09:20
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Проверьте макросы со {} и условную компиляцию.
Go to the top of the page
 
+Quote Post
10199
сообщение Dec 10 2010, 10:09
Сообщение #3


Участник
*

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



макросов и директив условной компиляции не использовал.
добавил return; в последнюю void функцию - все заработало. странно, выше есть несколько void функций без return в конце, и все хорошо.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 10 2010, 10:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Проверьте include , подключенные к вашему исходнику
Go to the top of the page
 
+Quote Post
10199
сообщение Dec 10 2010, 13:30
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 10 2010, 14:44
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 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, а Вы ей аргументы передавать пытаетесь.

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
10199
сообщение Dec 11 2010, 07:44
Сообщение #7


Участник
*

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



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

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

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

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

из букварей читал только керригана, ничего лучше найти не смог. может, посоветуете?

Сообщение отредактировал 10199 - Dec 11 2010, 07:44
Go to the top of the page
 
+Quote Post
Fry__
сообщение Dec 11 2010, 08:37
Сообщение #8


Участник
*

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

Go to the top of the page
 
+Quote Post
10199
сообщение Dec 11 2010, 09:20
Сообщение #9


Участник
*

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


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

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

пытаюсь чему-то научится, вы тоже уж извините sm.gif совета спросить, вообщем-то, не у кого.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 11 2010, 09:56
Сообщение #10


неотягощённый злом
******

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



Цитата(10199 @ Dec 11 2010, 10:44) *
по поводу функции - не пойму, почему лучше без аргументов?
Да я Вам и не говорю что без аргументов лучше. Я говорю что тип указателя на функцию должен соответствовать типу функции. А у Вас указатель на функцию имеет тип void foo(void), а инициализируете его функцией void bar(xxx,yyy).
И радоваться тут совершенно нечему. Вы подавили варнинги приведя несоответствующие типы вручную. Такое работать не будет. Постарайтесь переписать программу так, чтобы не было приведения типов пользователем. Это Вам ДЗ так-сказать:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 13 2010, 08:47
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



2 ТС: То, что вы тут пытаетесь изобрести, очень очень напоминает (я бы даже сказал - практически один в один совпадает) с таблицей виртуальных функций С++. Может сразу писать на С++, а не пытаться изобразить его на С?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 14 2010, 06:54
Сообщение #12


неотягощённый злом
******

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



До С++ ему пока ещё как до Китая. ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 14 2010, 07:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(demiurg_spb @ Dec 14 2010, 09:54) *
До С++ ему пока ещё как до Китая. ИМХО.
Может быть, но для того, чтобы посмотреть на Великую Китайскую Стену стоит съездить в Китай, а не пытаться построить ее у себя в огороде 1111493779.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01473 секунд с 7
ELECTRONIX ©2004-2016