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

 
 
> Предупреждение при передаче строки как аргумент функции в Keil
MaxiMuz
сообщение Feb 26 2014, 12:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



В отдельном подключенном модуле описана ф-ция:
Код
void LCD_STRING (u8 *STRING)
{
    while (*STRING) {LCD_DAT (*STRING); STRING++;}
}

в майне строчка с вызовом
Цитата
LCD_STRING ("Start_LCD");
помечается желтым треугольником с восклицательным знаком и сообщением:
passing `char [10]` to parameter of type `u8 *` (aka `usigned char *`) converts between pointers to integer types with .... дальше сообщение выходит за рамки экрана и недоступно к прочтению.
Что за предупреждение , что не так ?

п.с. с ф-цией LCD_DAT (*STRING); все впорядке
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Палыч
сообщение Feb 26 2014, 12:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MaxiMuz @ Feb 26 2014, 16:15) *
Что за предупреждение , что не так ?

Вероятно, в main не известен тип параметра функции LCD_STRING.
Прототип функции
Код
void LCD_STRING(u8 *);

в модуле с main присутствует?
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 26 2014, 12:28
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Палыч @ Feb 26 2014, 15:24) *
Прототип функции
Код
void LCD_STRING(u8 *);

в модуле с main присутствует?

нет.
Попробывал поместил в начало описание - результат тот же.

Сообщение отредактировал MaxiMuz - Feb 26 2014, 12:30
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Feb 26 2014, 13:42
Сообщение #4


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

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Если обращаться к языку С то вы пытаетесь привести массив символов к указателю на строку символов которая ограниченна 0

нужно попробовать строку присвоить переменной тип u8 * и передать её функции
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 26 2014, 13:43
Сообщение #5


Гуру
******

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



Цитата(MaxiMuz @ Feb 26 2014, 14:15) *
что не так ?
Найдите 2 отличия:
"char" и "unsigned char"
Цитата(MaxiMuz @ Feb 26 2014, 14:15) *
с ф-цией LCD_DAT (*STRING); все впорядке
Нет, с ней не все в порядке.
Ваша функция печатает строку символов? Ну так и объявите ее как принимающую указатель на char. Откуда эта патологическая тяга использовать unsigned типы где нужно и где не нужно? Компилятор ругается правильно: вы хотели, чтобы функция принимала указатель на беззнаковые байты, а пихаете ей указатель на символы.


--------------------
На любой вопрос даю любой ответ
"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
mdmitry
сообщение Feb 26 2014, 13:49
Сообщение #6


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(MaxiMuz @ Feb 26 2014, 16:15) *
Код
void LCD_STRING (u8 *STRING)

функция требует аргумента указатель на u8.
Код
LCD_STRING ("Start_LCD");

Передается строка, имеющая тип char*.
О чем Вам и сообщил компилятор:
Код
passing `char [10]` to parameter of type `u8 *` (aka `usigned char *`)


Попробуйте грубо явное преобразование типов (хотя это плохая манера):
Код
LCD_STRING ((u8*)"Start_LCD");


P.S. Сергей Борщ опередил.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 27 2014, 08:05
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Сергей Борщ @ Feb 26 2014, 16:43) *
Найдите 2 отличия:
"char" и "unsigned char"

если в описании `u8 *` меняю на
Код
void LCD_STRING (char *STRING)
сразу ошибка - конфликт типов.

Цитата(mdmitry @ Feb 26 2014, 16:49) *
Попробуйте грубо явное преобразование типов (хотя это плохая манера):
Код
LCD_STRING ((u8*)"Start_LCD");

так действительно работает, предупреждение пропало.
Но почему указатель на char не прокатывает ?
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 27 2014, 09:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MaxiMuz @ Feb 27 2014, 12:05) *
если в описании `u8 *` меняю на
Код
void LCD_STRING (char *STRING)
сразу ошибка - конфликт типов.
Нужно void LCD_STRING (const char *STRING)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 27 2014, 09:46
Сообщение #9


Гуру
******

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



Цитата(MaxiMuz @ Feb 27 2014, 10:05) *
сразу ошибка - конфликт типов.
Полностью текст ошибки приведите. А то непонятно, где она возникает - то ли у вас не совпадает объявление с определением, то ли внутри функции дальнейшая работа с параметром приводит к ошибке, то ли в точке вызова что-то не сходится.
И да, согласен с XVR - если функция не меняет передаваемый по указателю параметр, то очень полезно объявлять его как указатель на const.


--------------------
На любой вопрос даю любой ответ
"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
MaxiMuz
сообщение Feb 27 2014, 10:04
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Сергей Борщ @ Feb 27 2014, 12:46) *
Полностью текст ошибки приведите. А то непонятно, где она возникает - то ли у вас не совпадает объявление с определением, то ли внутри функции дальнейшая работа с параметром приводит к ошибке, то ли в точке вызова что-то не сходится.
в самом первом посте приведен текст, только не ошибки , а предупреждения отмеченного восклицательным знаком в желтом треугольнике. но к сожалению текст предупреждения не виден до конца. в консоле результатов компиляции , это предупреждение вообще не печатается.


Цитата(MaxiMuz @ Feb 27 2014, 11:05) *
если в описании `u8 *` меняю на
Код
void LCD_STRING (char *STRING)
сразу ошибка - конфликт типов.
Извиняюсь ! В описании функции тип аргумента поменял , а про заголовочный файл забыл. Вот уже эти обьявления ..
в варианте:
Код
void LCD_STRING (char *STRING)
{
    while (*STRING) {
        LCD_DAT (*STRING);
        STRING++;}
}

Код
LCD_STRING ("Start_LCD");
предупреждение пропало. и даже const не требует

Сообщение отредактировал MaxiMuz - Feb 27 2014, 10:05
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 12:28
Рейтинг@Mail.ru


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