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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 01.03.2017, 15:52   #26
Ученый
Senior Member
 
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/71
Ученый 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
Возраст: 33
Сообщений: 2,358
Вес репутации: 4510/98
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/14
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/14
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/14
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/71
Ученый 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/14
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
Сообщений: 296
Вес репутации: 640/49
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,540
Вес репутации: 4968/120
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/14
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
Сообщений: 184
Вес репутации: 1617/38
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию 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
Сообщений: 296
Вес репутации: 640/49
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, время: 09:11.


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