Jump to content
    

Ошибка 70: неполный тип данных

Не могу понять из-за чего вылезает ошибка:

...co_core.h(86): error:  #70: incomplete type is not allowed

#include "co_tmr.h"

typedef struct CO_NODE_T {
    struct CO_DICT_T       Dict;                 /*!< Object dictionary      */
    struct CO_IF_T         If;                   /*!< Can driver interface   */
    struct CO_EMCY_T       Emcy;                 /*!< Node error status      */
    struct CO_NMT_T        Nmt;                  /*!< Network management     */
    struct CO_TMR_T           Tmr;                  /*!< Timer manager          */
    struct CO_SDO_T        Sdo[CO_SSDO_N];       /*!< SDO Server Array       */
    uint8_t               *SdoBuf;               /*!< SDO Transfer Buffer    */
#if USE_CSDO
    struct CO_CSDO_T       CSdo[CO_CSDO_N];      /*!< SDO client array       */
#endif
    struct CO_RPDO_T       RPdo[CO_RPDO_N];      /*!< RPDO Array             */
    struct CO_TPDO_T       TPdo[CO_TPDO_N];      /*!< TPDO Array             */
    struct CO_TPDO_LINK_T  TMap[CO_TPDO_N * 8];  /*!< TPDO mapping links     */
    struct CO_SYNC_T       Sync;                 /*!< SYNC management        */
#if USE_LSS
    struct CO_LSS_T        Lss;                  /*!< LSS slave handling     */
#endif //USE_LSS
    enum   CO_ERR_T        Error;                /*!< detected error code    */
    uint32_t               Baudrate;             /*!< default CAN baudrate   */
    uint8_t                NodeId;               /*!< default Node-ID        */

} CO_NODE;

в строке 

struct CO_TMR_T          Tmr; 

в co_tmr.h

typedef struct CO_TMR_T {
    struct CO_NODE_T       *Node;      /*!< Link to parent node              */
    uint32_t                Max;       /*!< Num. of elements in pools        */
    struct CO_TMR_ACTION_T *APool;     /*!< Timer action pool                */
    struct CO_TMR_TIME_T   *TPool;     /*!< Timer event pool                 */
    struct CO_TMR_ACTION_T *Acts;      /*!< Timer action free list           */
    struct CO_TMR_TIME_T   *Free;      /*!< Timer event free list            */
    struct CO_TMR_TIME_T   *Use;       /*!< Timer event used list            */
    struct CO_TMR_TIME_T   *Elapsed;   /*!< Timer event elapsed list         */
    uint32_t                Freq;      /*!< Timer ticks per second           */

} CO_TMR;

если оставляю, ничего не меняется 

typedef struct CO_TMR_T {
    uint32_t                Max;      

} CO_TMR;

т.е. она не зависит от состава структуры CO_TMR_T

зы

- код стека CANopen 

- компилятор V5.06 

ззы

другие строки компилятся без ошибок, например типа 

struct CO_DICT_T       Dict; 
Edited by _dark_

Share this post


Link to post
Share on other sites

Странно как то... 

в co_core.h объявляю для теста

typedef struct CO_NODE2_T {
    struct CO_TMR2_T       Tmr;                  /*!< Timer manager          */

} CO_NODE2;

в co_tmr.h 

typedef struct CO_TMR2_T {
    uint32_t                Freq;      /*!< Timer ticks per second           */
} CO_TMR2;

появляется еще одна такая же ошибка

теперь переношу шаблон typedef struct CO_TMR2_T в другой файл (co_obj.h) и ошибка на строку  struct CO_TMR2_T       Tmr;   

пропадает, т.е. шаблон в др. *.h видится, 

что-то не так с  co_tmr.h ?

зы

пните меня пжл.! всю голову сломал

co_tmr.h co_core.h

Share this post


Link to post
Share on other sites

Где-то циклическая зависимость по включаемым файлам появилась, видимо.

#include "co_types.h"
#include "co_cfg.h"
//#include "co_core.h"

Сейчас закомментировано, но, видимо, было раскомментировано?

Share this post


Link to post
Share on other sites

7 hours ago, _dark_ said:

пните меня пжл.! всю голову сломал

Возьмите пример с github и не надо ничего ломать

Share this post


Link to post
Share on other sites

Попробуйте скомпилировать с сохранением результата работы препроцессора (для gcc - опция "-save-temps") и посмотреть, что и в каком порядке загружает препроцессор. Возможно, CO_TMR_T или одно из ее полей на этот момент еще не объявлена, а только заявлено, что есть какая-то структура с таким типом (как для объявления указателей).

