Страница 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:33:27
rss-999
[uquote="Martian",url="/forum/viewtopic.php?p=4467444#p4467444"]Я не совсем понял.
Необходимо передавать новую переменную, или всё-таки её значение?[/uquote]
Разве это не все равно? думаю значение
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 18:43:05
rss-999
[uquote="Martian",url="/forum/viewtopic.php?p=4467447#p4467447"]это далеко не всё равно.
Покажите вызов функции.[/uquote]
func(arrr);
Re: Передать переменную в функцию
Добавлено: Чт авг 24, 2023 19:51:20
kalobyte
rss-999 писал(а):Есть функция которая возвращает массив.
может принимает?
rss-999 писал(а):Если оставить как в первом примере, переменная передается только при первой итерации, а при последующих использует старое значение.
код весь покажи, так нихера не понятно
передача массива в функции требует еще передавать длину массива, если ты конечно заранее не знаеш, сколько там байт будет
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 17:09:23
phalanx
А вот я вообще не понял. Не очень далекий Martian здесь все определяет?
где он увидел "randomSeed"??? Или у вас тут свой кружок идиотов?
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: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

Re: Передать переменную в функцию
Добавлено: Пн авг 28, 2023 08:52:29
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, а
где?[/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;
}
Re: Передать переменную в функцию
Добавлено: Пн авг 28, 2023 10:34:24
OKF
Ладно, себя не уважаешь - уважай читателей. ^T неужто тяжело сделать? ППЦ, писатель!
И таких дятлов пруд пруди. Ужос.
Re: Передать переменную в функцию
Добавлено: Пн авг 28, 2023 10:58:05
BOB51
for
rss-999
wokwi.com
Тогда ясно откуда "роги" ростут!
Есть же родная ардуино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).
Лучше уж ежли хочется чего путнего по сути прожки услышать - опишите словами то, чего хочется сделать.
Просто текстом обычными словами.
Похоже Вы сами не сильно понимаете, чего хотите сотворить.

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

Ну и спойлером не помешало бы научиться пользоваться для выкладывания исходника.
