|
Варнинг компоновщика, Что это может означать? |
|
|
|
Jan 23 2007, 18:02
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(boez @ Jan 23 2007, 17:57)  Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор. Какой компилятор и линкер используются? да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A
|
|
|
|
|
Jan 23 2007, 18:14
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(IgorKossak @ Jan 23 2007, 18:03)  Не забыли охранник поставить в файле menu.h? Код #ifndef _MENU_H_ #define _MENU_H_ ... #endif нет, не забыл. да если бы забыл, то ругался бы компиллятор - "редекларация"
|
|
|
|
|
Jan 23 2007, 18:23
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Sergio66 @ Jan 23 2007, 21:31)  Есть такое определение: typedef __flash struct {...} item_struct_type; оно находится в h файле далее идут определения переменных в файле menu.c
item_struct_type Main_menu[NUMBER] = {инициализация}; и item_struct_type *current_menu = Main_menu;
есть файл menu.h со следующими строками: extern item_struct_type Main_menu[NUMBER] ; и extern item_struct_type *current_menu; А зачем extern item_struct_type *current_menu;??? зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;??? Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги? К тому же подозрительно выглядит присвоение в хедере...
--------------------
|
|
|
|
|
Jan 23 2007, 18:25
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Есть мыстль что в модуль mulidisplay и в модуль multimenu на самом деле включаются 2 разных файла h с описанием переменных. может буковку какую не поставили и или наоборот поставили. Убедитесь что файл menuh и декларации extern единственные, через goto definition в IARе. и это Код typedef __flash struct [b]item_struct[/b] { unsigned int *var_pointer; unsigned char position; unsigned char flags; char left; char right; char up; char down; void (*relative_func)(); } item_struct_type;
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Jan 23 2007, 18:32
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(prottoss @ Jan 23 2007, 18:23)  Цитата(Sergio66 @ Jan 23 2007, 21:31)  Есть такое определение: typedef __flash struct {...} item_struct_type; оно находится в h файле далее идут определения переменных в файле menu.c
item_struct_type Main_menu[NUMBER] = {инициализация}; и item_struct_type *current_menu = Main_menu;
есть файл menu.h со следующими строками: extern item_struct_type Main_menu[NUMBER] ; и extern item_struct_type *current_menu; А зачем extern item_struct_type *current_menu;??? зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;??? Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги? К тому же подозрительно выглядит присвоение в хедере... Есть 2 массива меню (2 меню) и программа работает только с активным в данный момент. А указатель на активный массив сторок и описателей меню передается именно через присвоение указателю нужного значения. А присвоение происходит не в недере, а в с файле.
|
|
|
|
|
Jan 23 2007, 18:38
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(Sergio66 @ Jan 23 2007, 17:02)  да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни? В конце концов попробуйте то же самое собрать gcc. Цитата(prottoss @ Jan 23 2007, 17:23)  Цитата(Sergio66 @ Jan 23 2007, 21:31)  Есть такое определение:
далее идут определения переменных в файле menu.c (!!!)
item_struct_type Main_menu[NUMBER] = {инициализация};
есть файл menu.h со следующими строками: extern item_struct_type Main_menu[NUMBER] ; А зачем extern item_struct_type *current_menu;??? зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;??? Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги? К тому же подозрительно выглядит присвоение в хедере... Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура.
|
|
|
|
|
Jan 23 2007, 18:41
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(boez @ Jan 23 2007, 18:38)  Цитата(Sergio66 @ Jan 23 2007, 17:02)  да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A
С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни? В конце концов попробуйте то же самое собрать gcc. Цитата(prottoss @ Jan 23 2007, 17:23)  Цитата(Sergio66 @ Jan 23 2007, 21:31)  Есть такое определение:
далее идут определения переменных в файле menu.c (!!!)
item_struct_type Main_menu[NUMBER] = {инициализация};
есть файл menu.h со следующими строками: extern item_struct_type Main_menu[NUMBER] ; А зачем extern item_struct_type *current_menu;??? зачем определять указатель, если каждому юниту извесно про extern item_struct_type Main_menu[NUMBER] ;??? Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги? К тому же подозрительно выглядит присвоение в хедере... Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура. Вот то то и странно! У меня еще много деклараций и определений подобного типа. Ругается только на эти 2.
|
|
|
|
|
Jan 23 2007, 18:58
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(Sergio66 @ Jan 23 2007, 17:41)  Вот то то и странно! У меня еще много деклараций и определений подобного типа. Ругается только на эти 2. Ну это уже лучше. Ищите различия  Возможно путем написания и компиляции промежуточных вариантов между рабочим и нерабочим. Кстати, слово const слову _flash не мешает. Где-то в соседней ветке рекомендовалось его писать тоже, тогда вкинув в начало #define _flash можно собрать эти же вещи под gcc.
|
|
|
|
|
Jan 24 2007, 09:33
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(boez @ Jan 23 2007, 21:38)  Цитата(Sergio66 @ Jan 23 2007, 17:02)  да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A
С каких пор компоновщики стали понимать типы? Со времен С++. Цитата(Sergio66 @ Jan 23 2007, 20:31)  Есть такое определение: typedef __flash struct { unsigned int *var_pointer; unsigned char position; unsigned char flags; char left; char right; char up; char down; void (*relative_func)(); } item_struct_type; оно находится в h файле далее идут определения переменных в файле menu.c
item_struct_type Main_menu[NUMBER] = {инициализация}; и item_struct_type *current_menu = Main_menu; Попробуйте такой вариант: Код struct item_struct_type { unsigned int *var_pointer; unsigned char position; unsigned char flags; char left; char right; char up; char down; void (*relative_func)(); }; Хотя судя по тексту диагностики, дело не в этом.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 24 2007, 11:59
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(shamray @ Jan 24 2007, 11:53)  Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная. В menu.h стоит охранник #ifndef _MENU_H_ #define _MENU_H_ .... #endif так, что повторное объявление отсутствует. Даже если бы это и было, то ругался бы компиллер - смотри выше.
|
|
|
|
|
Jan 24 2007, 13:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dog Pawlowa @ Jan 24 2007, 12:17)  В данном случае сказать особо нечего, но общее впечатление от собственного понимания причин предупреждений и ошибок ИАРа удручает. Не далее как вчера. Слово shift не является зарезервированным на C, не так ли? Поле bla_bla_bla.shift дает ошибку, bla_bla_bla.shiftt работает. Может и тут какая-то фигня с грамматикой? Насчет грамматики не знаю, но я не вижу криминала в приведенном Sergio66 коде. Подозреваю, что проблема где-то в непоказанном окружении кода. Поэтому и предложил сделать минимальный проект, и на его основе либо искать где-то в другом месте, либо пытаться понять чего мы не понимаем. У меня были подобные предупреждения когда я пытался объявить в одном файле массив с явным указанием размера а в другом без указания (через []) или как extern указатель на тип элементов массива.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 24 2007, 17:58
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Sergio66 @ Jan 23 2007, 17:31)  Есть такое определение: typedef __flash struct { unsigned int *var_pointer; unsigned char position; unsigned char flags; char left; char right; char up; char down; void (*relative_func)(); } item_struct_type; оно находится в h файле далее идут определения переменных в файле menu.c
item_struct_type Main_menu[NUMBER] = {инициализация}; и item_struct_type *current_menu = Main_menu;
есть файл menu.h со следующими строками: extern item_struct_type Main_menu[NUMBER] ; и extern item_struct_type *current_menu;
файл menu.h подключается к нескольким файлдам проекта все прекрасно компиллируется, при компоновке выдаются 2 варнинга: Warning[w6]: Type conflict for external/entry "Main_menu", in module Multidisplay against external/entry in module Menu; array types have different element types; different composite type kinds и Warning[w6]: Type conflict for external/entry "current_menu", in module LCD against external/entry in module Menu; different composite type kinds соответственно
если я из этих файлов убираю все, включая #include menu.h, то такие же варнинги переходят на другие файлы, где подключается menu.h В чем может быть дело.
Модификатор __flash из typedef убирал - ничего не меняется. Советую обратить внимание на последовательность включения заголовочных файлов, если их несколько.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|