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

 
 
> процедура с указателем на строку в памяти программ, помогите разобраться
chief_olimp
сообщение Dec 24 2008, 14:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Здраствуйте. Ткните где не так кто знает пожалуйста
Код
unsigned char blabla[] = "blablabla";
/// текст и все такое
void find (unsigned char *findbuff)
{
    unsigned int i;
    while (*findbuff != '\0')
   {
    USART0_OutBuf[i++] = *findbuff;
    findbuff++;
   }
}
int main (void)
{
find (blabla);
}

т.е. программа какие то данные из ОЗУ грузит в процедуру и что то так с ними делает
Скажите пожалуйста как такое же провернуть со строкой типа
Код
unsigned char PROGMEM blabla[] = "blablabla";

Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 24 2008, 16:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(chief_olimp @ Dec 24 2008, 19:39) *
Скажите пожалуйста как такое же провернуть со строкой типа
Код
unsigned char PROGMEM blabla[] = "blablabla";

Во-первых, строка должна заканчиваться завершающим нулем.
Код
unsigned char PROGMEM blabla[] = "blablabla\0";

А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа.
Код
findbuff=(unsigned char *)&blabla[0];
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 24 2008, 18:21
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(rezident @ Dec 24 2008, 19:27) *
Во-первых, строка должна заканчиваться завершающим нулем.
Код
unsigned char PROGMEM blabla[] = "blablabla\0";

А во-вторых, перед выводом нужно указателю присвоить значение ее адреса, явно сделав преобразование типа.
Код
findbuff=(unsigned char *)&blabla[0];
Ни во-первых ни во-вторых делать не надо.
Все СИ строки имеют завершающий ноль по определению.
Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные.
Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае).
На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 24 2008, 19:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(demiurg_spb @ Dec 24 2008, 23:21) *
Ни во-первых ни во-вторых делать не надо.
Все СИ строки имеют завершающий ноль по определению.
Имя одномерного масссива также является указателем на его первый элемент, так зачем же плодить промежуточные переменные.
Приводить тип не надо, а надо использовать тип char для строк и char* для аргумента функции (ну или const char как в данном случае).
На мой взгляд unsigned char следует использовать только как альтернативу uint8_t, а элементы строк, т.е. буквы-символы в подавляющем большинстве имеют тип char, на то он и нужен.
Теоретически вы правы. На практике могут проявиться нюансы. Как-то, приведение типа указателя без операции извлечения адреса не работает. А приведение типа в данном случае необходимо, т.к. указатель и массив имеют разный тип. IAR, например, сругался бы без приведения типа. Насчет char и unsigned char нужно опять же смотреть опции компилятора. Либо твердо помнить, что в строковых переменных используем только KOI-7 и/или только латиницу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 25 2008, 10:24
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(rezident @ Dec 24 2008, 22:49) *
Теоретически вы правы. На практике могут проявиться нюансы. Как-то, приведение типа указателя без операции извлечения адреса не работает. А приведение типа в данном случае необходимо, т.к. указатель и массив имеют разный тип. IAR, например, сругался бы без приведения типа. Насчет char и unsigned char нужно опять же смотреть опции компилятора. Либо твердо помнить, что в строковых переменных используем только KOI-7 и/или только латиницу.
Я хочу сказать, что при грамотном проектировании программы приводить типы проактически не требуется - это загромождает программу. У автора ошибка в проектировании он почему-то решил применять разные типы данных для сущности и передачи указателя в функцию на эту сущность. Мне это совершенно не ясно. И это при том, что сущность едина в "двух лицах" - это строка типа чар. Вся таблица ascii прекрасно ложится в тип чар (это минимум 8 бит в нынешнем понимании, а иногда и немного больше) и пусть этот чар будет хоть со знаком, хот без - это может варьироваться от системы или опций компилятора. Повторюсь ещё раз строки должны состоять из обычных чаров - всё остальное от лукавогоsmile.gif Вот мой аргумент:
Код
const char slovo[] = "slovo";
if (slovo[0]=='s')
{
}
Видите тип 's' - это char (я така понимаю). Поэтому я правомерно могу писать такой код. Комар носа не подточит.
Ну а если ваш компилятор ругается на строки с символами код которых боьше 127 (gcc не ругается, bc и msvc тоже), то надо просто покопаться в опциях компилятора.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 25 2008, 11:14
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(demiurg_spb @ Dec 25 2008, 12:24) *
Ну а если ваш компилятор ругается на строки с символами код которых боьше 127 (gcc не ругается, bc и msvc тоже), то надо просто покопаться в опциях компилятора.

Большинство компиляторов (все, что я видел до сих пор) имеют char по умолчанию unsigned. Но именно потому, что он переключается, char, unsigned char и signed char разные типы. Полное право имеет ругаться.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 25 2008, 12:11
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(HARMHARM @ Dec 25 2008, 14:14) *
Большинство компиляторов (все, что я видел до сих пор) имеют char по умолчанию unsigned. Но именно потому, что он переключается, char, unsigned char и signed char разные типы.
Примеры компиляторов? Это небось только узкоспециализированные и заточенные под мало разрядные MCU. Я солидарен с zltigo и в основном всегда char знаковый. Проведите аналогию с int.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 25 2008, 12:49
Сообщение #8


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(demiurg_spb @ Dec 25 2008, 14:11) *
Примеры компиляторов? Это небось только узкоспециализированные и заточенные под мало разрядные MCU. Я солидарен с zltigo и в основном всегда char знаковый. Проведите аналогию с int.
Да, полностью согласен с Вами и Zltigo. Это мое воинствующее невежество выстрелило sad.gif
Чтобы закрыть тему с char приведу цитату из описания на gcc:
Цитата
Each kind of machine has a default for what `char' should be. It
is either like `unsigned char' by default or like `signed char' by
default.

