Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Своими руками

Своими руками Завершенные и текущие проекты, хард & софт

Ответ
 
Опции темы Опции просмотра
Старый 01.03.2017, 15:52   #26
Ученый
Senior Member
 
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/69
Ученый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant future
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Romius Посмотреть сообщение
Когда использую const то при компиляции вижу , что массив располагается в памяти программ (по заполнению памяти в %).
"И еще - в заголовке функции переменная MSG объявлена как указатель, а используется как индексированный массив SSPBUF = MSG[i]". - Как же использовать массив ?
Напишите пример, пожалуйста. Не совсем понял.
Код:
void WR_DIS_Ser_D( unsigned char count, const char *MSG)
{
    const char* ptr;    //внутренняя переменная, указатель на элемент массива
    unsigned char bytecount;    //внутренняя переменная, счетчик байт

    ptr = MSG;  //ptr указывает на первый элемент массива
    bytecount = count;
    while (bytecount-- != 0 ) SSPBUF = *ptr++;     //SSPBUF= очередному элементу массива
}
Как-то так.
А вообще-то очень полезно проанализировать, как построены библиотечные функции работы со строками
__________________
Не знать - не стыдно, стыдно не учиться.
Ученый вне форума   Ответить с цитированием
Старый 01.03.2017, 15:57   #27
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,175
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Ученый
Указатели на ОЗУ и память программ разного размера - и разного типа. обычно указывается модель памяти. small model - оба 16 бит. large model - 16/24бита. generic всегда 24 бита и доступ через библиотечные функции.
besogon вне форума   Ответить с цитированием
Старый 02.03.2017, 07:24   #28
Romius
Junior Member
 
Регистрация: 07.02.2017
Адрес: г.Заволжье
Возраст: 44
Сообщений: 23
Вес репутации: 100/12
Romius will become famous soon enoughRomius will become famous soon enough
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от IceS Посмотреть сообщение
1. этот массив по любому будет располагаться в памяти программ. Если const не использовать, то при запуске этот массив будет скопирован в РАМ (ну и часть этой памяти будет занята).
2. если массив одномерный - убрать индекс, если двуменый - то вроде все правильно.
Сейчас посмотрел - все там нормально с передачей индекса на массив
WR_DIS_Ser_D( 4, &DISp[2][0] );
можно еще так:
WR_DIS_Ser_D( 4, DISp[2] ); //убрать [0] ссылку на 0й элемент, и убрать адресс на этот элемент "&"
Да я так и сделал в 13-м посте, просто решили развить тему способов передачи двумерных массивов... Сейчас все работает обоими способами. Надеюсь кому-то пригодится эта тема... В любом случае спасибо за помощь!
Romius вне форума   Ответить с цитированием
Старый 02.03.2017, 07:31   #29
Romius
Junior Member
 
Регистрация: 07.02.2017
Адрес: г.Заволжье
Возраст: 44
Сообщений: 23
Вес репутации: 100/12
Romius will become famous soon enoughRomius will become famous soon enough
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Ученый Посмотреть сообщение
Код:
void WR_DIS_Ser_D( unsigned char count, const char *MSG)
{
    const char* ptr;    //внутренняя переменная, указатель на элемент массива
    unsigned char bytecount;    //внутренняя переменная, счетчик байт

    ptr = MSG;  //ptr указывает на первый элемент массива
    bytecount = count;
    while (bytecount-- != 0 ) SSPBUF = *ptr++;     //SSPBUF= очередному элементу массива
}
Как-то так.
А вообще-то очень полезно проанализировать, как построены библиотечные функции работы со строками
Я думаю Вы делаете то же самое, но с двойным указанием. Ведь массив в функцию и так передается через указатель, зачем же еще раз внутри функции его "переуказывать"?
Romius вне форума   Ответить с цитированием
Старый 02.03.2017, 08:01   #30
Romius
Junior Member
 
Регистрация: 07.02.2017
Адрес: г.Заволжье
Возраст: 44
Сообщений: 23
Вес репутации: 100/12
Romius will become famous soon enoughRomius will become famous soon enough
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от besogon Посмотреть сообщение
Ученый
Указатели на ОЗУ и память программ разного размера - и разного типа. обычно указывается модель памяти. small model - оба 16 бит. large model - 16/24бита. generic всегда 24 бита и доступ через библиотечные функции.
Стараюсь меньше использовать библиотечные функции, мне думается, что они занимают много места в памяти... Для конкретной задачи стараюсь обойтись возможностями языка в своих функциях...
Romius вне форума   Ответить с цитированием
Старый 02.03.2017, 10:10   #31
Ученый
Senior Member
 
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/69
Ученый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant future
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Romius Посмотреть сообщение
Я думаю Вы делаете то же самое, но с двойным указанием. Ведь массив в функцию и так передается через указатель, зачем же еще раз внутри функции его "переуказывать"?
Для того, чтобы разобраться "как лучше и правильнее" надо ответить на два вопроса:
1. Проглотит ли компилятор объявление переменной в заголовке как указатель, а обращение к массиву по индексу, и правильно ли он реализует наше желание?
2. Во что развернутся на ассемблере тот и другой варианты?
Я в свое время "подглядел" такое обращение со строками в библиотечных функциях, наверное люди старались сделать лучше.
Цитата:
мне думается, что они занимают много места в памяти
Посмотрите простые строковые функции (копирования, слияния) - в них буквально 2-3 строки.
__________________
Не знать - не стыдно, стыдно не учиться.
Ученый вне форума   Ответить с цитированием
Старый 02.03.2017, 10:18   #32
Romius
Junior Member
 
