Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2011, 18:23   #1
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию не распознается тип

Здравствуйте. Проблема в следующем:

есть файл DefVar.h, с содержанием:

Код:
#ifndef __DefVar_H__
#define __DefVar_H__

//#include "SPI.h"
#include "main.h"
//#include "FM256.h"
extern TypeQueue<SizeQueueVar> QueueVar;      //

enum My_Time{
  second,
  minute,
  hour,
  day,
  month,
  year
};

My_Time time;

#endif
и есть другой файл Timer.h, с содержанием:

Код:
#ifndef _Timer_h
#define _Timer_h

#include "iom16.h"
#include "Types.h"
#include "DefVar.h"
#define CLOCK_T2
__flash const uchar max_month=12;
__flash const uchar day_mas[max_month]={31,29,31,30,31,30,31,31,30,31,30,31};
/*
enum time_enum {
  second,
  minute,
  hour,
  day,
  month,
  year
} time; 
*/

My_Time time2;
//enum My_Time time2;

void Exe_temp();

class CLOCK{
private:
  uchar day_index;
  union{
    struct {
      uchar second;
      uchar minute;
      uchar hour;
      uchar day;
      uchar month;
      uint year;
    };
    uchar time[6];
  };

  
public:
  CLOCK();
  void Init();
  void Exe();
  unsigned char Check_Time(My_Time){return 0;}
  #pragma vector=TIMER2_OVF_vect
  __interrupt static void T2_OVF()
  {
      QueueVar.AddTask((pFunTask)Exe_temp, 0);  
  }

};

extern CLOCK Clock;

#endif
Проблема в том, что почему-то во втором файле компилятор не видит тип My_Time (я это место красным обозначил) и пишет ошибку: идентификатор My_Time не найден. Зато, когда я объявляю переменную My_Time time во втором файле, то компилятор выдает, что такая переменная уже задана в первом файле.
Видимо, я что-то недопонимаю. Помогите сделать так, чтобы компилятор не ругался на тип My_Time. Спасибо.
systemmind вне форума Ответить с цитированием
Старый 09.07.2011, 18:48   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Странно, у меня все работает. (MS VS2008)
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 09.07.2011, 19:00   #3
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Странно, у меня все работает. (MS VS2008)
Сейчас проверяю, в си-файле все нормально, объявляется, а в хедере выдает ошибку. компилятор - IAR AVR. Может как-то связанно с подключаемыми файлами?
systemmind вне форума Ответить с цитированием
Старый 09.07.2011, 20:48   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Во-первых, надо сообщать, к какому языку относятся файлы. Для языка С обязательно нужно указывать тег для типов enum, struct, union.

Поэтому если у вас С файлы, то скорей всего где-то в другом месте у вас есть объявление типа

typedef SomeThing My_Time;

Поэтому когда вы указываете

My_Time time;

то возможно компилятор имеет в виду ранее объявленное typedef, а не ваш enum.

Во втором заголовочном файле этот typedef не виден, так как скорей всего объявлен где-нибудь в третьем заголовочном файле, и возникает ошибка.

Это всего лишь предположение, но стоит его проверить.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 09.07.2011, 20:57   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Во-первых, надо сообщать, к какому языку относятся файлы. Для языка С обязательно ну...
Код:
class CLOCK{
private:
  uchar day_index;
  union{
    struct {
      uchar second;
      uchar minute;
      uchar hour;
      uchar day;
      uchar month;
      uint year;
    };
    uchar time[6];
  };
Это несомненно С.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 09.07.2011, 21:50   #6
systemmind
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение

typedef SomeThing My_Time;

Поэтому когда вы указываете

My_Time time;

то возможно компилятор имеет в виду ранее объявленное typedef, а не ваш enum.
Таковых не имеется.

мое предположение - что-то где-то неправильно объявлено))

Поэтому, наверное необходимо сначала разобраться со связями файлов.

Смотрите, предположим, у меня в проекте 5 файлов:
1. main.cpp и main.h
2. OS.h
3. Clock.cpp и его хедер - Clock.h

Струтура файлов такова:

1. Файл OS.h содержит шаблон:

Код:
typedef void (*pFunTask)  (uchar); // тип указателя на функцию, для простоты

template <uchar mSize>
class TypeQueue
 {
  public:
void  AddTask(pFunTask newTask){}
};
2. В файле main.cpp объявлен объект TypeQueue:
Код:
#define SizeQueueVar 20

TypeQueue<SizeQueueVar> QueueVar;
3. В файле Timer.cpp необходимо вызвать метод AddTask:

Код:
void Exe{}

void Interrupt()
{
   QueueVar.AddTask(Exe);
}
Вопрос: как правильно все это связать воедино? Т.е. что нужно прописать во всех хедерах, чтобы программа заработала? В чистом С все легко бы решилось с помощью спецификатора extern, но в С++ я попал в небольшой ступор.
systemmind вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
две задачи на тип INTEGER и тип CHAR inspiron13 Помощь студентам 5 04.01.2011 00:17
две задачи на тип INTEGER и тип CHAR inspiron13 Паскаль, Turbo Pascal, PascalABC.NET 3 04.01.2011 00:08
Различия между const <Тип> и <Тип> RIO Общие вопросы C/C++ 3 03.12.2010 15:28
Первести тип real в тип strings sokla Помощь студентам 5 07.01.2010 18:04
Перевести тип String в тип PChar (Delphi 7) ScorpioN_T Помощь студентам 2 28.10.2008 22:13