Передача строки в функцию

sanvd
Offline
Зарегистрирован: 08.09.2017

Подскажите, пожалуйста, почему второй пример работает неправильно

1.

char c[] = "this is a test";
void setup() {
  Serial.begin(9600);
  for (int i = 0; i < sizeof(c) - 1; i++) {
    Serial.print(i, DEC);
    Serial.print(" = ");
    Serial.write(c[i]);
    Serial.println();
  }
}
void loop() {
}

2.

void print(char c[]) {
  for (int i = 0; i < sizeof(c) ; i++)
  {
    Serial.print(i, DEC);
    Serial.print(" = ");
    Serial.write(c[i]);
    Serial.println();
  }
}
void setup() {
  Serial.begin(9600);
  print("this is a test");
}
void loop() {
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Он работает правильно. В точности так, как написан.

Если вопрос "почему он не делает того, чего я от него жду?", то потрудитесь объяснить, а чего именно Вы от него ждёте.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ага, понятно - почитайте про указатели.

sanvd
Offline
Зарегистрирован: 08.09.2017

"Правильно заданный вопрос содержит половину ответа". Имел в виду, почему оба примера не работают одинаково. Так понимаю, нужно смотреть в сторону шаблонов и указателей. А со строками или массивами символов более простого варианта нет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sanvd пишет:

Так понимаю, нужно смотреть в сторону шаблонов и указателей. А со строками или массивами символов более простого варианта нет?

Неправильно понимаете. Смотреть надо в сторону Кернигана и Ритчи. Когда посмотрите, то узнаете, что между строками, массивами символов и указателями разницы не то, чтобы совсем нет, но она там исключительно на уровне "синтаксического сахара" - по гамбургскому счёт это одно и то же.

Поэтому, понимаете, что на Ваш вопрос ответить очень трудно. Варианты есть, но все они одновременно и про строки, и про указатели, и про массивы символов. Как Вы их разделяете, только Вы знаете.

P.S. А начните с того, что <непереводимая игра слов> включите, наконец, в ИДЕ вывод сообщений компилятора, и ЧИТАЙТЕ, что он Вам говорит! Он ведь Вам честно сказал, как именно будет работать второй пример! Только Вы не прочитали.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Женя! Я все-таки отвечу. В рамках исправления кармы, о чем ты начал писать в Отвлеченных. ;))

------------

2ТС:

В функцию передается только указатель на начало массива. Массив в С и С++ не объект, включающий свой размер, тип, блэкджек и дамочек, а лишь указатель на его начало. Если функции нужно знать что-то еще, это нужно явно ей передать.

Поэтому sizeof в твоей функции честно возвращает sizeof(char *), то есть 2.

В некоторых случаях, когда явно известен размер массива, sizeof вернет этот размер. А вот когда - посоветую разобраться самому, почитав правильные книжки.

 

 

sanvd
Offline
Зарегистрирован: 08.09.2017

Спасибо, буду изучать тему.

vlad072
Offline
Зарегистрирован: 01.08.2017

- sizeof() здесь не уместен, используйте strlen().

- аргумент фунrции должен быть указателем на первый символ, т.е. char*