Регистрация: 07.02.2017
Адрес: г.Заволжье
Возраст: 44
Сообщений: 23
Вес репутации: 100/12
Romius will become famous soon enoughRomius will become famous soon enough
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

В целом согласен с вами. Сейчас реализовал передачу через указатель как в посте 14-15. Все работает даже без предупреждений.

"Посмотрите простые строковые функции (копирования, слияния) - в них буквально 2-3 строки."
Такие функции тем более лучше самому написать. Я имел ввиду более сложные функции, особенно интерфейсные - они сделаны универсальными и достаточно большие. К тому же например при работе с интерфейсом I2C в библиотечной функции досадная оказия - уходит в вечный цикл при обрыве провода - придется ставить сторожа. Стараюсь делать свое, но конечно без фанатизма
Romius вне форума   Ответить с цитированием
Старый 02.03.2017, 11:23   #33
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 289
Вес репутации: 640/46
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Как я уже замечал, если массив глобальный, зачем вообще в функцию передавать указатель на него? Может просто номер строки?
Pasha_Bi вне форума   Ответить с цитированием
Старый 02.03.2017, 11:27   #34
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,532
Вес репутации: 4887/116
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Как я уже замечал, если массив глобальный, зачем вообще в функцию передавать указатель на него? Может просто номер строки?
указатель уже указывает на то откуда брать данные. Индекс ещё предстоит преобразовать в указатель.

*(ptr + indx) == ptr[indx] == indx[ptr]
ampersant на форуме   Ответить с цитированием
Старый 02.03.2017, 11:28   #35
Romius
Junior Member
 
Регистрация: 07.02.2017
Адрес: г.Заволжье
Возраст: 44
Сообщений: 23
Вес репутации: 100/12
Romius will become famous soon enoughRomius will become famous soon enough
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Как я уже замечал, если массив глобальный, зачем вообще в функцию передавать указатель на него? Может просто номер строки?
Да, в посте 13 я так и делал, но столкнулся с тем, что при выводе элементов строки почему-то 0-й элемент всех строк кроме 0-й строки были = 0. При передачи массива через указатель - все нормально.
Romius вне форума   Ответить с цитированием
Старый 02.03.2017, 11:32   #36
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 49
Сообщений: 167
Вес репутации: 1161/31
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

Цитата:
Сообщение от Romius Посмотреть сообщение
"И еще - в заголовке функции переменная MSG объявлена как указатель, а используется как индексированный массив SSPBUF = MSG[i]". - Как же использовать массив ?
Следующие записи эквивалентны:
Код:
SSPBUF = MSG[i];
SSPBUF = *(MSG + i);
Во втором случае компилятор учитывает тип указателя и сдвигает его на (sizeof(MSG) * i) байт - т.е. фактически на адрес i-того элемента массива. Разыменовывая этот указатель, получаем значение этого элемента. Используйте то, что удобнее.
siarzhuk вне форума   Ответить с цитированием
Старый 02.03.2017, 11:32   #37
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 289
Вес репутации: 640/46
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: Передача 2-х мерного массива русских симв в функцию

А не надо в эту функцию ни каких массивов передавать. Просто интересующий индекс, и работать по этому индексу с глобальным массивом. Работать обязано. Главное, просто.
Pasha_Bi вне форума   Ответить с цитированием
Ответ

Метки
lcd


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как написать функцию, которая возвращает размер массива?! Gera82 Продукция MICROCHIP 9 02.12.2011 15:44
Передача в функцию аргументов signed/unsigned? maxNTF Продукция MICROCHIP 16 26.08.2011 13:38
передача массива в функцию user_22 Продукция MICROCHIP 31 23.05.2011 15:02
C32 Compiler передача массива в функцию. gazpr1bor Вопросы начинающих 24 27.10.2010 14:05
Почему не работает передача регистра в функцию??? Gera82 Продукция MICROCHIP 1 09.01.2010 03:42


Часовой пояс GMT +3, время: 19:54.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot