|
|
  |
Проблема со строками. |
|
|
|
Mar 1 2015, 08:10
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть функция Код void LEUART_SendString(unsigned char *str) { while (*str) { LEUART_Tx(*str++); } } если передаю аргумент так Код unsigned char * data = "abcd"; LEUART_SendString(data); то все нормально. а напрямую Код LEUART_SendString(“abcd”); Ругается pointer targets in passing argument 1 of 'LEUART_SendString' differ in signedness компайлер воспринимает строку как char*. неужели каждую строку эксплиситли приводить к unsigned char?
|
|
|
|
|
Mar 1 2015, 09:37
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Dog Pawlowa @ Mar 1 2015, 14:19)  Тип char обычно задается в свойствах проекта, в ИАРе это вкладка C compiler / Languge2 Он пошлет тот набор бит, а вот будет это принято на приемной стороне как 200, или как - сколько там, это определяется только приемной стороной, соответственно другим проектом. Можно не париться.
Но еще раз - Вы создали строку, назвали ее "ABCD" и вдруг завели разговор о числах. К чему бы это? Как Вы в строку число 200 запишете? все сводиться к посылающей функции Код void LEUART_Tx(unsigned char data) { /* Check that transmit buffer is empty */ while (!(LEUART0->STATUS & LEUART_STATUS_TXBL)) ;
/* LF register about to be modified require sync. busy check */ LEUART_Sync(LEUART0, LEUART_SYNCBUSY_TXDATA);
LEUART0->TXDATA = (uint32_t)data; } если я заменю аргумент на чар - что пошлет функция LEUART_Tx(200); кстати нужно сказать что компилирую в Attolic TrueStudio и там я не нашел дефолтового определения для char как в IAR поэтому я переделал аргумент в unsigned char и возник вопрос.
Сообщение отредактировал Jenya7 - Mar 1 2015, 09:30
|
|
|
|
|
Mar 1 2015, 11:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Jenya7 @ Mar 1 2015, 17:44)  хм...сейчас только обратил внимание что в LEUART0->TXDATA передается дата приведенная к uint32_t. все равно не уверен как приведется signed char к uint32_t. Какая, собственно, разница в данном конкретном случае? Да никакой, потому что это регистр передатчика и ему плевать на все биты, кроме 8 младших. Кстати и явное приведение типов тут не обязательно, компилятор сам это сделает в полном соответствии со стандартом.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 1 2015, 11:44
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Можно давать указатель безтиповый void *, и посылайте хоть чёрта.. Код void LEUART_SendString(void *str) { while ( *(unsigned char*)str) { LEUART_Tx(*(unsigned char *)str++); } }
|
|
|
|
|
Mar 1 2015, 12:10
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(kan35 @ Mar 1 2015, 16:44)  Можно давать указатель безтиповый void *, и посылайте хоть чёрта.. Код void LEUART_SendString(void *str) { while ( *(unsigned char*)str) { LEUART_Tx(*(unsigned char *)str++); } } ого...неплохо, надо проверить.
|
|
|
|
|
Mar 1 2015, 12:18
|

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

|
Цитата(kan35 @ Mar 1 2015, 13:44)  Можно давать указатель безтиповый void *, и посылайте хоть чёрта.. А зачем посылать черта функцией _SendString? И как гарантировать, что черт будет заканчиваться нулем и не будет содержать нулей внутри? У автора та же проблема - в названии функции ясно говорится о строке, а аргументом является указатель на совершенно другой тип. Отсюда и все это засорение исходников приведением типов. Для отправки строк должна быть функция отправки строк, для отправки черта - функция отправки черта. Они обе могут сводиться к представлению передаваемого объекта в виде массива байтов и использования одной общей функции отправки массива байтов: Код void send_string(char const * string) { send_raw(string, strlen(string)); }
void send_byte_array(uint8_t const * from, size_t size) { send_raw(from, size); }
void send_devil(devil const * from) { send_raw(from, sizeof(*from)); }
void send_raw(void const * from, size_t size) { uint8_t const * pSrc = (uint8_t const *)from; while(size--) UART_send_byte(*pSrc++); }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 1 2015, 12:26
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(SSerge @ Mar 1 2015, 16:31)  Какая, собственно, разница в данном конкретном случае? Да никакой, потому что это регистр передатчика и ему плевать на все биты, кроме 8 младших.
Кстати и явное приведение типов тут не обязательно, компилятор сам это сделает в полном соответствии со стандартом. сделал вот такой тест Код signed char Test(signed char data) { return data++; }
.....................................
Test(200); компилятор молчит сволочь не ругается. и какие будут 8 младших битов? Цитата(Сергей Борщ @ Mar 1 2015, 17:18)  А зачем посылать черта функцией _SendString? И как гарантировать, что черт будет заканчиваться нулем и не будет содержать нулей внутри? У автора та же проблема - в названии функции ясно говорится о строке, а аргументом является указатель на совершенно другой тип. Отсюда и все это засорение исходников приведением типов. Для отправки строк должна быть функция отправки строк, для отправки черта - функция отправки черта. Они обе могут сводиться к представлению передаваемого объекта в виде массива байтов и использования одной общей функции отправки массива байтов: Код void send_string(char const * string) { send_raw(string, strlen(string)); }
void send_byte_array(uint8_t const * from, size_t size) { send_raw(from, size); }
void send_devil(devil const * from) { send_raw(from, sizeof(*from)); }
void send_raw(void const * from, size_t size) { uint8_t const * pSrc = (uint8_t const *)from; while(size--) UART_send_byte(*pSrc++); } то есть для строк сделать LEUART_Tx(char data) а для черта LEUART_Tx(unsigned char data)?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|