Share this post


Link to post
Share on other sites

16 hours ago, Arlleex said:

Сейчас закомментировано, но, видимо, было раскомментировано?

//#include "co_core.h"

это я добавлял, т.к. в co_core.h уже есть объявления всех нужных *.h

насчет циклической зависимости не понял, все *.h подключаются один раз и явных перекрестных зависимостей в прототипах нет...

я знаю, что у keil-a есть зависимость в последовательности объявления хидоров, но и тут все корректно

5 hours ago, novikovfb said:

для gcc - опция "-save-temps"

Не понял куда ее вставлять, при добавлении в Мisk Сontrol в [C/C++] ругается...

Судя по первой ошибке обрабатывается co_core.h, а co_tmr.h еще не подключен (или вообще не подключен), 

т.к. при закоментаренной строчке #include "co_tmr.h" co_core.h эффект тотже!

 

13 hours ago, x893 said:

Возьмите пример с github и не надо ничего ломать

эта библиотека на github лежит с CMake (и примеры тоже), к Keil-у прикрутил стандартно с указанием всех ее путей...

 

Пока понятно, что не видятся нормально часть *.h файлов, но не понятна причина и как это исправить...

- пути в проекте всех дирректорий библиотеки прописанны

- файлы в группы добавлены..

Edited by _dark_

Share this post


Link to post
Share on other sites

6 hours ago, novikovfb said:

... и в каком порядке загружает препроцессор. Возможно, CO_TMR_T или одно из ее полей на этот момент еще не объявлена, а только заявлено, что есть какая-то структура с таким типом (как для объявления указателей).

скорее всего именно это и происходит

делать то что? 

я не знаю как в Keil реализовать последовательность обработки кроме как "подвигать" хидеры вверх-вниз, там где их подключили кучей.

для своих файлов это работает, условно в main.h объвляю все *.h и далее только указываю обычно его в др. файлах... иногда какой-то *.h нужно поднять в объявлении выше других файлов...

Share this post


Link to post
Share on other sites

11 minutes ago, _dark_ said:

делать то что? 

прочитать описание компилятора и настроить его, чтобы сохранял файл с результатом работы препроцессора (все include, define и т.п. развернуты в простой текст). Тогда увидите, что приводит к ошибке и станет понятно, в какой последовательности подключать файлы

Share this post


Link to post
Share on other sites

структура проекта и подключенные директории...

Скриншот 29.05.26_14.11.36.png

Скриншот 29.05.26_14.12.37.png

Скриншот 29.05.26_14.16.31.png

Share this post


Link to post
Share on other sites

2 hours ago, _dark_ said:

эта библиотека на github лежит с CMake

image.thumb.png.0a555afc8ebe7bd1c114ff809362fdba.png

Где тут CMake - неизвестно. И под Keil всё собирается без проблем, и под makefile, и под STM32Ide.
Что Вы там мастерите - непонятно.

Share this post


Link to post
Share on other sites

Это не CANopenNode. )) С ним то по сборке проблем нет. Он собирается без ошибок и предупреждений.

(но писали его мазахисты, продраться через #if#def-ы тот еще квест)

Я нашел минимум 5 открытых стеков CANopen. 3 из них нормально собрались.

"Фестиваль" замороченный и c++ - не понравился, задвинут.

Этот от немцев написан лучше, чем CONode, и с лучшей документацией в т.ч. на сайте, но сборка... (( 

 

зы

мне одному кажется, что сайт исправляет текст как T9?

 

 

 

 

Edited by _dark_

Share this post


Link to post
Share on other sites

On 5/29/2026 at 4:06 PM, _dark_ said:

Этот от немцев написан лучше, чем CONode, и с лучшей документацией в т.ч. на сайте, но сборка... (( 

Тогда ссылку хоть на этот стек бы привели.

On 5/29/2026 at 4:06 PM, _dark_ said:

мне одному кажется, что сайт исправляет текст как T9?

Одному

Share this post


Link to post
Share on other sites

37 минут назад, dimka76 сказал:

Тогда ссылку хоть на этот стек бы привели.

Лучше сразу проект в Кейле архивом. С минимальным составом файлов, чтобы лишь проблема проявлялась.

Share this post


Link to post
Share on other sites

On 5/29/2026 at 5:37 PM, Arlleex said:

Лучше сразу проект в Кейле архивом. С минимальным составом файлов, чтобы лишь проблема проявлялась.

Кейл не у всех есть.

Но можно и ссылку, и Кейл 🙂

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...