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

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

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

[uquote="Martian",url="/forum/viewtopic.php?p=4467444#p4467444"]Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение?[/uquote]
Разве это не все равно? думаю значение
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

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

[uquote="Martian",url="/forum/viewtopic.php?p=4467447#p4467447"]это далеко не всё равно.
Покажите вызов функции.[/uquote]
func(arrr);
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

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

передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет
тематические ответы только в форуме, в приват не пишите
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 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]
Код в тему написал
Реклама
Поставщик валерьянки для Кота
Сообщения: 1982
Зарегистрирован: Сб май 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;^~~~
Либо заставьте функция возвращать значение, либо для выходного значения используйте, напр. изменение глобальной переменной.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Сообщение phalanx »

А вот я вообще не понял. Не очень далекий Martian здесь все определяет?
где он увидел "randomSeed"??? Или у вас тут свой кружок идиотов?
Нашел транзистор. Понюхал.
Сообщения: 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
Друг Кота
Аватара пользователя
Сообщения: 15795
Зарегистрирован: Вт мар 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
Это не хвост, это антенна
Сообщения: 1456
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

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

Сообщение BOB51 »

Просмотреть тот "издохник" от rss-999 из чисто спортивна интересу от нечего делать...
:roll:
Там колондайк ошибок однако....
Или у rss-999 ардуиноIDE без "референса" попалась (версии1.8.19 и "старше") или не там и не то читает...
8)
Друг Кота
Аватара пользователя
Сообщения: 15795
Зарегистрирован: Вт мар 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)
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

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

[uquote="veso74",url="/forum/viewtopic.php?p=4467732#p4467732"]Чтобы избежать путаницы в отношении того, что и где выполняется, во-первых, не используйте глобальные и локальные переменные с одинаковыми именами.
Во-вторых, у вас есть функция, которая не возвращает значение (void func(..)). Чего ожидаете от return arrr; не знаю. Разве используемый компилятор не возвращает предупреждение?
Либо заставьте функция возвращать значение, либо для выходного значения используйте, напр. изменение глобальной переменной.[/uquote]
Имена переменных исправил, спасибо
А вот на return надеялся именно так как вы написали. И я получаю результат, который ожидаю.
Компилятор wokwi.com

Добавлено after 11 minutes 2 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4467810#p4467810"]rss-999, а

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

randomSeed() 
где?[/uquote]
Добавил через analogRead(0), спасибо

Добавлено after 4 minutes 54 seconds:
Нет кнопки правка, вот полный код:

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

int i,n,t,r,h,x,f; //Создать массив пинов из 12 чисел
int j; //Создать массив пинов из 12 чисел
int o; // присвоить переменной каждое число из массива
int lenarr; //вычислить длинну массива
int k; //сравнить 
int d; //Создать массив без нужного числа
int arr[12];
//int arrr[11];
int randNumber;
#define size 11
unsigned char arrrr[size];
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
 
void loop() {
  label:  
randNumber = random(4, 15);
 if (r == randNumber) {goto label;}
 r = randNumber;
 Serial.print("randNumber=");
  Serial.println(randNumber);
func(arrrr);
for (n = 0; n < 11; n++){  
  Serial.println(arrrr[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;
}
OKF
Это не хвост, это антенна
Сообщения: 1456
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Ладно, себя не уважаешь - уважай читателей. ^T неужто тяжело сделать? ППЦ, писатель!
И таких дятлов пруд пруди. Ужос.
Друг Кота
Аватара пользователя
Сообщения: 15795
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

for rss-999
wokwi.com
Тогда ясно откуда "роги" ростут!
:tea:
Есть же родная ардуиноIDE на все вкусы и возможности (с отловом ошибок).
Да еще и приличный симулятор.
И все не онлайн, а в оффлайн компе.
Видимо разницца в некоторых моментах и дает ....... ...
К примеру в "родной" IDE согласно даже последней онлайн версии "референса"
https://www.arduino.cc/reference/en/lan ... rs/random/
тип возвращаемых данных для random long (хотя и на int матюков не наблюдается).
А вот предупреждение о функции "ничего не возвращающей" все же выпадает:
Спойлер

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

C:\...\sketch_aug28a\sketch_aug28a.ino: In function 'void func(unsigned char*)':

C:\...\sketch_aug28a\sketch_aug28a.ino:44:8: warning: return-statement with a value, in function returning 'void' [-fpermissive]

Скетч использует 2674 байт (8%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 255 байт (12%) динамической памяти, оставляя 1793 байт для локальных переменных. Максимум: 2048 байт.
в то же время в func передается некий указатель на unsigned char* arrr (что из себя представляет то, на что данный указатель указывает и где он берется Х/З)...
а чуток выше указывается, что аргументом у func(arrrr); а где тот аргумент берется то??
далее непонятно зачем arrr[d] = k; .... (указатель на char равен значению типа int)...
и на закусь пытаемся куда-то послать указатель на char (о чем и выдано предупреждение в IDE).
:roll:
Лучше уж ежли хочется чего путнего по сути прожки услышать - опишите словами то, чего хочется сделать.
Просто текстом обычными словами.
Похоже Вы сами не сильно понимаете, чего хотите сотворить.
8)
Пы.Сы.
Единственным достоверным симулятором любой конструкции является МАКЕТ данной конструкции.
:wink:

Позволю себе малость погадать:
похоже rss-999 всего лишь пытается выделить (для последующей установки в 1 или 0) один из 11 выводов МК(с D4 по D14), значение которого задаётся результатом очередного прохода ГСЧ.
Ну дык и нахрена такие монструозности городить-то?
:wink:
Ну и спойлером не помешало бы научиться пользоваться для выкладывания исходника.
:tea:
Ответить

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