Получение разных значений внутри и снаружи функции при использовании глобального массива

функция 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() {
  // поместите сюда свой основной код для многократного запуска:
}

, 👍0

Обсуждение

это не ошибка, а странное n <= PARAM_AMOUNT - 1. напишите n <PARAM_AMOUNT, @Juraj

Создайте двумерный массив с достаточным количеством байтов или используйте массив с указателями, чтобы можно было установить указатели на строки по умолчанию. Теперь у вас есть смесь этих двух, и она не очень четко определена. Хотя бы напишите в комментариях, какие максимальные значения (сколько десятичных цифр)., @Jot

@jot - вам пишут не за комментирование, а за каждый параметр в диапазоне [0,100]. только целое число, @Guy . D


1 ответ


Лучший ответ:

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