Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

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

Чт авг 24, 2023 18:01:38

Доброго времени суток. Вопрос кажется простым, но я перелопатил кучу сайтов, но не нашел как правильно передать переменную в функцию.
Есть функция которая возвращает массив.
Код:
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 раз.

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

Чт авг 24, 2023 18:30:30

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

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

Чт авг 24, 2023 18:33:27

Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение?

Разве это не все равно? думаю значение

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

Чт авг 24, 2023 18:34:43

это далеко не всё равно.
Покажите вызов функции.

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

Чт авг 24, 2023 18:43:05

это далеко не всё равно.
Покажите вызов функции.

func(arrr);

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

Чт авг 24, 2023 19:02:59

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

func(arrr, -1);

или

signed int a;
...
a = -1;
...
func(arrr, a);

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

Чт авг 24, 2023 19:51:20

rss-999 писал(а):Есть функция которая возвращает массив.


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

код весь покажи, так нихера не понятно

передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет

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

Чт авг 24, 2023 20:18:40

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

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

Пт авг 25, 2023 06:50:42

Передача переменной ( через указатель используя оператор & ) и ее значения в функцию это совершенно разные вещи и делаются они по разному:
Код:
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); // обмен значениями

Читайте Кернигана и Ритчи, там все это подробно расписано.

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

Пт авг 25, 2023 07:08:48

код весь покажи, так нихера не понятно

Код в тему написал

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

Пт авг 25, 2023 09:11:42

Чтобы избежать путаницы в отношении того, что и где выполняется, во-первых, не используйте глобальные и локальные переменные с одинаковыми именами.
Код:
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;^~~~

Либо заставьте функция возвращать значение, либо для выходного значения используйте, напр. изменение глобальной переменной.

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

Пт авг 25, 2023 13:23:58

rss-999, а
Код:
randomSeed()
где?

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

Пт авг 25, 2023 17:09:23

А вот я вообще не понял. Не очень далекий Martian здесь все определяет?
где он увидел "randomSeed"??? Или у вас тут свой кружок идиотов?

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

Пт авг 25, 2023 17:13:06

phalanx, сам-то понял, что сказал? я спросил ТС, где инициализация ГСЧ. А ты - всё-таки дурак и хам к тому же.

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

Пт авг 25, 2023 17:17:24

...
[/code]

Бегите отсюда. Кроме идиотизма и пошлых анекдотов Вы здесь не найдете ничего.

Добавлено after 1 minute 40 seconds:
phalanx, сам-то понял, что сказал? я спросил ТС, где инициализация ГСЧ. А ты - всё-таки дурак и хам к тому же.

Именно это я и имел в виду. :-D
Спасибо судьбе, что есть дебилы. Ты, Martian, мне и настроение поднял и свою "значимость" еще раз обозначил. :-D

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

Пт авг 25, 2023 17:50:24

...
Код в тему написал

Насколько я помню, код в файле *.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 "референса" придерживаться, а не городить сходу или простые дополнительные файлы или собственный класс. Да и не спешить сразу "суперкрутые" программы писать.
Опыт набирается постепенно.
Да и разбор "чужих фантазий" штука неблагодарная.
Можно хотя-бы примеры оформления проектовна основе адуринки в
viewtopic.php?f=62&t=156720
посмотреть... Хотя... там через годик иногда сам без комментариев могу заблудиться.
:tea:

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

Пт авг 25, 2023 19:04:37

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

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

Пт авг 25, 2023 20:03:08

Просмотреть тот "издохник" от rss-999 из чисто спортивна интересу от нечего делать...
:roll:
Там колондайк ошибок однако....
Или у rss-999 ардуиноIDE без "референса" попалась (версии1.8.19 и "старше") или не там и не то читает...
8)

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

Пт авг 25, 2023 20:09:07

Да что угодно там. Может, каждый раз включает и видит генерацию всегда одного и того же числа, что нормально.

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

Пт авг 25, 2023 20:58:35

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

Спойлер
Код:

#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() ?" смотрим пример тут
viewtopic.php?p=4468143#p4468143
8)
Ответить