Sergio66 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Есть такое определение: 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 убирал - ничего не меняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boez 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор. Какой компилятор и линкер используются? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор. Какой компилятор и линкер используются? да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Не забыли охранник поставить в файле menu.h? #ifndef _MENU_H_ #define _MENU_H_ ... #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Не забыли охранник поставить в файле menu.h? #ifndef _MENU_H_ #define _MENU_H_ ... #endif нет, не забыл. да если бы забыл, то ругался бы компиллятор - "редекларация" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Есть такое определение: 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] ;??? Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги? К тому же подозрительно выглядит присвоение в хедере... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Есть мыстль что в модуль 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Есть такое определение: 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 меню) и программа работает только с активным в данный момент. А указатель на активный массив сторок и описателей меню передается именно через присвоение указателю нужного значения. А присвоение происходит не в недере, а в с файле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boez 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни? В конце концов попробуйте то же самое собрать gcc. Есть такое определение: далее идут определения переменных в файле 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 такое прокатывает на ура. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A С каких пор компоновщики стали понимать типы? ИМХО для каждого объекта он должен знать секцию, адрес, размер и выравнивание... Ну может еще что-то, но типы? Или я отстал от жизни? В конце концов попробуйте то же самое собрать gcc. Есть такое определение: далее идут определения переменных в файле 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура. Сорри, не заметил :) Я тоже применяю такие конструкции, но варнингов нет- IAR 4.10B Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boez 0 23 января, 2007 Опубликовано 23 января, 2007 · Жалоба Вот то то и странно! У меня еще много деклараций и определений подобного типа. Ругается только на эти 2. Ну это уже лучше. Ищите различия :) Возможно путем написания и компиляции промежуточных вариантов между рабочим и нерабочим. Кстати, слово const слову _flash не мешает. Где-то в соседней ветке рекомендовалось его писать тоже, тогда вкинув в начало #define _flash можно собрать эти же вещи под gcc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 24 января, 2007 Опубликовано 24 января, 2007 · Жалоба да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы. IAR 4.20A С каких пор компоновщики стали понимать типы? Со времен С++. Есть такое определение: 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)(); }; Хотя судя по тексту диагностики, дело не в этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 24 января, 2007 Опубликовано 24 января, 2007 · Жалоба Есть такое определение:А вы можете сделать минимальный проект из трех файлов (menu.h, menu.c, и заголовка со структурой), выкинув из них все кроме этих определений? Может гоняя такой исходник на своей машине быстрее ответ отыщем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shamray 0 24 января, 2007 Опубликовано 24 января, 2007 (изменено) · Жалоба Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная. Изменено 24 января, 2007 пользователем shamray Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться