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

 
 
 
Reply to this topicStart new topic
> Вычисление длины строковой переменной, в CodevisionAVR 1.24.8b
Wild007
сообщение Dec 1 2006, 15:55
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Возникла проблема:
В контролерах для разных потребиртелей необходимо выводить разные сообщения одной и той же програмой. Было решено текст писать в EEPROM (не перешивая флеш) , а самой програмой вычислять длину сообщения и выводить на дисплей. Длина может отличаться в два раза. Естественно попробовал воспользоваться библиотекой "string.h". В хелпе написано:
unsigned char strlen(char *str)
returns the length of the string str (in the range 0..255).

В тексте програмы написал:
#include <string.h>
......
eeprom char *m="1234"; Символьная строка в EEPROM
........
char b = strlen (*m); Вычисляем длину строки
........
На это комптлятор ругается
parametr #1 of type 'unsigned char' is incompatable with type 'unsigned char' specified in the function 'strlen' declaration
Подскажите в чем проблем? Может есть другое решение.


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
GinRider
сообщение Dec 1 2006, 16:06
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Надо писать strlen(m).

А вообще советую писать не eeprom char *m, а eeprom char* m.
Для компилятора это одни и тоже, а человеку говорит, что m - не переменная, а указатель на переменную некоего типа.
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 1 2006, 16:09
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(GinRider @ Dec 1 2006, 15:06) *
Надо писать strlen(m).

Эффект такой же sad.gif


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 1 2006, 16:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Wild007 @ Dec 1 2006, 19:55) *
unsigned char strlen(char *str)
returns the length of the string str (in the range 0..255).

В тексте програмы написал:
#include <string.h>
......
eeprom char *m="1234"; Символьная строка в EEPROM
........
char b = strlen (*m); Вычисляем длину строки
........
На это комптлятор ругается
parametr #1 of type 'unsigned char' is incompatable with type 'unsigned char' specified in the function 'strlen' declaration
Подскажите в чем проблем? Может есть другое решение.
Для начала строка "char b = strlen (*m);" записана не верно. Вы должны передавать в функцию strlen не данные, на которые указывает указатель (*m), а сам указатель (m). Во вторых функция имеет вид: size_t strlen(const char *s); А Вы пытаетесь передать указатель другого типа...Скорее всего придется сначала копировать данные в буфер, а адрес буфера передавать в strlen... Но есть хорошая альтернатива - написать собственную функцию, допустим ee_strlen(char __eeprom *string). Задача тривиальная, главное, чтобы строка заканчивалась нулем, что обычно делает сам компилятор...


--------------------
Go to the top of the page
 
+Quote Post
GinRider
сообщение Dec 1 2006, 16:28
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Специально проверил - IAR принимает без проблем. Странно. blink.gif
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 1 2006, 16:39
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



2 prottoss
Опять читаем хелп:
/* Pointer to a char string placed in EEPROM */
eeprom char *ptr_to_eeprom1="This string is placed in EEPROM";
char eeprom *ptr_to_eeprom2="This string is also placed in EEPROM";
что я сделал не так?
А по поводу написать собственную функцию -- хотелось бы использовать готовую smile.gif

2 GinRider
Видимо придется искать IAR sad.gif


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 1 2006, 16:46
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(GinRider @ Dec 1 2006, 20:28) *
Специально проверил - IAR принимает без проблем. Странно. blink.gif
Что принимает? Функция strlen указатель на еепром? Я у себя проверил - не принимает, так же как и *m... Что там за ИАР у Вас?



А в чем проблема в написании собственной функции? Вот, пожалуйста:

Код
UINT ee_strlen(CHAR __eeprom *str)
{
UINT i = 0;

while(0 != *str++) i++;
return i;
};


--------------------
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Dec 1 2006, 16:54
Сообщение #8


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Wild007 @ Dec 1 2006, 15:55) *
На это комптлятор ругается
parametr #1 of type 'unsigned char' is incompatable with type 'unsigned char' specified in the function 'strlen' declaration

Это какой-то бред а не ругань. Вы уверены что сообщение выглядит именно так с точночстью до знака? Попробуйте ради интереса убрать eeprom из определения строки... будет бредить или нет?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 1 2006, 17:10
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Увы и ах
unsigned char strlen(char *str)-енто для строки в RAM,unsigned int strlenf(char flash *str)-для флэш.
Для EEPROM фукции нету sad.gif
Но из-за этого менять компилер,имхо,перебор-напишите сами,функция-то простенькая.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 1 2006, 17:17
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



2 SpiritDance
ERROR компилятора переписывал ручками (не дает копировать) может где в букве и ошибся. Мне надо считать длину строки в EEPROM, а не в другом месте, т.к. переписываться будет только EEPROM, а прога должна остаться на месте.

Цитата(WHALE @ Dec 1 2006, 16:10) *
Увы и ах
unsigned char strlen(char *str)-енто для строки в RAM,unsigned int strlenf(char flash *str)-для флэш.
Для EEPROM фукции нету sad.gif
Но из-за этого менять компилер,имхо,перебор-напишите сами,функция-то простенькая.

Понял, огромное спасибо, особенно prottoss smile.gif smile.gif


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 1 2006, 17:18
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Wild007 @ Dec 1 2006, 21:13) *
2 SpiritDance
ERROR компилятора переписывал ручками (не дает копировать) может где в букве и ошибся. Мне надо считать длину строки в EEPROM, а не в другом месте, т.к. переписываться будет только EEPROM, а прога должна остаться на месте.
Мдя...На заборе XYZ написанно, а там дрова лежат...


--------------------
Go to the top of the page
 
+Quote Post
GinRider
сообщение Dec 1 2006, 17:32
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Цитата(prottoss @ Dec 1 2006, 15:46) *
Что принимает? Функция strlen указатель на еепром? Я у себя проверил - не принимает, так же как и *m... Что там за ИАР у Вас?


Именно так, указатель __eeprom char* . IAR номер 4.12.
Да и вообще, если я решу какие-то переменные перенести из SRAM в EEPROM или FLASH (сделать константой), Вы считаете, что надо программу переписывать? Несколько странно.
Насчёт своей функции согласен, это сделает код прозрачнее и объём меньше.
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 1 2006, 17:34
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(prottoss @ Dec 1 2006, 16:18) *
Цитата(Wild007 @ Dec 1 2006, 21:13) *
2 SpiritDance
ERROR компилятора переписывал ручками (не дает копировать) может где в букве и ошибся. Мне надо считать длину строки в EEPROM, а не в другом месте, т.к. переписываться будет только EEPROM, а прога должна остаться на месте.
Мдя...На заборе XYZ написанно, а там дрова лежат...

Но смысл не нарушен -- вы же поняли smile.gif smile.gif smile.gif


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post

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

 


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


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