Перейти к содержанию
    

Варнинг компоновщика

Есть такое определение:

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 убирал - ничего не меняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор.

Какой компилятор и линкер используются?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, всегда последнее время так делал и никто не ругался... По крайней мере на С. На С++ наверное такого делать нельзя - но я и не пробовал... А главное - непонятно почему линкер, а не компилятор.

Какой компилятор и линкер используются?

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.

IAR 4.20A

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не забыли охранник поставить в файле menu.h?

#ifndef _MENU_H_
#define _MENU_H_
...
#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не забыли охранник поставить в файле menu.h?

#ifndef _MENU_H_
#define _MENU_H_
...
#endif

нет, не забыл. да если бы забыл, то ругался бы компиллятор - "редекларация"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такое определение:

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] ;???

Каждый юнит когда угодно может взять и создать указатель на массив... не из-за этого ли варнинги?

 

К тому же подозрительно выглядит присвоение в хедере...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть мыстль что в модуль 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такое определение:

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 меню) и программа работает только с активным в данный момент. А указатель на активный массив сторок и описателей меню передается именно через присвоение указателю нужного значения. А присвоение происходит не в недере, а в с файле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.

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 такое прокатывает на ура.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читайте внимательнее - в хидере только typedef и extern декларация. Настоящая декларация и инициализация в .c файле. Повторяю, у меня на gcc такое прокатывает на ура.
Сорри, не заметил :) Я тоже применяю такие конструкции, но варнингов нет- IAR 4.10B

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот то то и странно!

У меня еще много деклараций и определений подобного типа. Ругается только на эти 2.

Ну это уже лучше. Ищите различия :)

Возможно путем написания и компиляции промежуточных вариантов между рабочим и нерабочим.

 

Кстати, слово const слову _flash не мешает. Где-то в соседней ветке рекомендовалось его писать тоже, тогда вкинув в начало #define _flash можно собрать эти же вещи под gcc.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да компиллятору то и не на что ругаться. Именно компоновщик не может привести типы.

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)();                      
};

Хотя судя по тексту диагностики, дело не в этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такое определение:
А вы можете сделать минимальный проект из трех файлов (menu.h, menu.c, и заголовка со структурой), выкинув из них все кроме этих определений? Может гоняя такой исходник на своей машине быстрее ответ отыщем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная.

Изменено пользователем shamray

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...