Получение разных значений внутри и снаружи функции при использовании глобального массива
функция splitter
предназначена для получения строки параметров и создания массива параметров. Если была указана только часть параметров, остальные получат значения по умолчанию.
например: входная строка 1,2,3,4
заполнит массив parameters
значениями {"1","2","3" ,"4"
, но если входная строка равна 1,2
, parameters={"1","2","20","0"
code>, а parameters[3]
и parameters[2]
получили значения по умолчанию.
НО
при назначении значений по умолчанию внутри splitter
правильные значения сохраняются в parameters
, но при использовании функции print_output
для отображения parameters
значения — показаны разные значения.
В выходных данных, когда входные данные имеют значение 1,2
, значения по умолчанию должны быть вставлены в parameters[2]
и parameters[3]
, пока входные данные 1,2,3,4
, нет необходимости использовать значения по умолчанию.
ВЫХОД:
Running string 1,2
param_2 was set to default value:20
param_3 was set to default value:0
output:
1
2
0
0
Running string 1,2,3,4
output:
1
2
3
4
КОД:
#define PARAM_AMOUNT 4
#define COLOR 1
#define LED_DELAY 20
#define BRIGHTNESS 50
#define LED_DIRECTION 0
char *parameters[PARAM_AMOUNT] = {"0", "0", "0", "0"};
int param_def[] = {COLOR, BRIGHTNESS, LED_DELAY, LED_DIRECTION};
void setup() {
Serial.begin(9600);
Serial.println("Running string 1,2");
splitter("1,2");
print_output();
Serial.println("Running string 1,2,3,4");
splitter("1,2,3,4");
print_output();
}
void splitter(char *inputstr) {
char * pch;
int i = 0;
pch = strtok (inputstr, " ,.-");
while (pch != NULL)
{
parameters[i] = pch;
pch = strtok (NULL, " ,.-");
i++;
}
// обновляем значения по умолчанию
for (int n = i ; n <= PARAM_AMOUNT - 1; n++) {
sprintf(parameters[n], "%d", param_def[n]);
Serial.print("param_");
Serial.print(n);
Serial.print(" was set to default value:");
Serial.println(parameters[n]);
delay(50);
}
}
void print_output() {
Serial.println("output:");
for (int n = 0 ; n <= PARAM_AMOUNT - 1; n++) {
Serial.println(parameters[n]);
}
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
}
@Guy . D, 👍0
Обсуждение1 ответ
Лучший ответ:
Не рекомендуется резервировать память для строки с постоянной строкой. Выделите массив массивов символов с помощью:
char parameters[PARAM_AMOUNT][PARAM_LEN];
Теперь с «0» вы выделяете 2 байта для каждой строки. '0' и завершающий 0.
Затем в функции splitter
вы записываете 3 байта в один из параметров со значением «20». При этом выполняется запись за пределами 2 байтов памяти, зарезервированных для строки.
strcpy(parameters[i], pch);
скопирует токен, возвращенный strtok
, в ваш массив. pch
указывает на inputstr
, а разделители в inputstr
заменяются на 'strtok' с нулями
Спасибо. Но когда parameters
не является массивом указателей, он не может получить значение pch
... (Думаю, я все еще здесь новичок :(), @Guy . D
paramaters[i]=pch;
был изменен на sprintf(parameters[i],"%s",pch);
теперь все в порядке, @Guy . D
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
это не ошибка, а странное
n <= PARAM_AMOUNT - 1
. напишитеn <PARAM_AMOUNT
, @JurajСоздайте двумерный массив с достаточным количеством байтов или используйте массив с указателями, чтобы можно было установить указатели на строки по умолчанию. Теперь у вас есть смесь этих двух, и она не очень четко определена. Хотя бы напишите в комментариях, какие максимальные значения (сколько десятичных цифр)., @Jot
@jot - вам пишут не за комментирование, а за каждый параметр в диапазоне [0,100]. только целое число, @Guy . D