Как правильно работать со строками?

LelSPB
Offline
Зарегистрирован: 13.04.2020

Добрый день, знатоки.

Помогите с таким вопросом, допустим:

int day = 0;

string sDay = " ";

if (day == 7) sDay = "Sunday"; 

при выводе получается числовое значение, а не строка.

Как правильно сделать? Читал что нужно использовать char - но тоже получаю цифры.

Не судите строго за глупый вопрос)))  

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

LelSPB пишет:

Добрый день, знатоки.

Помогите с таким вопросом, допустим:

int day = 0;

string sDay = " ";

if (day == 7) sDay = "Sunday"; 

при выводе получается числовое значение, а не строка.

Как правильно сделать? Читал что нужно использовать char - но тоже получаю цифры.

Не судите строго за глупый вопрос)))  

А где вывод?Скорее всего выводите неправильно.

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

LelSPB пишет:

Не судите строго за глупый вопрос)))  

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

Вы

1. Не потрудились прочитать правила оформления постов и вставили код не полностью и без номеров строк. Как Вам отвечать? Так, как я отвечу ниже ... см.

2. Не потрудились прочитать правила оформления постов и вставили код вручную, а не копипастом, в результате я НЕ ЗНАЮ, что у Вас на самом деле написано в строке № ХЗ: "string sDay = " ";" или всё-таки "String sDay = " ";". Догадаться невозможно, потому, что можно и так, и так, но при этом всё остальное нужно делать по-разному. И как Вы предлагает Вам отвечать? Расписывать оба варианта? Не жирно за Вашу элементарную лень задать вопрос по-человечески?

Попробуйте прочитать правила и спросить нормально (первый пост не редактируется, так что пишите в новом).

P.S. Кстати, о недопустимости вставки кода не полностью, Вам коллега и в посте #1 уже сказал.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Строчка кода "sDay = "Sunday";" почему без фигурных скобок?

sadman41
Offline
Зарегистрирован: 19.10.2016

А я тоже хочу спросить. И про строки и про нестроки. Ваяю я одну библиотечку и в ней нужны бы overload-функции - одна принимает число - ID, другая строку - имя. И компилятор, когда подсовываешь параметром 0, не может определиться - это 0 или '\0'.

Вопрос: как из этой ситуации обычно выворачиваются (если отбросить вариант с принудительным приведением типов)?

void transformStuff(uint8_t _stuffId) {
  Serial.println(_stuffId * 2);
}

void transformStuff(char* _stuffName) {
  Serial.println(_stuffName);
}

void setup() {
  Serial.begin(9600);

  //transformStuff((uint8_t) 0);  // OK
  //transformStuff((char*) 0);    // OK
  transformStuff(0);              // Err: call of overloaded 'transformStuff(int)' is ambiguous
}

void loop() {}

 

b707
Offline
Зарегистрирован: 26.05.2017

раз типы переменных "пересекаются". имхо компилятор никак не сможет определить, какую функцию вызывать. Только приведение

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

Там есть варианты. Например, насколько важно, чтобы id бы именно беззнаковым?

Например, в таком виде, всё работает адекватно. Вызывается именно то, что нужно:

#include <Printing.h>

void transformStuff(int _stuffId) {
	printVar(_stuffId);
}

void transformStuff(char * _stuffName) {
	if (! _stuffName) _stuffName = (char *) "*** NULL pointer ***";
	printVar(_stuffName);
}

void setup() {
	Serial.begin(115200);
	
	transformStuff(0); 			// 0 - это число типа int
	transformStuff(nullptr);	// nullptr - указатель, численно равный 0
}

void loop() {}

Результат

_stuffId=0
_stuffName=*** NULL pointer ***

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Id - байтовый (0...255) и два байта на него я пожалел. Т.е. тут как-бы торг с собой - экономно делать или красиво.  

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

Не понял, да держите Вы его байтовым на здоровье (в структуре или ещё где), параметр функции то чем провинился? Его оставьте int. Когда надо будет в структуру записать - преобразуется в байт, никуда не денется.  Ну или там внутри функции преобразуете - всё же в одном месте, а не при каждом вызове. Проблема то именно с параметром.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если взять байтовый параметр с принудительным кастингом, то с отключенной оптимизацией при компиляции выигрываю 4 байта у варианта с двубайтовым параметром )) 

А если с оптимизацией - то всё едино.

Это так, перфекционизм. В скрижалях написано - не трать байты там, где не надо, я и не трачу. Пытаюсь, во всяком случае.  

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

sadman41 пишет:

я и не трачу

Я тоже, ибо

sadman41 пишет:

с оптимизацией - то всё едино.

Оптимизация - она ровно для этого и нужна, чтобы я писал так, ка удобно мне, а об удобствах процессора заботился оптимизатор.

И, кстати, если та функция ещё и inline, то разговор вообще ни о чём, т.к. реально ничего вообще никуда не передаётся.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, стратегически я к инлайну и стремлюсь, на текущей итерации всё выглядит примерно так:

eventData_t setPage(int _pageId, sendCommandOption_t _commandOption) {
   return sendCommand(_commandOption, fmt_cmd_un, cmd_page, _pageId);
}

eventData_t setPage(const char* _pageName, sendCommandOption_t _commandOption) {
   return sendCommand(_commandOption, fmt_cmd_s, cmd_page, _pageName);
}

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Правильный вопрос в данном случае должен звучать так:"как правильно работать с поисковиками ?".
Обсуждалось , даже на этом форуме уже сотни раз.