Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 08.10.2018, 01:57  
12-12
Частый гость
 
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
12-12 на пути к лучшему
По умолчанию Вызов функции с массивом

Подскажите пожалуйста, только начал изучать Си, вроде бы простая задача, весь мозг уже сломал, не могу понять как вызвать функцию с массивом?

Код:
void Write(unsigned char Adres,unsigned char Data[10])
{
какой то код
}

//Вызов функции Write
Write(X,Y); - так работает если без массива


Мне нужно вызвать функцию Write и передать в неё значение переменной Adres (с ней всё ясно) и например значение пятого элемента
массива Data. Тут как бы 2 параметра получается, номер переменной массива и его значение.
Реклама:
12-12 вне форума  
Непрочитано 08.10.2018, 03:40  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Вызов функции с массивом

12-12, откройте книгу Кернигана и Ритчи - там есть очень хорошо про работу с указателями.

Если функция определена как void Write (unsigned char Address, unsigned char Data) {тело функции}, то для unsigned char X, Y, YY[20] вызовы Write (X, Y) и Write (X, YY[5]) будут нормально работать.
Если функция должна только с массивами работать, то можно использовать вариант void Write (unsigned char Address, unsigned char * Data), но тогда придётся как-то передать туда нужное смещение в массиве - типа добавить третий параметр unsigned int Shift с номером элемента (счёт идёт от 0!!!)
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 08.10.2018 в 03:45.
mike-y-k вне форума  
Эти 2 пользователя(ей) сказали Спасибо mike-y-k за это сообщение:
12-12 (08.10.2018), IOPA4 (08.10.2018)
Непрочитано 08.10.2018, 13:57  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

12-12, так массив в функцию не передается, как Вы написали - т.е. целиком как входную переменную его запрещают передавать. Передается 2 параметра, обычно:
1) указатель на 1 элемент массива, пишется просто: имя массива - Data;
2) число элементов массива, просто целое число: int n.
Как-то так:
Код:
void Write(int N, unsigned char *PtrData)
{
int f = 1, m = 5;
//Code code code code code
//Обращение-использование
//Чтение-Запись:
f = PtrData[0];
PtrData[1] = m;
}

//Использование в main:
unsigned char Data[20] = {0};

//Тут заполняем Data[] какими-то значениями.
//Вызываем функцию:
Write(20, Data);
http://www.c-cpp.ru/books/peredacha-massivov-v-funkcii

Последний раз редактировалось Signalshik2; 08.10.2018 в 13:59.
Signalshik2 вне форума  
Сказали "Спасибо" Signalshik2
12-12 (08.10.2018)
Непрочитано 08.10.2018, 14:23  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

Объявите массив unsigned char Data[10], как глобальную переменную. Желательно, чтобы функция возвращала параметры.

Цитата:
unsigned char Data[10];

unsigned char Write(unsigned char Address, unsigned char N)
{
if (Address›9) return 0;
else {Data[Address] = N; return 1;};
};
IOPA4 вне форума  
Сказали "Спасибо" IOPA4
12-12 (08.10.2018)
Непрочитано 08.10.2018, 14:49  
12-12
Частый гость
 
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
12-12 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

Сообщение от IOPA4 Посмотреть сообщение
Объявите массив unsigned char Data[10], как глобальную переменную. Желательно, чтобы функция возвращала параметры.

Код:
unsigned char Data[10];
unsigned char Write(unsigned char Address, unsigned char N)
{
if (Address›9) return 0; 
else {Data[Address] = N; return 1;};
};
Я думаю вот такая конструкция меня устроит:

Код:
unsigned char Data[10];

unsigned char Write(unsigned char Address, unsigned char Data_TMP)
{
  Data[Address] = Data_TMP;
  //код
};

Мне эта функция нужна, для передачи данных в микросхему MAX7219 (Led драйвер). Для загорания и погасания любого светодиода без массива не обойтись, по крайней мере у меня не получилось. Без массива получается только на семисегментные индикаторы выводить.
12-12 вне форума  
Непрочитано 08.10.2018, 15:03  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

Тогда сделайте процедурой:
Цитата:
void Write(unsigned char Address, unsigned char Data_TMP)
{
Data[Address] = Data_TMP;
};
Функция отличается от процедуры тем, что должна возвращать параметры. В верхнем примере мы бы вызвали функцию err = Write(5,10); В этом примере вызов процедуры обычный Write(5,10); Почитайте, чем отличаются функция и процедура.

Последний раз редактировалось IOPA4; 08.10.2018 в 15:08.
IOPA4 вне форума  
Непрочитано 08.10.2018, 15:08  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

какой смысл подобной процедуры, если можно в коде ограничиться Data[Address] = Data_TMP и всё?
Ara41 вне форума  
Непрочитано 08.10.2018, 15:23  
IOPA4
Почётный гражданин KAZUS.RU
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
IOPA4 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

Сообщение от Ara41 Посмотреть сообщение
какой смысл подобной процедуры
Я так понял, что далее в ней пойдет какой-то код. Например, передача массива в порт.
IOPA4 вне форума  
Непрочитано 08.10.2018, 17:31  
12-12
Частый гость
 
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
12-12 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

Сообщение от IOPA4 Посмотреть сообщение
Я так понял, что далее в ней пойдет какой-то код. Например, передача массива в порт.

Да так и есть, там передаётся адрес регистра и данные этого регистра для MAX7219. Саму функцию я уже написал, цифры на семисегментник выводятся нормально, но у меня смешанное подключение, 3 цифры семисегмент. и куча светодиодов. Как столкнулся с зажиганием и погасанием отдельных светодиодов, понял что без массива никак не обойтись.
12-12 вне форума  
Непрочитано 09.10.2018, 03:06  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,440
Сказал спасибо: 97
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Вызов функции с массивом

Ну в массиве ещё можно хранить "кодировку": то есть, перевод конкретного числа (или кода символа) в набор битов (зажигаемых сегментов).
Но этот массив не нужно передавать как параметр функции.
Например, имеем индикатор, который отображает 16 символов на знакоместо.
Заполняем массив:
PHP код:
FONT[] = { ..., ..., ..., ...}; 
Допустим, в переменной A - код символа (например, для буквы F код равен 15).
В нужном месте где присваивается значение региста просто пишем:

PHP код:
REG FONT[A]; 
Если много символов, то для их хранения удобно выделять массив. Например, DISPLAY[5] (наш дисплей имеет 5 символов).

Каждый элемент массива хранит код символа в соответствующей позиции (позиция - это индекс массива).

В этом случае такой массив нужно сделать глобальным, и не передавать его при вызове функций.

Код для регистра будет таким:
PHP код:
REG FONT[DISPLAY[index]]; 
Godzilla82 вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучение PIC C Compiler(CCS C) CERGEI1982 Embedd С 1984 30.08.2023 14:10
OLED ssd1306 + STM32f030f4 miwutka Песочница (вопросы новичков) 195 07.01.2019 15:38
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
Как уйти от постоянной проверки условия if? nikolas_osu Микроконтроллеры, АЦП, память и т.д 27 15.05.2011 14:39


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


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