Передать переменную в функцию

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

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

Код: Выделить всё

void func(unsigned char* arrr)
Хочу передавать в неё каждый раз по новой создаваемую переменную, что типа такого:

Код: Выделить всё

void func(unsigned char* arrr, int randNumber)

Если оставить как в первом примере, переменная передается только при первой итерации, а при последующих использует старое значение.
Весь код ниже:

Код: Выделить всё

#define size 11
unsigned char arrr[size];
void loop() {
label:
  randNumber = random(4, 15);
  if (r == randNumber) {goto label;}
  r = randNumber;
  func(arrr);
  for (n = 0; n < 11; n++) {
    Serial.println(arrr[n]);
  }
  delay(3000);
}
void func(unsigned char* arrr)
{
  for (i = 0, j = 4; i < 12; i++) { //Создать массив пинов из 12 чисел
    arr[i] = j;
    j++;
  }
  lenarr = sizeof(arr) / sizeof(int); //вычислить длину массива
  for (o = 0; o < lenarr; o++) { // присвоить переменной каждое число из массива
    k = arr[o];
    if (randNumber != k) { //сравнить
      //for (d=0; d<12; d++){ //Создать массив без нужного числа
      arrr[d] = k;
      d++;
    } //if (randNumber != k)
  } //for (o = 0; o < lenarr; o++)
  return arrr;
}
Последний раз редактировалось rss-999 Пт авг 25, 2023 07:04:58, всего редактировалось 1 раз.
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение? И оно почему-то упорно передается старое, хотя Вы его изменяете?
P.S.
Итерация вряд ли может быть первой.
Последний раз редактировалось Martian Чт авг 24, 2023 18:33:42, всего редактировалось 1 раз.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

[uquote="Martian",url="/forum/viewtopic.php?p=4467444#p4467444"]Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение?[/uquote]
Разве это не все равно? думаю значение
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

это далеко не всё равно.
Покажите вызов функции.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

[uquote="Martian",url="/forum/viewtopic.php?p=4467447#p4467447"]это далеко не всё равно.
Покажите вызов функции.[/uquote]
func(arrr);
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

? а где же значение переменной? например:

func(arrr, -1);

или

signed int a;
...
a = -1;
...
func(arrr, a);
Контактная информация:
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

rss-999 писал(а):Есть функция которая возвращает массив.
может принимает?
rss-999 писал(а):Если оставить как в первом примере, переменная передается только при первой итерации, а при последующих использует старое значение.
код весь покажи, так нихера не понятно

передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет
тематические ответы только в форуме, в приват не пишите
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

[uquote="kalobyte",url="/forum/viewtopic.php?p=4467503#p4467503"]передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет[/uquote] не требует и почему именно байт, если речь о длине? Длина массива - это количество элементов. Элемент может быть чем угодно.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

Передача переменной ( через указатель используя оператор & ) и ее значения в функцию это совершенно разные вещи и делаются они по разному:

Код: Выделить всё

int a = 1 ;
int b = 10 ;

// Вызов функции:
// переменная a передается в функцию через указатель, для дальнейшей модификации самой переменной
// переменная b передается в функцию по значению
int c = func( &a, b );

int func( int * var1, int var2)
{
   *var1  = *var1 + 1; // разрешаем указатель на переменную a и модифицируем ее
   var2 ++; // переменная b остается неизменной, работаем с ее локальной копией
   return *var1 * var2;
}
Еще пример, обмен значениями переменных в функции:

Код: Выделить всё

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b=temp;
}
...
    int x = 100;
    int y = 200;
    swap(&x, &y); // обмен значениями
Читайте Кернигана и Ритчи, там все это подробно расписано.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение rss-999 »

[uquote="kalobyte",url="/forum/viewtopic.php?p=4467503#p4467503"]код весь покажи, так нихера не понятно[/uquote]
Код в тему написал
Поставщик валерьянки для Кота
Сообщения: 1921
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Чтобы избежать путаницы в отношении того, что и где выполняется, во-первых, не используйте глобальные и локальные переменные с одинаковыми именами.

Код: Выделить всё

unsigned char arrr[size];
...
void func(unsigned char* arrr) {
Во-вторых, у вас есть функция, которая не возвращает значение (void func(..)). Чего ожидаете от return arrr; не знаю. Разве используемый компилятор не возвращает предупреждение? Мой дает:

Код: Выделить всё

warning: return-statement with a value, in function returning 'void' [-fpermissive]return arrr;^~~~
Либо заставьте функция возвращать значение, либо для выходного значения используйте, напр. изменение глобальной переменной.
Контактная информация:
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

rss-999, а

Код: Выделить всё

randomSeed() 
где?
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

А вот я вообще не понял. Не очень далекий Martian здесь все определяет?
где он увидел "randomSeed"??? Или у вас тут свой кружок идиотов?
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

phalanx, сам-то понял, что сказал? я спросил ТС, где инициализация ГСЧ. А ты - всё-таки дурак и хам к тому же.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

[uquote="rss-999",url="/forum/viewtopic.php?p=4467421#p4467421"]...
[/code][/uquote]
Бегите отсюда. Кроме идиотизма и пошлых анекдотов Вы здесь не найдете ничего.

Добавлено after 1 minute 40 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4467898#p4467898"]phalanx, сам-то понял, что сказал? я спросил ТС, где инициализация ГСЧ. А ты - всё-таки дурак и хам к тому же.[/uquote]
Именно это я и имел в виду. :-D
Спасибо судьбе, что есть дебилы. Ты, Martian, мне и настроение поднял и свою "значимость" еще раз обозначил. :-D
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="rss-999",url="/forum/viewtopic.php?p=4467702#p4467702"]...
Код в тему написал[/uquote]
Насколько я помню, код в файле *.ino имеет еще и функцию setup и возможные предварительные объявления для глобальных, в пределах основного файла, констант, переменных, массивов, функций (и прочих "мелочей").
К примеру "пустой шаблон":
Спойлер

