Передача массива char в функцию

Здравствуйте.

void setup() {
  Serial.begin(9600);
  char string[] = "12345678";
  uint8_t len  = sizeof(string) / sizeof(string[0]);
  Serial.println(len);//9 байт
  func(string);
}

void func(char string[]) {
  uint8_t len  = sizeof(string) / sizeof(string[0]);
  Serial.println(len);//2 байта
}

Нужно передать массив char в функцию.
Массив 9 байт, в функции определяется как 2 байта.

Адрес?

В функцию ещё и длину передавайте. Либо сами в функции находите длину по ‘\0’ в массиве.

void setup() {
  Serial.begin(9600);
  char string[] = "12345u678";
  uint8_t len  = sizeof(string) / sizeof(string[0]);
  Serial.println(len);//10 байт

  func(string);
}

void func(char string[]) {
  for (uint8_t i = 0; i < strlen(string); i++) {//9 байт
    Serial.print(string[i]);
  }
  Serial.println("");
}

Что адрес?

В функцию адрес первого элемента всегда передается.

Ну, массив же по указателю передается. Соответственно, 2 байта это его адрес. Как уже сказали, функция должна каким то способом узнать размер массива

Ааа, получается что strlen(string) подходит

void func(char string[]) {
  uint8_t i;
  for (i = 0; string[i]; i++) {
    Serial.print(string[i]);
  }
  Serial.println();
  Serial.println(i);
}

1 лайк

Проще всего срезу передать в функцию вторым аргументом размер.

2 лайка
string[i]

То есть цикл будет выполняться пока в массиве есть байты?

До встречи с терминатором

2 лайка

Отлично. Спасибо.

Если я правильно понял, что Вы хотели сделать, то это делается вот так:

void setup() {
  Serial.begin(9600);
  char string[] = "12345678";
  uint8_t len  = sizeof(string) / sizeof(string[0]);
  Serial.println(len);//9 байт
  func(string);
}

template <typename T>
void func(T & string) {
  uint8_t len  = sizeof(T) / sizeof(string[0]);
  Serial.println(len);// тоже 9 байтов
}

void loop(void) {
}

Здесь может показаться ненужной конструкция / sizeof(string[0]), но это обманчиво, она тут нужна, чтобы попытка вызвать функция с аргументом - “не массивом” вызвала ошибку компиляции.

3 лайка

Получается шаблон в void func(T & string) { указывает на то, что переменная является массивом?
(точнее типом передаваемой переменной)

Ну, шаблон сам по себе не имеет смысла тока не обратишься. А вот при обращении просто вместо T доставляется тип того, с чем обратились. И если функция при этом успешно компилируется, то её и вызывают.

1 лайк

Спасибо.

Кстати, без шаблона можно было бы, если бы длина массива была заранее известна.

Типа, вот так
void setup() {
  Serial.begin(9600);
  char string[] = "12345678";
  uint8_t len  = sizeof(string) / sizeof(string[0]);
  Serial.println(len);//9 байт
  func(string);
}

void func(char (&string) [9]) {
  const uint8_t len  = sizeof(string);
  Serial.println(len);//тоже 9 байта
}

void loop(void) {
}

но это, ведь, не то, чего хотелось.

(&string) [9]

Что это значит?

В функцию передается по адресу массив чаров в количестве 9 элементов, как я понял.