Страница 1 из 2
Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:01:38
rss-999
Доброго времени суток. Вопрос кажется простым, но я перелопатил кучу сайтов, но не нашел как правильно передать переменную в функцию.
Есть функция которая возвращает массив.
Хочу передавать в неё каждый раз по новой создаваемую переменную, что типа такого:
Код: Выделить всё
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;
}
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:30:30
Martian
Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение? И оно почему-то упорно передается старое, хотя Вы его изменяете?
P.S.
Итерация вряд ли может быть первой.
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:33:27
rss-999
[uquote="Martian",url="/forum/viewtopic.php?p=4467444#p4467444"]Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение?[/uquote]
Разве это не все равно? думаю значение
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:34:43
Martian
это далеко не всё равно.
Покажите вызов функции.
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:43:05
rss-999
[uquote="Martian",url="/forum/viewtopic.php?p=4467447#p4467447"]это далеко не всё равно.
Покажите вызов функции.[/uquote]
func(arrr);
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 19:02:59
Martian
? а где же значение переменной? например:
func(arrr, -1);
или
signed int a;
...
a = -1;
...
func(arrr, a);
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 19:51:20
kalobyte
rss-999 писал(а):Есть функция которая возвращает массив.
может принимает?
rss-999 писал(а):Если оставить как в первом примере, переменная передается только при первой итерации, а при последующих использует старое значение.
код весь покажи, так нихера не понятно
передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 20:18:40
Martian
[uquote="kalobyte",url="/forum/viewtopic.php?p=4467503#p4467503"]передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет[/uquote] не требует и почему именно байт, если речь о длине? Длина массива - это количество элементов. Элемент может быть чем угодно.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 06:50:42
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); // обмен значениями
Читайте Кернигана и Ритчи, там все это подробно расписано.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 07:08:48
rss-999
[uquote="kalobyte",url="/forum/viewtopic.php?p=4467503#p4467503"]код весь покажи, так нихера не понятно[/uquote]
Код в тему написал
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 09:11:42
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;^~~~
Либо заставьте функция возвращать значение, либо для выходного значения используйте, напр. изменение глобальной переменной.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 13:23:58
Martian
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 17:09:23
phalanx
А вот я вообще не понял. Не очень далекий Martian здесь все определяет?
где он увидел "randomSeed"??? Или у вас тут свой кружок идиотов?
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 17:13:06
Martian
phalanx, сам-то понял, что сказал? я спросил ТС, где инициализация ГСЧ. А ты - всё-таки дурак и хам к тому же.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 17:17:24
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
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 17:50:24
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
посмотреть... Хотя... там через годик иногда сам без комментариев могу заблудиться.

Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 19:04:37
OKF
Да там у ТС вообще каша в голове. Сначала с Си нужно разобраться, а потом уже вопросы формулировать, а не как проснувшийся с бодуна словно.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 20:03:08
BOB51
Просмотреть тот "издохник" от
rss-999 из чисто спортивна интересу от нечего делать...
Там колондайк ошибок однако....
Или у
rss-999 ардуиноIDE без "референса" попалась (версии1.8.19 и "старше") или не там и не то читает...

Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 20:09:07
Martian
Да что угодно там. Может, каждый раз включает и видит генерацию всегда одного и того же числа, что нормально.
Re: Передать переменную в функцию
Добавлено: Пт авг 25, 2023 20:58:35
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;
}

А вот с функциями обработки ГСЧ надо повнимательнее разобраться - раньше просто с ними не работал...
Под ассемблером использовал самодельный ГСЧ для замигаек.

К вопросу "зачем нужна randomSeed() ?" смотрим пример тут
https://radiokot.ru/forum/viewtopic.php ... 3#p4468143
