Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка линковщика, линковщик не PC-шный 
:(
    Опции темы
PILOT
Дата 13.12.2004, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Не могу разобраться в одной ошибке.

Сама ошибка (предупреждение) выглядит так:
Цитата
Warning[w6]: Type conflict for external/entry "TTriStateReg::TTriStateReg()", in module init against external/entry in module rc; function return types
are different; class/struct/union field names do not match: r28 vs YL
Warning[w35]: There is more than one definition for the struct/union type with tag 'TTriStateReg'; class/struct/union field names do not match: YL vs r28

Не обращайте внимание на r28, это регистр, такой же как и A на PC.

Я изучаю Си (для контроллеров) но принцип везде один и тот же.
Сначала, когда я не знал правил Си, взял и описал классы включая функции класса в файле .h .
И все было без ошибок.
Затем я прочитал, что нужно разделять объявления и сами функции и появилось следующее:

Файл .h
Код

/* объявления */

enum   TGyst {neutral,minus,plus};// тип для хранения текущего положения рег-ра

class T_RC //класс rc-цепочки
{
public:
 float   iteration_step;
 float   tau_z;
 float   tau_r;
 float   ec;
 float   uc;            
 void    init(float t_z,float t_r,float ec0,float uc0,float i_s);
 void    do_iteration(char fzr);
};

class TTriStateReg // класс регулятор
{            
 private:                        
 TGyst   Gyst;
 public:        
  TTriStateReg(void);
 char    YL;
 char    YH;
 float   Razb;
 float   Mup;
 float   Mdown;
 float   Pup;
 float   Pdown;
 float   Ecmax;
 T_RC    rc;
 void    init(float t_z,float t_r,float ec0,float uc0,float i_s,float Mu,float Md,float Pu,float Pd, float Ecm,float Razb,TGyst G);
 void    analyze(void);
 void    do_rc_step(void);
};

class TPlavn
{          
 public:
  TPlavn(void);
 float   In;
 float   Out;
 float   KL;
 float   KH;    
 void    do_iteration(char Speed);
 void    SetParams(float K_0,float K_1);
};



И файл cpp:

Код

/* модуль */

#include "rc.h"

/*****************************************************************************
Функции класса T_RC
*****************************************************************************/
void T_RC::init(float t_z,float t_r,float ec0,float uc0,float i_s)
{
 tau_z=t_z;
 tau_r=t_r;
 ec=ec0;
 uc=uc0;
 iteration_step=i_s;
}

void T_RC::do_iteration(char fzr)
{
 if(!fzr)//если разряд
 {
   uc=uc+(iteration_step/tau_r)*(ec-uc);
 }
 else   //если заряд
 {
   uc=uc+(iteration_step/tau_z)*(ec-uc);
 }
}

/*****************************************************************************
Функции класса TTriStateReg
*****************************************************************************/
TTriStateReg::TTriStateReg(void)// конструктор
{
 YL=0;
 YH=0;
}

void TTriStateReg::init(float t_z,float t_r,float ec0,float uc0,float i_s,float Mu,float Md,float Pu,float Pd, float Ecm,float R,TGyst G)
{
 YL=0;
 YH=0;
 Razb=R;
 Gyst=G;
 rc.init(t_z,t_r,ec0,uc0,i_s);
 Mup=Mu;
 Mdown=Md;
 Pup=Pu;
 Pdown=Pd;
 Ecmax=Ecm;
}

void TTriStateReg::analyze(void)
{
 switch(Gyst)
 {
   case neutral:
     if((Razb-rc.uc)>Pup)
     {
       Gyst=plus;
       rc.ec=Ecmax;
       YH=1;
       YL=0;
     }
     else
     {
       if((Razb-rc.uc)<Mup)
       {
         Gyst=plus;
         rc.ec=-Ecmax;
         YH=0;
         YL=1;
       }
     }
   break;
   case plus:
     if((Razb-rc.uc)<Pdown)
     {
       Gyst=neutral;
       rc.ec=0;
       YH=0;
       YL=0;
     }
   break;
   case minus:
     if((Razb-rc.uc)>Mdown)
     {
       Gyst=neutral;
       rc.ec=0;
       YH=0;
       YL=0;
     }
   break;
 }
}
                         
void TTriStateReg::do_rc_step(void)
{
 rc.do_iteration((char)Gyst);
}

/*****************************************************************************
Функции класса TPlavn
*****************************************************************************/
TPlavn::TPlavn(void)
{
 KL=0;
 KH=0;
}

void TPlavn::do_iteration(char Speed)
{

float K;

 if(Speed)
 {
   K=KH;
 }
 else
 {
   K=KL;
 }
 if(In>Out)
 {
   Out+=K;
 }
 else
 {      
   Out-=K;
 }
}

void TPlavn::SetParams(float K_0,float K_1)
{
 KL=K_0;
 KH=K_1;
}


То что это предупреждение а не ошибка это хорошо, но все же разобраться считаю нужным.
Спасибо.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 13.12.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Во-первых, нужно сделать типа того
rc.H
Код
#ifndef __MY_HEADER__
#define __MY_HEADER__

// ....
// твой код
// ....

#undef __MY_HEADER__


rc.c
Код

/* модуль */
#include "rc.h"
/*****************************************************************************
Функции класса T_RC
*****************************************************************************/

...

Во-вторых, если пишешь на Си, то причем тут cpp? smile
В-третьих, в Си нет классов, а есть только структуры smile
В четвертых, я так и не понял. Изучаешь С или С++? smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
srd
Дата 13.12.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Warning w35 навёл на подозрения... Добавь во все заголовочные файлы стражи включения.
Например, для rc.h
Код

#ifndef __RC__
#define __RC__

// много кода

#endif




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
PILOT
Дата 13.12.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Цитата(bel_nikita @ 13.12.2004, 12:23)
Во-вторых, если пишешь на Си, то причем тут cpp? smile
В-третьих, в Си нет классов, а есть только структуры smile
В четвертых, я так и не понял. Изучаешь С или С++? smile

smile
Ну, Си++ конечно.

За комментарии спасибо, сейчас попробую реализовать советы.

А вот по поводу w35, это значит что я мог где-то уже объявить класс?
И всед за этим: Если у меня более одного файла кторорые содержат: my.h, в котором описанное выше содержимое (Файл .h), это может вызвать подобную ошибку?
Я просто думал что .h можно сколько угодно и везде привинчивать... это так?

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
srd
Дата 13.12.2004, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата
А вот по поводу w35, это значит что я мог где-то уже объявить класс?

Да. Например, если у тебя заголовочный файл включается больше одного раза в одном CPP-файле (напрямую, или через другие заголовки - неважно). Препроцессор просто убирает #include, а в её место вставляет содержимое заголовочного файла.

Цитата
И всед за этим: Если у меня более одного файла кторорые содержат: my.h, в котором описанное выше содержимое (Файл .h), это может вызвать подобную ошибку?

Да.

Цитата
Я просто думал что .h можно сколько угодно и везде привинчивать... это так?

В чистом виде нет. Но если в заголовках есть стражи включения, то можно писать #include много раз, включен он будет только один раз.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
PILOT
Дата 13.12.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Попробовал стража. Не помогает. smile Те же два предупреждения.

Обнаружил, что BreakPoint в теле конструктора TTriStateReg не работает (говорит, мол, некоторые точки останова не будут активны).




--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
srd
Дата 13.12.2004, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



А можешь показать содержимое второго CPP-файла? (который init.cpp). И как писал стражей включения? И сами H-файлы случайно не пытаешься скомпилировать?

Это сообщение отредактировал(а) srd - 13.12.2004, 16:13


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
PILOT
Дата 13.12.2004, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Так!
Нашел кое-что.

Увлекся Си++ и забыл, что YL зарезервированное слово.
Теперь все Ок!

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.