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

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

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

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

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

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

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
Адрес: Москва СЗАО/МО
Сообщений: 12,282
Сказал спасибо: 11,860
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
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
Сообщений: 409
Сказал спасибо: 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.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
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.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
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.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Вызов функции с массивом

какой смысл подобной процедуры, если можно в коде ограничиться Data[Address] = Data_TMP и всё?
Ara41 вне форума  
Непрочитано 08.10.2018, 15:23  
IOPA4
Почётный гражданин KAZUS.RUN
 
Аватар для IOPA4
 
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,290
Сказал спасибо: 452
Сказали Спасибо 501 раз(а) в 267 сообщении(ях)
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.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
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 С 2008 26.08.2026 21:20
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, время: 22:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.