Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вычисление длины строковой переменной
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Wild007
Возникла проблема:
В контролерах для разных потребиртелей необходимо выводить разные сообщения одной и той же програмой. Было решено текст писать в 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
Подскажите в чем проблем? Может есть другое решение.
GinRider
Надо писать strlen(m).

А вообще советую писать не eeprom char *m, а eeprom char* m.
Для компилятора это одни и тоже, а человеку говорит, что m - не переменная, а указатель на переменную некоего типа.
Wild007
Цитата(GinRider @ Dec 1 2006, 15:06) *
Надо писать strlen(m).

Эффект такой же sad.gif
prottoss
Цитата(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). Задача тривиальная, главное, чтобы строка заканчивалась нулем, что обычно делает сам компилятор...
GinRider
Специально проверил - IAR принимает без проблем. Странно. blink.gif
Wild007
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
prottoss
Цитата(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;
};
SpiritDance
Цитата(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 из определения строки... будет бредить или нет?
WHALE
Увы и ах
unsigned char strlen(char *str)-енто для строки в RAM,unsigned int strlenf(char flash *str)-для флэш.
Для EEPROM фукции нету sad.gif
Но из-за этого менять компилер,имхо,перебор-напишите сами,функция-то простенькая.
Wild007
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
prottoss
Цитата(Wild007 @ Dec 1 2006, 21:13) *
2 SpiritDance
ERROR компилятора переписывал ручками (не дает копировать) может где в букве и ошибся. Мне надо считать длину строки в EEPROM, а не в другом месте, т.к. переписываться будет только EEPROM, а прога должна остаться на месте.
Мдя...На заборе XYZ написанно, а там дрова лежат...
GinRider
Цитата(prottoss @ Dec 1 2006, 15:46) *
Что принимает? Функция strlen указатель на еепром? Я у себя проверил - не принимает, так же как и *m... Что там за ИАР у Вас?


Именно так, указатель __eeprom char* . IAR номер 4.12.
Да и вообще, если я решу какие-то переменные перенести из SRAM в EEPROM или FLASH (сделать константой), Вы считаете, что надо программу переписывать? Несколько странно.
Насчёт своей функции согласен, это сделает код прозрачнее и объём меньше.
Wild007
Цитата(prottoss @ Dec 1 2006, 16:18) *
Цитата(Wild007 @ Dec 1 2006, 21:13) *
2 SpiritDance
ERROR компилятора переписывал ручками (не дает копировать) может где в букве и ошибся. Мне надо считать длину строки в EEPROM, а не в другом месте, т.к. переписываться будет только EEPROM, а прога должна остаться на месте.
Мдя...На заборе XYZ написанно, а там дрова лежат...

Но смысл не нарушен -- вы же поняли smile.gif smile.gif smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.