Переменная и результат функции

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Есть такая функция для преобразования даты в строку, но работает она один раз. (из-за особенностей сишника)

char* DateTime::format(char* format) {
	char* ret = format;
	for(int i=0;i<strlen(ret)-1;i++){
		if(ret[i] == 'h'){
			ret[i] = '0'+hh/10;
			ret[i+1] = '0'+hh%10;
		}
		if(ret[i] == 'm'){
			ret[i] = '0'+mm/10;
			ret[i+1] = '0'+mm%10;
		}
		if(ret[i] == 's'){
			ret[i] = '0'+ss/10;
			ret[i+1] = '0'+ss%10;
		}
		if(ret[i] == 'D'){
			ret[i] = '0'+d/10;
			ret[i+1] = '0'+d%10;
		}
		if(ret[i] == 'M'){
			ret[i] = '0'+m/10;
			ret[i+1] = '0'+m%10;
		}
		if(ret[i] == 'Y'){
			ret[i] = '0'+yOff/10;
			ret[i+1] = '0'+yOff%10;
		}
	}
	return ret;
}

Как сделать чтобы входная переменная не трогалась(константой чтоль сделать).

ites
Offline
Зарегистрирован: 26.12.2013

NeiroN пишет:

Как сделать чтобы входная переменная не трогалась(константой чтоль сделать).

передать буфер, куда записывать результат.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Пробовал - непомогает.

char buf[] = "hh:mm:ss DD-MM-YY";
    Serial.println(now.format(buf));

 

ites
Offline
Зарегистрирован: 26.12.2013

NeiroN пишет:

Пробовал - непомогает.

char buf[] = "hh:mm:ss DD-MM-YY";
    Serial.println(now.format(buf));

 

Неправильно пробовал. То, что ты написал -- ничего не меняет.

ites
Offline
Зарегистрирован: 26.12.2013

А что за класс DateTime, у которого такая функция форматирования?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Это я допиливаю класс библиотеки RTClib -  как мне нужно и чтобы коду минимум. Вроде получилось.

char* DateTime::format(char* ret){
		for(int i=0;i<strlen(ret)-1;i++){
		if(ret[i] == 'h'){
			ret[i] = '0'+hh/10;
			ret[i+1] = '0'+hh%10;
		}
		if(ret[i] == 'm'){
			ret[i] = '0'+mm/10;
			ret[i+1] = '0'+mm%10;
		}
		if(ret[i] == 's'){
			ret[i] = '0'+ss/10;
			ret[i+1] = '0'+ss%10;
		}
		if(ret[i] == 'D'){
			ret[i] = '0'+d/10;
			ret[i+1] = '0'+d%10;
		}
		if(ret[i] == 'M'){
			ret[i] = '0'+m/10;
			ret[i+1] = '0'+m%10;
		}
		if(ret[i] == 'Y'){
			ret[i] = '0'+yOff/10;
			ret[i+1] = '0'+yOff%10;
		}
	}
	return ret;
}

И использую так

char buf[19];
strncpy(buf,"hh:mm:ss DD/MM/YY",19);
Serial.println(now.format(buf));

Вобщем програмируя на Java, Python, PHP отвыкаешь от языковых мелочей. Да и в гугл не написать сходу правильный запрс. И помогать никто не хочет...

ites
Offline
Зарегистрирован: 26.12.2013

NeiroN пишет:

Это я допиливаю класс библиотеки RTClib -  как мне нужно и чтобы коду минимум. Вроде получилось.

А, ну так неудачно ты дописываешь.

NeiroN пишет:

Вобщем програмируя на Java, Python, PHP отвыкаешь от языковых мелочей. Да и в гугл не написать сходу правильный запрс. И помогать никто не хочет...

Видимо, неправильный набор языков, который не даёт понятия о том, как всё работает "на нижнем уровне". Я так вообще по Perl-у специалист. Основная проблема того, что ты делаешь, в двух вещах: используемый в библиотеках класс String не имеет нормального способа выдать внутреннюю строку в виде обычной си-строки, поэтому его использование часто затруднено, стандартные библиотеки ожидают char*. Отсутствие сборки мусора не позволяет просто создать строку (в смысле char*), вернуть на неё указатель и не заботиться о том, кто это будет потом освобождать -- динамическое создание строк с последующим тобой описанным шаблоном использования отпадает. Остаются варианты: 1) функции форматирования нужно предоставить место, куда она будет сохранять результат форматирования не порча оригинальную строку формата, что немного неудобно с твоим шаблоном использования; 2) функция форматирования может иметь свой собственный статический буфер достаточного размера, в который сохранять результат и возвращать на него ссылку; 3) придумать свой собственный класс String, в котором будет всё учтено и не будет недостатков.

Вариант 2 имеет побочный эффект: вызов функции форматирования должен быть в выражении всегда только один, что часто вполне приемлимо. Так что я бы рекомендовал так и сделать.

Что-то типа:

char* DateTime::format(char* format) {
	static char ret[20];
	strncpy(ret, format, 19);
	char ret[19] = 0;
	for(int i=0;i<strlen(ret)-1;i++){
		if(ret[i] == 'h'){
			ret[i] = '0'+hh/10;
			ret[i+1] = '0'+hh%10;
		}
		if(ret[i] == 'm'){
			ret[i] = '0'+mm/10;
			ret[i+1] = '0'+mm%10;
		}
		if(ret[i] == 's'){
			ret[i] = '0'+ss/10;
			ret[i+1] = '0'+ss%10;
		}
		if(ret[i] == 'D'){
			ret[i] = '0'+d/10;
			ret[i+1] = '0'+d%10;
		}
		if(ret[i] == 'M'){
			ret[i] = '0'+m/10;
			ret[i+1] = '0'+m%10;
		}
		if(ret[i] == 'Y'){
			ret[i] = '0'+yOff/10;
			ret[i+1] = '0'+yOff%10;
		}
	}
	return ret;
}