Irinka
20.Декабрь.2022 09:00:14
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[]) {
uint8_t len = sizeof(string) / sizeof(string[0]);
Serial.println(len);//2 байта
}
Нужно передать массив char в функцию.
Массив 9 байт, в функции определяется как 2 байта.
Green
20.Декабрь.2022 09:04:59
3
В функцию ещё и длину передавайте. Либо сами в функции находите длину по ‘\0’ в массиве.
Irinka
20.Декабрь.2022 09:22:52
4
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("");
}
BOOM
20.Декабрь.2022 09:32:47
6
В функцию адрес первого элемента всегда передается.
Irinka:
Что адрес?
Ну, массив же по указателю передается. Соответственно, 2 байта это его адрес. Как уже сказали, функция должна каким то способом узнать размер массива
Irinka
20.Декабрь.2022 09:34:30
8
Ааа, получается что strlen(string) подходит
Green
20.Декабрь.2022 09:36:44
9
void func(char string[]) {
uint8_t i;
for (i = 0; string[i]; i++) {
Serial.print(string[i]);
}
Serial.println();
Serial.println(i);
}
1 лайк
Проще всего срезу передать в функцию вторым аргументом размер.
2 лайка
Irinka
20.Декабрь.2022 09:39:30
11
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 лайка
Irinka
21.Декабрь.2022 09:54:13
15
Получается шаблон в 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) {
}
но это, ведь, не то, чего хотелось.
BOOM
21.Декабрь.2022 10:14:20
20
В функцию передается по адресу массив чаров в количестве 9 элементов, как я понял.