Код: Выделить всё

/*
*---- шаблон главного файла проекта ----*
*------------  TEST  -------------------*
*            test.ino
*
*/
//---------------------------------------------------------
/*
* раздел обьявлений
*/

//---------------------------------------------------------

void setup() {
  // put your setup code here, to run once:

}

//---------------------------------------------------------

void loop() {
  // put your main code here, to run repeatedly:

}

//---------------------------------------------------------
/*
* "подвал" с описанием функций
*/


//---------------------------------------------------------
//-------------конец файла/end of file---------------------
Данной части или вообще нету или "не признана достойной публикации"...
Все ж таки надо хотя бы для начала встроенного в IDE "референса" придерживаться, а не городить сходу или простые дополнительные файлы или собственный класс. Да и не спешить сразу "суперкрутые" программы писать.
Опыт набирается постепенно.
Да и разбор "чужих фантазий" штука неблагодарная.
Можно хотя-бы примеры оформления проектовна основе адуринки в
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720
посмотреть... Хотя... там через годик иногда сам без комментариев могу заблудиться.
:tea:
OKF
Это не хвост, это антенна
Сообщения: 1430
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Да там у ТС вообще каша в голове. Сначала с Си нужно разобраться, а потом уже вопросы формулировать, а не как проснувшийся с бодуна словно.
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Просмотреть тот "издохник" от rss-999 из чисто спортивна интересу от нечего делать...
:roll:
Там колондайк ошибок однако....
Или у rss-999 ардуиноIDE без "референса" попалась (версии1.8.19 и "старше") или не там и не то читает...
8)
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Да что угодно там. Может, каждый раз включает и видит генерацию всегда одного и того же числа, что нормально.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну я пока что вот такое увидел:
Спойлер

Код: Выделить всё


#define size 11
unsigned char arrr[size];



// ***!!!!! пропущен основной заголовок setup()
void setup() {
  // put your setup code here, to run once:

}
// ***!!!!!


void loop() {
label:

// ***!!!!! нет объявления переменной randNumber
// нет объявления переменной r
// не учитывается размерность данных ГСЧ int или long
// не определен тип данных для n в цикле for
// используется Serial.println() без предварительного запуска
// Serial.begin(speed) в разделе setup()
// ***!!!!!

  randNumber = random(4, 15);
  if (r == randNumber) {goto label;}
  r = randNumber;
  func(arrr);
  for (n = 0; n < 11; n++) {
    Serial.println(arrr[n]);
  }
  delay(3000);
}


// ***!!!!!
// нет объявления массива arr и его типа данных
// не определен тип данных для i и j в цикле for
// нет объявления переменной k и ее типа данных
// нет объявления переменной lenarr и ее типа данных
// не определен тип данных для o в цикле for
// нет объявления переменной d и ее типа данных
// в if (randNumber != k) тип k является не определен исходя из обьявления массива
// а randNumber есть int или long согласно референса для ГСЧ random()
// void func(unsigned char* arrr) есть void следовательно НИЧЕГО НЕ ВОЗВРАЩАЕТ
// ***!!!!!

void func(unsigned char* arrr)
{
  for (i = 0, j = 4; i < 12; i++) { //Создать массив пинов из 12 чисел
    arr[i] = j;
    j++;
  }
  lenarr = sizeof(arr) / sizeof(int); //вычислить длину массива
  for (o = 0; o < lenarr; o++) { // присвоить переменной каждое число из массива
    k = arr[o];
    if (randNumber != k) { //сравнить
      //for (d=0; d<12; d++){ //Создать массив без нужного числа
      arrr[d] = k;
      d++;
    } //if (randNumber != k)
  } //for (o = 0; o < lenarr; o++)
  return arrr;
}

:facepalm:
А вот с функциями обработки ГСЧ надо повнимательнее разобраться - раньше просто с ними не работал...
Под ассемблером использовал самодельный ГСЧ для замигаек.
:roll:
К вопросу "зачем нужна randomSeed() ?" смотрим пример тут
https://radiokot.ru/forum/viewtopic.php ... 3#p4468143
8)
Ответить

Вернуться в «Arduino»