AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
08.10.2018, 01:57
|
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Вызов функции с массивом
Подскажите пожалуйста, только начал изучать Си, вроде бы простая задача, весь мозг уже сломал, не могу понять как вызвать функцию с массивом?
Код:
|
void Write(unsigned char Adres,unsigned char Data[10])
{
какой то код
}
//Вызов функции Write
Write(X,Y); - так работает если без массива |
Мне нужно вызвать функцию Write и передать в неё значение переменной Adres (с ней всё ясно) и например значение пятого элемента
массива Data. Тут как бы 2 параметра получается, номер переменной массива и его значение.
|
|
|
|
08.10.2018, 03:40
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
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.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо mike-y-k за это сообщение:
|
|
|
08.10.2018, 13:57
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
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
|
|
|
08.10.2018, 14:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
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;};
};
|
|
|
|
|
08.10.2018, 14:49
|
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
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 драйвер). Для загорания и погасания любого светодиода без массива не обойтись, по крайней мере у меня не получилось. Без массива получается только на семисегментные индикаторы выводить.
|
|
|
|
08.10.2018, 15:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
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.
|
|
|
|
08.10.2018, 15:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Вызов функции с массивом
какой смысл подобной процедуры, если можно в коде ограничиться Data[Address] = Data_TMP и всё?
|
|
|
|
08.10.2018, 15:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Re: Вызов функции с массивом
Сообщение от Ara41
|
какой смысл подобной процедуры
|
Я так понял, что далее в ней пойдет какой-то код. Например, передача массива в порт.
|
|
|
|
08.10.2018, 17:31
|
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Вызов функции с массивом
Сообщение от IOPA4
|
Я так понял, что далее в ней пойдет какой-то код. Например, передача массива в порт.
|
Да так и есть, там передаётся адрес регистра и данные этого регистра для MAX7219. Саму функцию я уже написал, цифры на семисегментник выводятся нормально, но у меня смешанное подключение, 3 цифры семисегмент. и куча светодиодов. Как столкнулся с зажиганием и погасанием отдельных светодиодов, понял что без массива никак не обойтись.
|
|
|
|
09.10.2018, 03:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,440
Сказал спасибо: 97
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Вызов функции с массивом
Ну в массиве ещё можно хранить "кодировку": то есть, перевод конкретного числа (или кода символа) в набор битов (зажигаемых сегментов).
Но этот массив не нужно передавать как параметр функции.
Например, имеем индикатор, который отображает 16 символов на знакоместо.
Заполняем массив:
PHP код:
|
FONT[] = { ..., ..., ..., ...};
|
Допустим, в переменной A - код символа (например, для буквы F код равен 15).
В нужном месте где присваивается значение региста просто пишем:
Если много символов, то для их хранения удобно выделять массив. Например, DISPLAY[5] (наш дисплей имеет 5 символов).
Каждый элемент массива хранит код символа в соответствующей позиции (позиция - это индекс массива).
В этом случае такой массив нужно сделать глобальным, и не передавать его при вызове функций.
Код для регистра будет таким:
PHP код:
|
REG = FONT[DISPLAY[index]];
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:54.
|
|