реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> еще раз об использовании СPP и uCOS
Jurdens
сообщение May 18 2007, 06:43
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Есть рабочий проект под uCOS на С
После того как я поставил в настройках проекта (среда IAR) галочку Extended Embedded C++
компилятор стал ругаться на все фрагменты содержащие строковые константы в параметрах функций
типа OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err); на параметр "Startup"
OS_StrCopy(s, "uC/OS-II: Vx.yy"); на параметр "uC/OS-II: Vx.yy"

Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "INT8U *" C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\NXP\LPC2138\IAR\OS-View-LCD\app.cpp 198
несоответствие типов все понятно
Но почему С компилятор не ругался ?
И что делать сейчас есть может какая директива компилятору ?
Можно конечно и так..

INT8U G1[]="Startup";
.
.
.
OSTaskNameSet(APP_TASK_GRAPHOUT_PRIO, G1, &err);

и получается
но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 18 2007, 07:35
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jurdens @ May 18 2007, 09:43) *
Но почему С компилятор не ругался ?
С++ более строг в смысле типов.
Цитата(Jurdens @ May 18 2007, 09:43) *
но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?
Я бы пошел с другой стороны - сомнительно, что в тех местах, где вы сейчас передаете строку когда-нибудь вам потребуется передавать массив беззнаковых байтов. Поэтому просто поправьте описание (определение) функций OS_StrCopy и OSTaskNameSet. Если такой вариант вас не устраивает, то сделайте приведение типов:OS_StrCopy(s, (INT8U *)"uC/OS-II: Vx.yy");

P.S. Есть еще один вариант - в каком-нибудь хидере определите inline-функцию с таким же именем, но другим типом параметров. Например если у вас есть int StrLen(INT8U *str), то можете объявить
inline int StrLen(char const* str) { return StrLen(reinterpret_cast<INT8U*>(str)); }


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение May 18 2007, 07:50
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Jurdens @ May 18 2007, 13:43) *
Есть рабочий проект под uCOS на С
После того как я поставил в настройках проекта (среда IAR) галочку Extended Embedded C++
компилятор стал ругаться на все фрагменты содержащие строковые константы в параметрах функций
типа OSTaskNameSet(APP_TASK_START_PRIO, "Startup", &err); на параметр "Startup"
OS_StrCopy(s, "uC/OS-II: Vx.yy"); на параметр "uC/OS-II: Vx.yy"

Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "INT8U *" C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\NXP\LPC2138\IAR\OS-View-LCD\app.cpp 198
несоответствие типов все понятно
Но почему С компилятор не ругался ?
[...]
но может можно как то еще дать знать компилятору о том что INT8U* и char const *" compatibl?

Ваш INT8U - это, видимо, unsigned char. В С++ char, signed char и unsigned char - это три разных типа. Кроме того, Вы пытаетесь передать в функцию, принимающую аргумент INT8U*, выражение типа const char*, т.е. константное выражение. А если фукнция внутри будет менять значения, переданные по указателю? Этого делать нельзя. Почему в С режиме компилятор не ругался на это, не знаю. Выйти из положения можно, применив ручное преобразование типов. Это можно сделать, если уверены, что негативных последствий не возникнет - тут (после приведения типов) вся ответственность за правильность работы на Вас. А еще лучше, написать свою функцию-обертку, в которую поместить вызов этой функции с ручным преобразванием типа - чтобы в коде не мельтешело это преобразование. Эту функцию-оберктку объявить встраиваемой (inline), чтобы она не тащила за собой накладных расходов на вызов.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Jurdens
сообщение May 18 2007, 08:11
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Спасибо мне подойдет приведение типов.
А вот еще одно
при вызове функций С в модууле CPP - в файле *.cpp
линкер ругается
Error[e46]: Undefined external "BSP_Init()" referred in app (
C:\ARM\UCOS\UII\Micrium\Software\EvalBoards\
=>
нужно описывать функции С вызываемые из модулей CPP как extern "C"
в моем случае
extern "C" void BSP_Init(void )"

что то еще надо ? есть какие нибуть ньюансы использования С-функций в CPP-файлах.грабли ?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 18 2007, 08:16
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Больше никаких граблей не замечено. extern "C" делает С функции видимыми для C++ на уровне linker'a.
Go to the top of the page
 
+Quote Post
Jurdens
сообщение May 18 2007, 08:58
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Ну а если ,волею судеб, нужно вызвать функцию CPP или, не приведи господь,
вызвать метод экземпляра класса в модуле С ? Это можно сделать? и как?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 18 2007, 09:12
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jurdens @ May 18 2007, 11:58) *
Ну а если ,волею судеб, нужно вызвать функцию CPP или, не приведи господь, вызвать метод экземпляра класса в модуле С ? Это можно сделать? и как?
Есть два пути - правильный и муторный. Правильный - перевести все С файлы на C++. Муторный - объявлять в .cpp обертки с атрибутом extern "C":
extern "C" int MyCppFunc_wrapper(int arg) { return MyCppFunc(arg); } - так MyCppFunc_wrapper будет "виден" из С-файлов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jurdens
сообщение May 18 2007, 10:05
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Цитата(Сергей Борщ @ May 18 2007, 12:12) *
Есть два пути - правильный и муторный. Правильный - перевести все С файлы на C++. Муторный - объявлять в .cpp обертки с атрибутом extern "C":
extern "C" int MyCppFunc_wrapper(int arg) { return MyCppFunc(arg); } - так MyCppFunc_wrapper будет "виден" из С-файлов.

Понятно

Увидел интересный прием ,может кому пригодится, как скопом объявлять функции как внешние С
в зависимости от того куда попали в С-файл или CPP-файл , в заголовочном файле
#ifdef __cplusplus
extern "C" {
#endif

void MyFunc1(void );
void MyFunc2(char);
.
.
.
.
#ifdef __cplusplus
}
#endif

__cplusplus определяет компилятор.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 18 2007, 10:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Jurdens @ May 18 2007, 13:05) *
Увидел интересный прием...

Прием наистандартнейший, делать так безусловно надо. Еще сразу еще в заголовочный файл наистандартнейшую защиту от повторных влючений - думаю тоже легко найдете, как.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 18 2007, 13:01
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jurdens @ May 18 2007, 13:05) *
Увидел интересный прием ,может кому пригодится, как скопом объявлять функции как внешние С
в зависимости от того куда попали в С-файл или CPP-файл , в заголовочном файле
В файле yvals.h для этого объявлены удобные макросы _EXTERN_C и _END_EXTERN_C. yvals.h подключается через практически любой из библиотечных .h-файлов


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
lamerok
сообщение May 18 2007, 18:30
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 22-06-04
Из: Челябинск
Пользователь №: 88



Вот есть еще такой вариант (для ИАРа в остальных средах я не работал):

1. Слинковать библиотеку типа rtos.d90.
2. Подключить её к проекту
3. Сделать класс сRTOS - C++ обертку библиотеки. И использовать его во всех своих С++ проектах.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 20:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016