|
Странное поведение EWAVR 4.21A, Возникновение ошибки при объявлении структуры |
|
|
|
Feb 28 2008, 21:59
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Вдруг начала возникать ошибка на пустом месте, когда пытаюсь объявить структуру в одном си файле, объявление extern в хедер файле, а применить эту структуру в третьем си файле: Код Error[Pe147]: declaration is incompatible with "struct <unnamed> __near GSM_Rx" (declared at line 27 of "C:\My_Jobs\ C:\My_Jobs\VB1\gsm.c 13 Причем ошибка пропадает, если заменить структуру на отдельные char или передвинуть эти объявления в другие файлы Что это может быть? Час потратил, передвигая структуру с места на место - никакой закономерности не обнаружил, то она есть, то нет Кому не лень, посмотрите у себя, может на другой версии этого глюка нет? Обкоцанный (но с ошибкой) проект прилагаю. От машины не зависит: и на работе, и дома одинаково. Ошибка возникает в файле gsm.c на структуре GSM_Rx
Прикрепленные файлы
VB1.zip ( 15.88 килобайт )
Кол-во скачиваний: 65
|
|
|
|
|
 |
Ответов
|
Feb 29 2008, 09:32
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(zltigo @ Feb 29 2008, 00:55)  Это не вдруг  Все-таки, предложеный вами typedef - это не решение вопроса, а обходной путь. Через typedef все работает. Я вообще typedef применяю только тогда, когда нужно структуру применить несколько раз. В случае уникальной структуры предпочитаю явные определения. Иначе, для того, чтобы посмотреть на члены структуры, приходится лезть лишний раз в хедер. Зачем мне лишняя вложенность, только ухудшает понимабельность. А в этом конкретном случае я решил свести несколько отдельных char в структуру только исходя из эстетических соображений  По стандарту Си мой вариант написания совершенно легален. Цитата(rezident @ Feb 29 2008, 01:12)  ...Пользуйтесь активнее условной компиляцией... Это дельное замечание, буду применять. Раньше писал небольшие проекты, ограничивался несколькими файлами в проекте: main.c; modules.c; isr.c; memory.c; defines.h - все было без проблем. Сейчас проект побольше. А когда в файле больше нескольких тысяч строк, уже неудобно, решил начать делить проект ещё и по периферии. Вот и возникла по-первости такая каша to All: Спасибо за участие, с вашей помощью разобрался, дело в следующем. ИАР не всегда дозволяет в одном модуле наличие собственно определения переменной и определение её как extern. Примеры: Это проходит без ошибок: Код extern char a; extern int b[10]; char a; int b[10];
typedef struct c_t{ char a; int b; } c_t; extern c_t ccc; c_t ccc; extern c_t ccc; А на явное определение struct или union ругается: Код struct { char a; int b; } ddd; extern struct { char a; int b; } ddd; И я не знаю, правильно это или нет. По моему мнению все должно быть однообразно, а не так
|
|
|
|
|
Feb 29 2008, 10:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Feb 29 2008, 12:32)  Все-таки, предложеный вами typedef - это не решение вопроса, а обходной путь. Можно и без typedef, это совершенно не принципиально (см. приложение). Но 1. структуры надо описывать просто, однозначно и в одном месте. 2. нет ни одной причины не использовать typedef везде, где это возможно. Цитата Иначе, для того, чтобы посмотреть на члены структуры, приходится лезть лишний раз в хедер. Проблема в том, что просто нужно использовать нормальные текстовые редакторы, как минимум поддерживающие тэги - решает массу проблем со стилем написания и навигацией, а не только с просмотром структур. Цитата И я не знаю, правильно это или нет. Правильно.
Прикрепленные файлы
gsm_s.rar ( 1.22 килобайт )
Кол-во скачиваний: 59
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 29 2008, 12:32
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(zltigo @ Feb 29 2008, 12:02)  ... 2. нет ни одной причины не использовать typedef везде, где это возможно. Ну почему же, или причина которую я привел не причина? Цитата ... нужно использовать нормальные текстовые редакторы... Дело вкуса и привычки (и главное, лени  ) Код struct GSM_Rx_s { unsigned char Buf[80]; unsigned char Start; ... }; extern struct GSM_Rx_s GSM_Rx; struct GSM_Rx_s GSM_Rx; Такое тоже применяю, мне такая форма нравится даже больше, чем typedef Цитата Правильно. А вот если бы вы объяснили почему, или привели ссылку на страницу стандарта - было бы просто замечательно. В таких вещах верить нА слово не привык. Вот мне все-таки кажется, что компилятор должен был бы ругаться во всех вышеприведенных мною примерах, т.к. объявление в одном модуле переменной и как глобальной и как внешней больше похоже на ошибку.
|
|
|
|
|
Feb 29 2008, 12:46
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Feb 29 2008, 15:32)  объявление в одном модуле переменной и как глобальной и как внешней больше похоже на ошибку. Нет - обычный разумный подход делу, поскольку ругань в таком случае исключает нормальное использование header-ов в файлах, где собственно переменные объявлены. Ни к каким ошибкам это привести не может, поскольку если "снаружи" вдруг еще такая переменная существует, то на это 100% выругается линкер. Цитата Ну почему же, или причина которую я привел не причина? Причина ну никак не относится к использованию или неиспользованию typedef. Или я чего-то совсем не понимаю.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 29 2008, 13:49
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(zltigo @ Feb 29 2008, 14:46)  Причина ну никак не относится к использованию или неиспользованию typedef. Или я чего-то совсем не понимаю. Да, похоже мы одни и те же слова воспринимаем по-разному. Я имею ввиду след: если стандарт в конкретном случае разрешает не применять typedef и я считаю, что так будет наглядней, то нет никаких причин его использовать. Короче, тоже дело вкуса, спорить не о чем Цитата Нет - обычный разумный подход делу, поскольку ругань в таком случае исключает нормальное использование header-ов в файлах, где собственно переменные объявлены. Ни к каким ошибкам это привести не может, поскольку если "снаружи" вдруг еще такая переменная существует, то на это 100% выругается линкер. Со всем этим согласен. Но почему тогда это недопустимо по отношению к структурам, описанным в явном виде: Код extern struct { char a; int b; } ddd; struct { char a; int b; } ddd; Error[Pe147]: declaration is incompatible with "struct <unnamed> __near ddd" Я не вижу логики в действиях компилятора. Или он начинает и в случае extern выделять память?
|
|
|
|
|
Feb 29 2008, 14:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Baser @ Feb 29 2008, 16:49)  Я имею ввиду след: если стандарт в конкретном случае разрешает не применять... ... Короче, тоже дело вкуса, спорить не о чем  Стандарт языка позволяет многое чего не применять, он даже совершенно спокойно позволяет делать массу ошибок  , но при этом дает некоторые средства для контроля над типами уменьшающие вероятность потенциальных ошибок. Пользоваться или нет - это не "дело вкуса", это показатель уровня владения инструментом. На рояле я тоже могу чего-нибудь настучать одним пальцем - он мне это вполне позволит, только рассуждать о вкусах я при этом не буду  Цитата Я не вижу логики в действиях компилятора. Или он начинает и в случае extern выделять память? Для начала я не вижу логики в действиях программиста дважды определившего одну и ту-же структуру. Дальнейшие логические построения, рассуждения и толкования должен-ли 'extern' служить решающим указанием компилятору для того, что-бы считать это нагромождение разумным, меня с практической точки зрения совершенно не интересуют. Однако, поведение любого компилятора молча глотающего подобные выражения сочту совершенно неправильным.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Baser Странное поведение EWAVR 4.21A Feb 28 2008, 21:59 zltigo Цитата(Baser @ Feb 29 2008, 00:59) Вдруг ... Feb 28 2008, 22:55 rezident Объявления лучше делать именно в том модуле, где п... Feb 28 2008, 23:12      Baser Цитата(zltigo @ Feb 29 2008, 16:25) Для н... Feb 29 2008, 16:06       zltigo Цитата(Baser @ Feb 29 2008, 19:06) Не над... Feb 29 2008, 16:50        Baser Цитата(zltigo @ Feb 29 2008, 18:50) Кстат... Feb 29 2008, 21:16         zltigo Цитата(Baser @ Mar 1 2008, 00:16) что при... Feb 29 2008, 21:50          Baser Ну, хорошо, будем считать, что я удовлетворился, в... Feb 29 2008, 22:35           zltigo Цитата(Baser @ Mar 1 2008, 01:35) ... пох... Feb 29 2008, 23:12            Baser Цитата(zltigo @ Mar 1 2008, 01:12) А как ... Mar 1 2008, 14:21             zltigo Цитата(Baser @ Mar 1 2008, 17:21) ... и о... Mar 1 2008, 17:34              Baser Вы неправильно поняли мои возражения против typede... Mar 1 2008, 21:33               zltigo Цитата(Baser @ Mar 2 2008, 00:33) Если вы... Mar 1 2008, 22:43                Baser Да, наверное, вы как всегда правы
Цитата(zltig... Mar 2 2008, 12:47                 zltigo Цитата(Baser @ Mar 2 2008, 15:47) Да, нав... Mar 2 2008, 13:02                  Baser Цитата(zltigo @ Mar 2 2008, 15:02) Можно,... Mar 2 2008, 22:34       rezident Цитата(Baser @ Feb 29 2008, 21:06) И все.... Feb 29 2008, 21:12 MALLOY2 По ходу вопрос, может я и гоню....
Не получается... Mar 4 2008, 14:48 Сергей Борщ Так сделать невозможно - какой размер будет иметь ... Mar 4 2008, 15:09 Baser Цитата(MALLOY2 @ Mar 4 2008, 16:48) Не по... Mar 4 2008, 15:11  zltigo Цитата(Baser @ Mar 4 2008, 18:11) ...беск... Mar 4 2008, 16:28 MALLOY2 Сорри это я опечатался естественно там указатель.
... Mar 4 2008, 15:13 zltigo Цитата(MALLOY2 @ Mar 4 2008, 18:13) Кодty... Mar 4 2008, 16:19 Сергей Борщ Цитата(MALLOY2 @ Mar 4 2008, 17:13) Кодty... Mar 4 2008, 17:01 MALLOY2 Спс, помогло Mar 4 2008, 16:27 chernenko Чтобы не плодить темы решил написать здесь.
Подска... Oct 1 2008, 12:45 Сергей Борщ Цитата(chernenko @ Oct 1 2008, 15:45) Что... Oct 1 2008, 13:09  chernenko Цитата(Сергей Борщ @ Oct 1 2008, 17:09) З... Oct 10 2008, 07:02 IgorKossak Ну у Вас опять же выделено место только под указат... Oct 10 2008, 09:04 chernenko IgorKossak,
Да, точно. Глюканул. Всё работает.
К... Oct 10 2008, 10:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|