Ideally, a portable program should always use `signed char' or
`unsigned char' when it depends on the signedness of an object.
But many programs have been written to use plain `char' and expect
it to be signed, or expect it to be unsigned, depending on the
machines they were written for. This option, and its inverse, let
you make such a program work with the opposite default.

The type `char' is always a distinct type from each of `signed
char' or `unsigned char', even though its behavior is always just
like one of those two.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- chief_olimp   процедура с указателем на строку в памяти программ   Dec 24 2008, 14:39
- - rokhan   И что ты хочешь найти? Если ты хочешь найти стро...   Dec 24 2008, 15:03
|||- - zltigo   Цитата(HARMHARM @ Dec 25 2008, 14:14) Бол...   Dec 25 2008, 11:37
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 15:24) ...   Dec 25 2008, 12:35
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 15:35) Я с...   Dec 25 2008, 13:37
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 16:37) ...   Dec 25 2008, 14:31
|||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 17:31) И за ...   Dec 25 2008, 16:50
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 18:37) ...   Dec 25 2008, 15:00
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 18:00) Буд...   Dec 25 2008, 16:38
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:49
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:54
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 19:54) Само ...   Dec 25 2008, 17:27
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:27) ...   Dec 25 2008, 17:34
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 20:34) Естес...   Dec 25 2008, 17:43
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:43) ...   Dec 26 2008, 13:54
||- - demiurg_spb   Цитата(zltigo @ Dec 26 2008, 16:54) Не по...   Dec 27 2008, 10:03
||- - Сергей Борщ   Цитата(demiurg_spb @ Dec 27 2008, 12:03) ...   Dec 27 2008, 11:15
|||- - demiurg_spb   Цитата(Сергей Борщ @ Dec 27 2008, 14:15) ...   Dec 28 2008, 22:04
||- - rezident   Цитата(demiurg_spb @ Dec 27 2008, 15:03) ...   Dec 27 2008, 22:00
|- - alx2   Цитата(rezident @ Dec 25 2008, 00:49) Тео...   Dec 25 2008, 11:15
- - Tiro   Чип AVR с компилятором WinAVR? Тогда прочтите здес...   Dec 24 2008, 16:42
- - chief_olimp   дело в том что я хочу каждый раз используя одну и ...   Dec 24 2008, 16:49
|- - defunct   Цитата(chief_olimp @ Dec 24 2008, 18:49) ...   Dec 24 2008, 17:02
- - WHALE   Я решал вашу задачу так: Кодflash char *flash STRI...   Dec 24 2008, 17:34
- - chief_olimp   в вашем случае насколько я понял сравниваются стро...   Dec 24 2008, 17:43
|- - WHALE   Цитата(chief_olimp @ Dec 24 2008, 20:43) ...   Dec 24 2008, 20:03
- - _Pasha   Код#define Str const unsigned char PROGMEM Str bla...   Dec 24 2008, 18:24
|- - demiurg_spb   Цитата(_Pasha @ Dec 24 2008, 21:24) Код#d...   Dec 24 2008, 18:31
- - rokhan   2chief_olimp : простите. но то что вы написали - э...   Dec 24 2008, 18:28
|- - chief_olimp   Цитата(rokhan @ Dec 24 2008, 22:28) 2chie...   Dec 24 2008, 20:15
- - _Pasha   Цитата(demiurg_spb @ Dec 24 2008, 22:31) ...   Dec 24 2008, 18:49
- - rokhan   Я просто в шоке. думаю мои и быстрее и веселее Ц...   Dec 25 2008, 08:23
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 11:23) думаю...   Dec 25 2008, 08:54
|- - chief_olimp   Кодvoid find(char* inb) { fndOK=-1; char i...   Dec 25 2008, 11:44
|- - Сергей Борщ   Цитата(chief_olimp @ Dec 25 2008, 13:44) ...   Dec 25 2008, 12:05
|- - chief_olimp   Документацию я как раз читаю. Только напоминаю я н...   Dec 25 2008, 12:18
||- - Сергей Борщ   Цитата(chief_olimp @ Dec 25 2008, 14:18) ...   Dec 25 2008, 13:44
||- - chief_olimp   Обращение есть. CODEvoid find (const void *findbuf...   Dec 25 2008, 14:22
|- - alx2   Цитата(Сергей Борщ @ Dec 25 2008, 17:05) ...   Dec 26 2008, 10:36
|- - Сергей Борщ   Цитата(alx2 @ Dec 26 2008, 12:36) Во врем...   Dec 26 2008, 15:32
|- - Сергей Борщ   Цитата(Сергей Борщ @ Dec 26 2008, 17:32) ...   Dec 26 2008, 17:48
- - rokhan   Спасибо вы нашли опечатку. КодНа счет тегов могли ...   Dec 25 2008, 09:00
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 12:00) У авт...   Dec 25 2008, 09:48
- - chief_olimp   т.е. каждый раз при очередном сравнивании данные с...   Dec 25 2008, 09:15


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 17:47
Рейтинг@Mail.ru


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